如何使用Scrapy和Selenium结合实现动态网站数据的爬取示例?
- 内容介绍
- 文章标签
- 相关推荐
本文共计619个文字,预计阅读时间需要3分钟。
Scrapy框架仅能爬取静态网站。若需爬取动态网站,需结合selenium进行js的渲染,才能获取到动态加载的数据。如何通过selenium请求url,而不再通过下载器Downloader去请求这个url的方法是:
scrapy框架只能爬取静态网站。如需爬取动态网站,需要结合着selenium进行js的渲染,才能获取到动态加载的数据。
如何通过selenium请求url,而不再通过下载器Downloader去请求这个url?
方法:在request对象通过中间件的时候,在中间件内部开始使用selenium去请求url,并且会得到url对应的源码,然后再将 源 代码通过response对象返回,直接交给process_response()进行处理,再交给引擎。过程中相当于后续中间件的process_request()以及Downloader都跳过了。
相关的配置:
1、scrapy环境中安装selenium:pip install selenium
2、确保python环境中有phantomJS(无头浏览器)
对于selenium的主要操作是下载中间件部分如下图:
代码如下
middlewares.py代码:
注意:自定义下载中间件,采用selenium的方式!!
# -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in: # doc.scrapy.org/en/latest/topics/spider-middleware.html from scrapy import signals from selenium import webdriver from selenium.webdriver import FirefoxOptions from scrapy.s.taobao.com/search?q=%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306'] def __init__(self): # 在初始化淘宝对象时,创建driver super(TaobaoSpider, self).__init__(name='taobao') option = FirefoxOptions() option.headless = True self.driver = webdriver.Firefox(options=option) def parse(self, response): """ 提取列表页的商品标题和价格 :param response: :return: """ info_divs = response.xpath('//div[@class="info-cont"]') print(len(info_divs)) for div in info_divs: title = div.xpath('.//a[@class="product-title"]/@title').extract_first('') price = div.xpath('.//span[contains(@class, "g_price")]/strong/text()').extract_first('') print(title, price)
settings.py代码如下图:
关于代码中提到的初始化driver的位置有以下两种情况:
1、只存在一个爬虫文件的话,driver初始化函数可以定义在middlewares.py的自定义中间件中(如上述代码注释初始化部分)也可以在爬虫文件中自定义(如上述代码在爬虫文件中初始化)。
注意:如果只有一个爬虫文件就不需要在自定义的process_requsests中判断是哪一个爬虫项目然后分别请求!
2、如果存在两个或两个以上爬虫项目(如下图项目结构)的时候,需要将driver的初始化函数定义在各自的爬虫项目文件下(如上述代码),同时需要在process_requsests判断是那个爬虫项目的请求!!
到此这篇关于scrapy与selenium结合爬取数据的示例代码的文章就介绍到这了,更多相关scrapy selenium爬取数据内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!
本文共计619个文字,预计阅读时间需要3分钟。
Scrapy框架仅能爬取静态网站。若需爬取动态网站,需结合selenium进行js的渲染,才能获取到动态加载的数据。如何通过selenium请求url,而不再通过下载器Downloader去请求这个url的方法是:
scrapy框架只能爬取静态网站。如需爬取动态网站,需要结合着selenium进行js的渲染,才能获取到动态加载的数据。
如何通过selenium请求url,而不再通过下载器Downloader去请求这个url?
方法:在request对象通过中间件的时候,在中间件内部开始使用selenium去请求url,并且会得到url对应的源码,然后再将 源 代码通过response对象返回,直接交给process_response()进行处理,再交给引擎。过程中相当于后续中间件的process_request()以及Downloader都跳过了。
相关的配置:
1、scrapy环境中安装selenium:pip install selenium
2、确保python环境中有phantomJS(无头浏览器)
对于selenium的主要操作是下载中间件部分如下图:
代码如下
middlewares.py代码:
注意:自定义下载中间件,采用selenium的方式!!
# -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in: # doc.scrapy.org/en/latest/topics/spider-middleware.html from scrapy import signals from selenium import webdriver from selenium.webdriver import FirefoxOptions from scrapy.s.taobao.com/search?q=%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306'] def __init__(self): # 在初始化淘宝对象时,创建driver super(TaobaoSpider, self).__init__(name='taobao') option = FirefoxOptions() option.headless = True self.driver = webdriver.Firefox(options=option) def parse(self, response): """ 提取列表页的商品标题和价格 :param response: :return: """ info_divs = response.xpath('//div[@class="info-cont"]') print(len(info_divs)) for div in info_divs: title = div.xpath('.//a[@class="product-title"]/@title').extract_first('') price = div.xpath('.//span[contains(@class, "g_price")]/strong/text()').extract_first('') print(title, price)
settings.py代码如下图:
关于代码中提到的初始化driver的位置有以下两种情况:
1、只存在一个爬虫文件的话,driver初始化函数可以定义在middlewares.py的自定义中间件中(如上述代码注释初始化部分)也可以在爬虫文件中自定义(如上述代码在爬虫文件中初始化)。
注意:如果只有一个爬虫文件就不需要在自定义的process_requsests中判断是哪一个爬虫项目然后分别请求!
2、如果存在两个或两个以上爬虫项目(如下图项目结构)的时候,需要将driver的初始化函数定义在各自的爬虫项目文件下(如上述代码),同时需要在process_requsests判断是那个爬虫项目的请求!!
到此这篇关于scrapy与selenium结合爬取数据的示例代码的文章就介绍到这了,更多相关scrapy selenium爬取数据内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

