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)