实战4:pyspider的安装使用

1、pyspider的安装

pip3 install pyspider

安装报错:

安装pyspider报错

此时需要安装pycurl库,在以下地址下载:https://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl

找到相应的版本,我的电脑为win10 64位,python版本位为3.7.4,故下载下图中的版本:

下载pycurl

先使用pip安装pucurl

pip3 install C:\Users\songzhhb\Downloads\pycurl-7.43.0.3-cp37-cp37m-win_amd64.whl

安装截图:

安装pycurl库成功

再安装pyspider,pip3 install pyspider

安装pyspider
安装pyspider成功

2、安装PhantomJS

下载地址:https://phantomjs.org/download.html,下载压缩包解压后把bin目录地址配置到环境变量path中,配配好之后执行以下命令验证是否正确

验证phantomjs

3、安装MongoDB

下载地址:https://www.mongodb.com/download-center/community

下载选择custom安装,选择安装路劲,不勾选安装compass

不安装compass

4、安装pymongo

pip3 install pymongo

安装pymongo

5、启动pyspider

pyspider all

启动过程中报错:

启动报错

该错误是由于Python 3.5中引入了async和await,它们在Python 3.7中成为关键字,所以需要替换一下关键字。

注意要匹配大小写

1、D:\Program Files\Python37\Lib\site-packages\pyspider\run.py文件async替换为async1

2、D:\Program Files\Python37\Lib\site-packages\pyspider\fetcher\tornado_fetcher.py文件async替换为async1

3、D:\Program Files\Python37\Lib\site-packages\pyspider\webui\app.py文件async替换为async1

再次运行依然报错,不过错误信息不一致:

出错信息

这是WsgiDAV发布了版本 pre-release 3.x导致的,所以只要把版本降下来就好了。将wsgidav替换为2.4.1

python -m pip install wsgidav==2.4.1

运行结果如下:

运行结果

再次尝试运行pyspider all:

运行成功:

运行成功的命令行

运行成功后的界面:

运行成功后的验证界面

6、创建项目

创建项目:

创建项目

调试界面:

调试界面

7、爬取首页

点击右上角run,页面下方follows出现一个标注,其中包含数字1,代表有新的爬取请求产生:

点击run

点击follows,再点击右箭头运行报错:

运行报错

错误原因:这个错误会发生在请求 https 开头的网址,SSL 验证错误,证书有误。

解决方法:使用 self.crawl(url, callback=self.index_page, validate_cert=False)

这个方法基本可以解决问题了。

解决SSL报错问题

我们刚才在 index_page() 方法中提取了所有的链接并生成了新的爬取请求。但是很明显要爬取的肯定不是所有链接,只需要攻略详情的页面链接就够了,所以我们要修改一下当前 index_page() 里提取链接时的 CSS 选择器。

选择标题CSS 

选中要替换的代码部分,点击向右的箭头:

替换CSS选择器

点击run,follows变为10:

运行run

我们现在抓取的只是第一页的内容,还需要抓取后续页面,所以还需要一个爬取链接,即爬取下一页的攻略列表页面。我们再利用 crawl() 方法添加下一页的爬取请求,在 index_page() 方法里面添加如下代码,然后点击 save() 保存。

next = response.doc('.next').attr.href

self.crawl(next, callback=self.index_page)

添加代码:

添加代码

重新点击 run 按钮,这时就可以看到 11 个爬取请求。follows 按钮上会显示 11,这就代表我们成功添加了下一页的爬取请求。

爬取下一页

现在,索引列表页面的解析过程我们就完成了。

8、爬取详情页

任意选取一个详情页进入,点击前 10 个爬取请求的任意一个的右箭头,执行详情页的爬取。

爬取详情页

再次报错SSL证书错误:

再次报错

修改代码:

for each in response.doc('li > .tit > a').items():

    self.crawl(each.attr.href, callback=self.detail_page, validate_cert=False)

next = response.doc('.next').attr.href

self.crawl(next, callback=self.index_page, validate_cert=False)

修改截图:

修改截图

切换到 Web 页面预览效果,页面下拉之后,头图正文中的一些图片一直显示加载中。

图片一直在加载

查看源码,我们没有看到 img 节点。

出现此现象的原因是 pyspider 默认发送 HTTP 请求,请求的 HTML 文档本身就不包含 img 节点。但是在浏览器中我们看到了图片,这是因为这张图片是后期经过 JavaScrpit 出现的。那么,我们该如何获取呢?

幸运的是,pyspider 内部对接了 PhatomJS,那么我们只需要修改一个参数即可。

我们将 index_page() 中生成抓取详情页的请求方法添加一个参数 fetch_type,改写的 index_page() 变为如下内容:

def index_page(self, response):

        for each in response.doc('li > .tit > a').items():

            self.crawl(each.attr.href, callback=self.detail_page, validate_cert=False, fetch_type='js')

        next = response.doc('.next').attr.href

        self.crawl(next, callback=self.index_page)

添加参数

接下来,我们来试试它的抓取效果。

点击左栏上方的左箭头返回,重新调用 index_page() 方法生成新的爬取详情页的 Request。

再点击新生成的详情页的 Request 的爬取按钮,这时我们便可以看到页面变成了这样子。

运行结果

最后就是将详情页面中需要的信息提取处理。最终的 detail_page() 方法改写如下:

def detail_page(self, response):

        return {

            'url': response.url,

            'title': response.doc('#booktitle').text(),

            'date': response.doc('.when .data').text(),

            'day': response.doc('.howlong .data').text(),

            'who': response.doc('.who .data').text(),

            'text': response.doc('#b_panel_schedule').text(),

            'image': response.doc('.cover_img').attr.src

        }

修改代码

修改后的结果:

再次运行后的结果

9、启动爬虫

返回爬虫的主页面,将爬虫的 status 设置成 DEBUG 或 RUNNING,点击右侧的 Run 按钮即可开始爬取。

将爬虫的 status 设置成 DEBUG

在最左侧我们可以定义项目的分组,以方便管理。rate/burst 代表当前的爬取速率。rate 代表 1 秒发出多少个请求,burst 相当于流量控制中的令牌桶算法的令牌数,rate 和 burst 设置的越大,爬取速率越快,当然速率需要考虑本机性能和爬取过快被封的问题。process 中的 5m、1h、1d 指 的是最近 5 分、1 小时、1 天内的请求情况,all 代表所有的请求情况。请求由不同颜色表示、蓝色的代表等待被执行的请求,绿色的代表成功的请求,黄色的代表请求失败后等待重试的请求,红色的代表失败次数过多而被忽略的请求,这样可以直观知道爬取的进度和请求情况。

爬取的情况

点击 Active Tasks,即可查看最近请求的详细状况。

最近请求的详细状况

点击 Result,即可查看所有的爬取结果。

爬取结果

10、停止pyspider

在命令行使用ctrl+C停止pyspider服务

停止pyspider服务
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容