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中,配配好之后执行以下命令验证是否正确
验证phantomjs3、安装MongoDB
下载地址:https://www.mongodb.com/download-center/community
下载选择custom安装,选择安装路劲,不勾选安装compass
不安装compass4、安装pymongo
安装pymongopip3 install 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服务
网友评论