实战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服务
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容