引言
Scrapy 抓取页面的方式和 Requests 类库是一样的,都是直接模拟 HTTP 请求,对于由 JavaScript 动态渲染的页面就有些显得无能为力了。
我们前面抓取由 JavaScript 动态渲染的页面是使用 Selenium 对接浏览器进行页面抓取,当然,在 Scrapy 中同样也可以对接 Selenium 。
通过这种方案,我们无需关心一个页面加载是发送的请求,也无需关注页面的渲染过程,直接抓取最终结果就行,真正做到了可见即可抓。
示例
小目标
首先定一个小目标,前面的文章我们通过 Selenium 抓取了某东的商品信息,本篇我们依然使用这个站点,感谢某东为我们提供的素材。
准备
请各位同学确认自己本地已经正确安装 Scrapy 、 Selenium 以及 Selenium 所需要使用的一些驱动库,如果尚未安装的同学可以翻翻前面的文章。
新建项目
本篇内容还是新建一个新的 Scrapy 项目,并且命名为 scrapy_selenium_demo ,命令如下:
scrapy startproject scrapy_selenium_demo
记得找一个自己喜欢的目录,最好是纯英文目录。
然后新建一个 Spider ,命令如下:
scrapy genspider jd www.jd.com
记得顺手修改下 settings.py 中的配置,将 robots.txt 设置为 False ,否则我们无法抓取到相关的商品数据,因为在机器人协议中某东并不允许抓取商品数据,修改如下:
ROBOTSTXT_OBEY = False
定义数据结构
第一步还是我们将要抓取的数据结构定义到 Item ,代码如下:
import scrapy
class ProductItem(scrapy.Item):
collection = 'products'
image = scrapy.Field()
price = scrapy.Field()
name = scrapy.Field()
commit = scrapy.Field()
shop = scrapy.Field()
icons = scrapy.Field()
这里我们定义了 6 个字段,和之前的示例完全相同,然后定一个了 collection &#