利用selenium和phantomjs来实现下拉加载页面的获取

前景:在爬虫中遇到过一些AJAX加载的页面,对于这种页面我们最好的解决办法就是分析他的接口,通过构造接口来请求数据,但有限网站的反爬手段比较严格的话,这个接口是不好分析的。在这里提供一种思路,就是利用硒来自动化操作模拟浏览器来获得页面信息,可以使用Chorme或者phantomjs,Chorme是基于浏览器的,因为这边需要将项目部署到服务器上,所以采用无界面浏览器phantomjs。

1.首先需要编写一个方法来获取想要获取的URL

from selenium import webdriver
import time
import re
from selenium.webdriver import DesiredCapabilities
class Get_Messge_From_Phantomjs(object):
    def __init__(self,url):
        self.url = url
        self.headers =  {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4882.400 QQBrowser/9.7.13059.400',
    }
        self.driver = webdriver.PhantomJS()
        # phantomjs添加请求头
        cap = DesiredCapabilities.PHANTOMJS.copy()
        for key, value in self.headers.items():
            cap['phantomjs.page.customHeaders.{}'.format(key)] = value
        # 不载入图片,爬页面速度会快很多
        cap["phantomjs.page.settings.loadImages"] = False


    def request(self):
        print('开始网页get请求')
        self.driver.get(self.url)
        self.scroll_down(driver=self.driver, times=2)  # 执行网页下拉到底部操作,执行5        # 提取所有文章标签
        self.parse(self.driver.page_source)
    
    def parse(self,content):
        datas = re.findall(r'http://news.mydrivers.com/\d+/\d+/\d+.htm',content)
        print(datas)
    
    def scroll_down(self,driver, times):
        for i in range(times):
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # 执行JavaScript实现网页下拉倒底部
            # 保存截图
             driver.save_screenshot(str(i + 1) + '.png')
            time.sleep(2)
if __name__ == '__main__':
    test = Get_Messge_From_Phantomjs("http://news.mydrivers.com/")
    test.request()
注意:因为现在很多网站已经开始对phantomjs无核浏览器进行了一定的反爬,所以这边需要更改一下phantomjs的请求头这段代码是针对当前的网站的,想要获取其他下拉加载网站只需要将url替换以及更改其提取规则,这边我只是简单的用正则提取了文章的url。如果需要文章里更详细的内容,可以将爬下来的很多url放到redis队列里,然后利用scrapy框架和redis对接,实现高效的对文章详情内容的提取。


猜你喜欢

转载自blog.csdn.net/wudajiang_/article/details/80911289