Pyspider框架爬取旅游攻略

非常高兴的是.....这个更新还在继续,不过我觉得关于Python爬虫实战的部分快要结束了。一来是这本书上面的实例快要做完了,虽然发出来的只有短短几篇,但是还有很多比较短小的。二来就是因为都是书上的现成实例,包括网络上也有很多一模一样的,就很没有什么挑战性,虽然在这个实践过程中也会碰到一些大的小的问题。这本书看完了之后,再另找一个网站来爬。另外这个爬虫还能爬手机APP,但是配套的环境还没有完全搭好。

在使用pyspider之前,来看看关于它的介绍:

这个在GitHub上面关于pyspider的介绍(本来是打算用百度百科的,但是发现竟然没有相关词条.....),支持的Python版本有2.6,7和3.3到3.6,不知道是页面描述没有更新还是其他原因,pyspider并没有支持最新的3.7版本,所以出于保险的考虑,我将Python从3.7降到了3.6.2 64位。

关于pyspider的架构部分,这里非常简单的用了3个部分来区别,分别是Scheduler、Fetcher和Processer。第一个发起任务的调度,第二个负责将页面的内容抓取下来,最后一个负责将特定的数据内容解析出来,将新生成request重新发给Schedule,将生成的结果输出保存。

在进行设计之前我们确保要安装并配置好了以下软件:

1. pyspider

2. PhantomJS

3. MongoDB

4. PyMongo库

这其中除了第一个pyspider,其他的在之前的项目中已经用过了,不需要重新配置,现在来看看如何安装pyspider。

从理论上来讲,我们可以在cmd中直接使用命令行:

pip3 install pyspider

这是官方示例中所推荐的方法,但是在Windows系统下(并没有钱换Mac),这种命令似乎不太奏效,它自动下载的文件格式我看着是tar的压缩包,最后并没有成功。在这种情况下,可以尝试使用whl来安装。在此地址中下载安装包,记得选自己对应的Python版本:

http://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl

比如我这里是Python 3.6.2 的版本,我就选

下载完成后,打开cmd,进到whl所在的目录下。使用命令:

pip3 install pycurl-7.43.1-cp36-cp36m-win_amd64.whl

之后应该就安装成功了,如果没有请再试一次用pip装pyspider。安装完成后,我们在命令行输入

pyspider all

此时控制台应该有如下的输出:

接着打开Chrome,在地址栏输入 “localhost:5000”,应该可以看到如下页面:

上面显示的是当前通过pyspider管理的项目。点击右侧的create按钮创建一个新的项目,在弹出的窗口中输入项目的名称,和想要爬取的内容链接:

接着点击create后进入到下一步,应该可以看到pyspider的界面了,在这个界面中,左侧是预览区包括一些返回的json信息,在右侧就是代码编辑区。

在默认情况下pyspider会自动生成一个框架代码出来。

先不管这个代码部分,来看到预览区的右上角有一个run 按钮,点击之后,会看到右下角的follows出现了一个数字1。

点开follows就可以看到当前生成的爬取的请求链接,链接的右侧还有一个箭头按钮,点击按钮就可以对这个链接进行爬取。右下角的html 和 web 分别为页面的HTML代码和渲染之后的页面样式。

点击HTML可以看到,页面源码:

点击web可以看到渲染之后的页面:

没有错,可以看到一个非常坑爹的事情发生了!!!

这个渲染页面只有这么狭小的一撮!!!而且不能拉长!!!

我踏马当时做到这里都蒙了好吗!!!

更坑爹的是什么呢!!!

之前我用的Chrome 67,然后前几天升级到了69。

我发现!!渲染页面更窄了!!!

然而本着学习的心态我还是忍着性子做了。

可以看到右下角,的follow按键的右上角有近两百个链接。这应该是将页面中所有的链接全部都爬取了一遍。我们只需要将攻略的部分爬了就可以了,所以接下来就是要来看看攻略部分的id或者class是什么,有什么特点,再用CSS选择器标识出来。那么这里pyspider就有一个非常快捷的功能。点击selector helper:

再点击页面中的攻略的部分,就可以看见右上角出现了自动生成的CSS选择项,再将页面中的位置替换掉,如图所示:

最后再点击一次run,就可以。。。。

卧槽!!!

web渲染页面竟然正常显示了!!!!

这是什么鬼!!!!

好吧,我也不知道这是怎么回事,毕竟这个国人写的框架实在是不好说什么。。。

这样就显示了10条攻略,这是因为这个页面就只有10条攻略,需要继续抓取后面的内容,利用crawl()方法来添加下一页的爬取请求。只需要在index_page()方法里继续添加:

然后......

靠。。。。web渲染页面又变回去了。。。

好心累。。。不过至少可以看到多了一条,这表示成功的添加了下一页的爬取请求。

前10个中随意选取一个爬取内容。

可以发现,并没有出现图片的内容,这是因为还需要在crawl方法中加入一个fetch_type参数:

接着需要一个解析的方法,如下:

其实也就是改写了。

这里的CSS选择器,还需要仔细研究研究。部署好了之后,开始启动爬虫就可以了。

然后就能开始运行了。点击results应该就能看见爬取的结果了,右上角可以下载成想要的文件格式:

这里有点尴尬,第二次做的时候,这里的IP地址被怀疑是爬虫了,所以加了验证码。而我没空加验证码校验的情况了,所以这里用了第一次的结果,如果没有什么问题的话,应该做的都是一样的。

这样一来去哪儿网的攻略爬取就做完了,这个框架。。。怎么说呢,就是觉得可视化的使用有点不太可靠,没有随心所欲的那种感觉,但是又确实是使用比较简单。这就见仁见智了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180910G0IBTY00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券