Python爬虫进阶四之PySpider的用法

审时度势

PySpider 是一个我我的认为很是方便而且功能强大的爬虫框架,支持多线程爬取、JS动态解析,提供了可操做界面、出错重试、定时爬取等等的功能,使用很是人性化。css

本篇内容经过跟我作一个好玩的 PySpider 项目,来理解 PySpider 的运行流程。html

招兵买马

具体的安装过程请查看本节讲述python

安装git

嗯,安装好了以后就与我大干一番吧。github

鸿鹄之志

我以前写过的一篇文章web

抓取淘宝MM照片json

因为网页改版,爬取过程当中须要的 URL 须要 JS 动态解析生成,因此以前用的 urllib2 不能继续使用了,在这里咱们利用 PySpider 从新实现一下。数组

因此如今咱们须要作的是抓取淘宝MM的我的信息和图片存储到本地。浏览器

审时度势

爬取目标网站:https://mm.taobao.com/json/request_top_list.htm?page=1,你们打开以后能够看到许多淘宝MM的列表。多线程

列表有多少?

https://mm.taobao.com/json/request_top_list.htm?page=10000,第10000页都有,看你想要多少。我什么也不知道。

随机点击一位 MM 的姓名,能够看到她的基本资料。

QQ20160326-4@2x

能够看到图中有一个个性域名,咱们复制到浏览器打开。mm.taobao.com/tyy6160

QQ20160326-5@2x

 

嗯,往下拖,海量的 MM 图片都在这里了,怎么办你懂得,咱们要把她们的照片和我的信息都存下来。

P.S. 注意图中进度条!你猜有多少图片~

利剑出鞘

安装成功以后,跟我一步步地完成一个网站的抓取,你就会明白 PySpider 的基本用法了。

命令行下执行

这句命令的意思是,运行 pyspider 并 启动它的全部组件。

E6632A0A-9067-4B97-93A2-5DEF23FB4CD8

 

能够发现程序已经正常启动,并在 5000 这个端口运行。

一触即发

接下来在浏览器中输入 http://localhost:5000,能够看到 PySpider 的主界面,点击右下角的 Create,命名为 taobaomm,固然名称你能够随意取,继续点击 Create。

QQ20160325-0@2x

这样咱们会进入到一个爬取操做的页面。

QQ20160325-1@2x

整个页面分为两栏,左边是爬取页面预览区域,右边是代码编写区域。下面对区块进行说明:

左侧绿色区域:这个请求对应的 JSON 变量,在 PySpider 中,其实每一个请求都有与之对应的 JSON 变量,包括回调函数,方法名,请求连接,请求数据等等。

绿色区域右上角Run:点击右上角的 run 按钮,就会执行这个请求,能够在左边的白色区域出现请求的结果。

左侧 enable css selector helper: 抓取页面以后,点击此按钮,能够方便地获取页面中某个元素的 CSS 选择器。

左侧 web: 即抓取的页面的实时预览图。

左侧 html: 抓取页面的 HTML 代码。

左侧 follows: 若是当前抓取方法中又新建了爬取请求,那么接下来的请求就会出如今 follows 里。

左侧 messages: 爬取过程当中输出的一些信息。

右侧代码区域: 你能够在右侧区域书写代码,并点击右上角的 Save 按钮保存。

右侧 WebDAV Mode: 打开调试模式,左侧最大化,便于观察调试。

乘胜追击

依然是上一节的那个网址,https://mm.taobao.com/json/request_top_list.htm?page=1,其中 page 参数表明页码。因此咱们暂时抓取前 30 页。页码到最后能够随意调整。

首先咱们定义基地址,而后定义爬取的页码和总页码。

点击 save 保存代码,而后点击左边的 run,运行代码。

QQ20160325-2@2x

运行后咱们会发现 follows 出现了 30 这个数字,说明咱们接下来有 30 个新请求,点击可查看全部爬取列表。另外控制台也有输出,将全部要爬取的 URL 打印了出来。

而后咱们点击左侧任意一个绿色箭头,能够继续爬取这个页面。例如点击第一个 URL,来爬取这个 URL

QQ20160325-3@2x

点击以后,再查看下方的 web 页面,能够预览实时页面,这个页面被咱们爬取了下来,而且回调到 index_page 函数来处理,目前 index_page 函数咱们尚未处理,因此是继续构件了全部的连接请求。

QQ20160325-4@2x

好,接下来咱们怎么办?固然是进入到 MM 到我的页面去爬取了。

如火如荼

爬取到了 MM 的列表,接下来就要进入到 MM 详情页了,修改 index_page 方法。

其中 response 就是刚才爬取的列表页,response 其实就至关于列表页的 html 代码,利用 doc 函数,实际上是调用了 PyQuery,用 CSS 选择器获得每个MM的连接,而后从新发起新的请求。

好比,咱们这里拿到的 each.attr.href 多是 mm.taobao.com/self/model_card.htm?user_id=687471686,在这里继续调用了 crawl 方法,表明继续抓取这个连接的详情。

而后回调函数就是 detail_page,爬取的结果会做为 response 变量传过去。detail_page 接到这个变量继续下面的分析。

QQ20160325-7@2x

好,咱们继续点击 run 按钮,开始下一个页面的爬取。获得的结果是这样的。

QQ20160325-5@2x

哦,有些页面没有加载出来,这是为何?

在以前的文章说过,这个页面比较特殊,右边的页面使用 JS 渲染生成的,而普通的抓取是不能获得 JS 渲染后的页面的,这可麻烦了。

然而,幸运的是,PySpider 提供了动态解析 JS 的机制。

友情提示:可能有的小伙伴不知道 PhantomJS,能够参考

爬虫JS动态解析

由于咱们在前面装好了 PhantomJS,因此,这时候就轮到它来出场了。在最开始运行 PySpider 的时候,使用了pyspider all命令,这个命令是把 PySpider 全部的组件启动起来,其中也包括 PhantomJS。

因此咱们代码怎么改呢?很简单。

只是简单地加了一个 fetch_type=’js’,点击绿色的返回箭头,从新运行一下。

能够发现,页面已经被咱们成功加载出来了,简直不能更帅!

QQ20160325-9@2x

看下面的个性域名,全部咱们须要的 MM 图片都在那里面了,因此咱们须要继续抓取这个页面。

胜利在望

好,继续修改 detail_page 方法,而后增长一个 domain_page 方法,用来处理每一个 MM 的个性域名。

好,继续从新 run,预览一下页面,终于,咱们看到了 MM 的全部图片。

QQ20160326-0@2x

嗯,你懂得!

只欠东风

好,照片都有了,那么咱们就偷偷地下载下来吧~

完善 domain_page 代码,实现保存简介和遍历保存图片的方法。

在这里,PySpider 有一个特色,全部的 request 都会保存到一个队列中,并具备去重和自动重试机制。因此,咱们最好的解决方法是,把每张图片的请求都写成一个 request,而后成功后用文件写入便可,这样会避免图片加载不全的问题。

曾经在以前文章写过图片下载和文件夹建立的过程,在这里就很少赘述原理了,直接上写好的工具类,后面会有完整代码。

这里面包含了四个方法。

mkDir:建立文件夹,用来建立 MM 名字对应的文件夹。

saveBrief: 保存简介,保存 MM 的文字简介。

saveImg: 传入图片二进制流以及保存路径,存储图片。

getExtension: 得到连接的后缀名,经过图片 URL 得到。

而后在 domain_page 中具体实现以下

以上方法首先获取了页面的全部文字,而后调用了 saveBrief 方法存储简介。

而后遍历了 MM 全部的图片,并经过连接获取后缀名,和 MM 的姓名以及自增计数组合成一个新的文件名,调用 saveImg 方法保存图片。

炉火纯青

好,基本的东西都写好了。

接下来。继续完善一下代码。初版本完成。

版本一功能:按照淘宝MM姓名分文件夹,存储MM的 txt 文本简介以及全部美图至本地。

可配置项:

  • PAGE_START: 列表开始页码
  • PAGE_END: 列表结束页码
  • DIR_PATH: 资源保存路径

 

粘贴到你的 PySpider 中运行吧~

其中有一些知识点,我会在后面做详细的用法总结。你们能够先体会一下代码。

QQ20160326-1@2x

保存以后,点击下方的 run,你会发现,海量的 MM 图片已经涌入你的电脑啦~

QQ20160326-2@2xQQ20160326-3@2x

 

须要解释?须要我也不解释!

项目代码

 

TaobaoMM – GitHub

尚方宝剑

若是想了解 PySpider 的更多内容,能够查看官方文档。

官方文档

转载:静觅 » Python爬虫进阶四之PySpider的用法

相关文章
相关标签/搜索