崔庆才python3爬虫-13章 Scrapy框架的使用-Spider对接Selenium
1 | Scrapy抓 取 页 面 的 方 式 和 requests库类似,都 是 直 接 模 拟 H T T P 请 求 ,而 Scrapy也不能抓取 |
准备工作
1 | 本节我们来看看Scrapy框架如何对接S elenium ,以 PhantomJS进行演示。我们依然抓取淘宝商品信息,抓取逻辑和前文中用Selenium抓取淘宝商品完全相同。 |
新建项目
1 | 首先新建项目,名为 scrapyseleniumtest,命令如下所示: |
定义Item
1 | 首 先 定 义 Item 对象,名 为 P ro d u ctitem ,代码如下所示: |
1 | 这里我们定义了6个Field,也就是6个字段,跟之前的案例完全相同。然后定义了一个collection属性,即此Item保存的MongoDB的Collection名称。 |
Spider
1 | 初步实现Spider•的 start_requests()方 法 ,如下所示: |
1 | 首先定义了一个base_url,即商品列表的URL,其后拼接一个搜索关键字就是该关键字在淘宝的搜索结果商品列表页面。 |
对接Selenium
1 | 接下来我们需要处理这些请求的抓取。这次我们对接Selenium进行抓取,采用 Downloader |
1 | from selenium import webdriver |
1 | 首先我们在_init_()里对一些对象进行初始化,包括PhantomJS、WebDriverWait等对象,同时设置页面大小和页面加载超时时间。 |
1 | 我们需要回顾一下Downloader Middleware的 process_request()方法的处理逻辑,内容如下所示: |
1 | 到现在, 我们应该能了解Downloader Middleware实现Selenium对接的原理了。 |
解析页面
1 | Response对象就会回传给Spider内的回调函数进行解析。所以下一步我们就实现其回调函数,对网页来进行解析,代码如下所示: |
存储结果
1 | 最后我们实现一个Item Pipeline, 将结果保存到MongoDB, 如下所示: |
1 | 此实现和前文中存储到M ongoD B 的方法完全一致,原理不再赘述。记 得 在 settings.py中开启它 |
运行
1 | 整个项目就完成了,执行如下命令启动抓取即可: |
总结
1 | 我们通过实现Downloader Middleware的方式实现了Selenium的对接。但这种方法其实是阻塞式的,也就是说这样就破坏了Scrapy异步处理的逻辑,速度会受到影响。为了不破坏其异步加载逻辑,我们可以使用Splash实现。下一节我们再来看看Scrapy对接Splash的方式。 |
没有伞的孩子,必须努力奔跑!
Typewriter Mode** 已开启。
可以在视图菜单中关闭
不再显示关闭