在爬虫已启动,就打开一个 chrom 浏览器,以后都用这一个浏览器来爬数据

1 在爬虫中创建 bro 对象

bro = webdriver.Chrome(executable_path='/Users/liuqingzheng/Desktop/crawl/cnblogs_crawl/cnblogs_crawl/chromedriver')

在 middlewares.py 中定义一个 class:

from selenium.common.exceptions import TimeoutException
from scrapy.http import HtmlResponse  #传递js加载后的源代码,不会返回给download
class JSPageMiddleware(object):
    #通过chrome请求动态网页
    def process_request(self, request, spider):
        if spider.name == "JobBole":
            try:
                spider.browser.get(request.url)
            except TimeoutException:
                print('30秒timeout之后,直接结束本页面')
                spider.browser.execute_script('window.stop()')
            import time
            time.sleep(3)
            print("访问:{0}".format(request.url))

            return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)
            '''编码默认是unicode'''

spider中的代码:

下载中间件使用

name = "JobBole"
    allowed_domains = ["jobbole.com"]
    start_urls = ['http://blog.jobbole.com/all-posts/']

    def __init__(self):
        '''chrome放在spider中,防止每打开一个url就跳出一个chrome'''
        self.browser=webdriver.Chrome(executable_path='E:/chromedriver.exe')
        self.browser.set_page_load_timeout(30)
        super(JobboleSpider, self).__init__()
        dispatcher.connect(self.spider_close,signals.spider_closed)

    def spider_close(self,spider):
        #当爬虫退出的时候关闭Chrome
        print("spider closed")
        self.browser.quit()

把 selenium 集成到 scrapy 中主要改变的就是这两处地方

以上的在 scrapy 中嵌入 selenium 的 chrome 并不是异步的,所以效率会变差。

 posted on 2020-04-12 19:43  Rannie`  阅读(310)  评论(0编辑  收藏  举报
去除动画
找回动画