scrapy 集成 selenium

Posted kai-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scrapy 集成 selenium相关的知识,希望对你有一定的参考价值。

在爬虫已启动,就打开一个 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 并不是异步的,所以效率会变差。

以上是关于scrapy 集成 selenium的主要内容,如果未能解决你的问题,请参考以下文章

scrapy 集成 selenium

使用scrapy-selenium, chrome-headless抓取动态网页

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器,

彻底搞懂Scrapy的中间件

彻底搞懂Scrapy的中间件

彻底搞懂Scrapy的中间件