Scrapy_selenium

Scrapy抓取页面的方式和请求库类似,都是直接模拟HTTP请求,而Scrapy也不能抓取的JavaScript动态渲染的页面。在前文中抓取的JavaScript渲染的页面有两种方式。一种是分析的Ajax请求,找到其对应的接口抓取,Scrapy同样可以用此种方式抓取。另一种是直接用selenium模拟浏览器进行抓取,我们不需要关心页面后台发生的请求,也不需要分析渲染过程,只需要关心页面最终结果即可,可见即可爬。那么,如果Scrapy可以对接selenium,那Scrapy就可以处理任何网站的抓取了。

再来复习下scrapy运行流程图

看到运行流程就清楚了,我们要操作的就是第4第5部(middlewares.py中的DownloaderMiddleware)

from selenium import webdriver
from scrapy.http import HtmlResponse    
def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called
        request_header = spider.settings['MY_USER_AGENT']
        currentHEADER = random.choice(request_header)
        request.headers["User-Agent"] = currentHEADER
        if request.url=="http://lol.qq.com/web201310/info-heros.shtml#Navi":
            browser=webdriver.Chrome()
            browser.get(request.url)
            # 这里返回了response,下面的process_response就不会被执行了,直接返回给spider进行解析
            #因此不用管process_response
            return HtmlResponse(url=request.url,body=browser.page_source,request=request,encoding='utf-8',status=200)

猜你喜欢

转载自blog.csdn.net/rookie_is_me/article/details/88537548