scrapy集成selenium后即可在scrapy每次请求url时打开chrome浏览器,对于一些js加载的页面有很好的抓取效果下面介绍scarpy集成selenium的方法
1.建立JSPageMiddleawre中间件
在middlewares文件下
#首先导入webdirver和HtmlResponse方法
from selenium import webdriver
from scrapy.http import HtmlResponse
class JSPageMiddleawre(object):
def __init__(self):
self.browser = webdriver.Chrome(executable_path="C:/Program Files (x86)/Google/Chrome/Application/chromedriver.exe")
super(JSPageMiddleawre,self).__init__()
#通过chorme请求动态网页
def process_request(self, request, spider):
#这里的XXXX即为我们的爬虫名,对不同的爬虫进行动态的修改
if spider.name == "XXXX":
self.browser.get(request.url)
import time
time.sleep(3)
print('访问:{0}'.format(request.url))
#这里直接retrun HtmlResponse的原因是我们已经通过模拟浏览器的方式访问过一遍网站了 不需要再次进入downloader下载一次所以直接return就好了
return HtmlResponse(url=self.browser.current_url,body=self.browser.page_source,encoding='utf-8')
2.使用信号量的方式修改spider文件
在start_url之后,parse函数之前我们需要如下定义
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals
def __init__(self):
self.browser = webdriver.Chrome(executable_path="C:/Program Files (x86)/Google/Chrome/Application/chromedriver.exe")
super(JobboleSpider,self).__init__()
dispatcher.connect(self.spider_closed,signals.spider_closed)
def spider_closed(self,spider):
#当爬虫结束时候退出browser
print("spider spider_closed")
self.browser.quit()
3.最后不要忘记在settings中配置我们的中间件
DOWNLOADER_MIDDLEWARES = {
'XXXX_crawl.middlewares.JSPageMiddleawre': 1,
}
好了以上都配置好 我们就可以在用scrapy中集成selenium更好的搞定js加载的网站了