在middlewares.py中定义一个class:
1 from selenium.common.exceptions import TimeoutException 2 from scrapy.http import HtmlResponse #传递js加载后的源代码,不会返回给download 3 class JSPageMiddleware(object): 4 #通过chrome请求动态网页 5 def process_request(self, request, spider): 6 if spider.name == "JobBole": 7 try: 8 spider.browser.get(request.url) 9 except TimeoutException: 10 print('30秒timeout之后,直接结束本页面') 11 spider.browser.execute_script('window.stop()') 12 import time 13 time.sleep(3) 14 print("访问:{0}".format(request.url)) 15 16 return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request) 17 '''编码默认是unicode'''
spider中的代码:
1 name = "JobBole" 2 allowed_domains = ["jobbole.com"] 3 start_urls = ['http://blog.jobbole.com/all-posts/'] 4 5 def __init__(self): 6 '''chrome放在spider中,防止每打开一个url就跳出一个chrome''' 7 self.browser=webdriver.Chrome(executable_path='E:/chromedriver.exe') 8 self.browser.set_page_load_timeout(30) 9 super(JobboleSpider, self).__init__() 10 dispatcher.connect(self.spider_close,signals.spider_closed) 11 12 def spider_close(self,spider): 13 #当爬虫退出的时候关闭Chrome 14 print("spider closed") 15 self.browser.quit()
把selenium集成到scrapy中主要改变的就是这两处地方。
以上的在scrapy中嵌入selenium的chrome并不是异步的,所以效率会变差。
这里都是部分代码,完整代码链接:https://github.com/pujinxiao/jobbole_spider
转至http://www.cnblogs.com/jinxiao-pu/p/6815845.html