美文网首页
实战4:pyspider的安装使用

实战4:pyspider的安装使用

作者: 即将拥有八块腹肌的程序猿 | 来源:发表于2019-08-25 22:20 被阅读0次

    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服务

    相关文章

      网友评论

          本文标题:实战4:pyspider的安装使用

          本文链接:https://www.haomeiwen.com/subject/znfkectx.html