8.3 使用 Portia 编写可视化爬虫
Portia是一款基于Scrapy开发的开源工具,该工具可以通过点击要抓取的网页部分来创建爬虫,这样就比手工创建CSS选择器的方式更加方便。
8.3.1 安装
Portia是一款非常强大的工具,为了实现其功能需要依赖很多外部库。由于该工具相对较新,因此下面会稍微介绍一下它的安装步骤。如果未来该工具的安装步骤有所简化,可以从其最新文档中获取安装方法,网址为https://github.com/scrapinghub/portia#running-portia 。
推荐安装方式的第一步是使用virtualenv 创建一个虚拟Python环境。这里我们将该环境命名为portia_example ,当然你也可以将其替换成其他任何名称。
$ pip install virtualenv $ virtualenv portia_example --no-site-packages $ source portia_example/bin/activate (portia_example)$ cd portia_example
**为什么使用virtualenv?**
假如你的项目使用早期版本的lxml进行开发,而新版本的lxml引入了一些向后不兼容的变更,会影响你项目的正常运行。但是,其他一些项目准备依赖新版本的lxml。如果你的项目使用系统中安装的lxml,那么当lxml更新为支持其他项目的新版本时,你的项目将会运行失败。
Ian Bicking的virtualenv提供了一个聪明的办法来解决这一问题,那就是复制系统Python可执行文件及其依赖到一个本地目录,创建隔离的Python环境。这样就允许项目在本地安装特定的Python库版本,独立于外部系统。详细信息可以查看其文档,网址为`https://virtualenv.pypa.io`。
然后,在virtualenv 中安装Portia及其依赖。
(portia_example)$ git clone https://github.com/scrapinghub/portia (portia_example)$ cd portia (portia_example)$ pip install -r requirements.txt (portia_example)$ pip install -e ./slybot
Portia目前处于活跃开发期,因此在你阅读本书时其接口可能已经发生变化。如果你想使用和本书相同的版本进行开发,可以运行如下git 命令。
(portia_example)$ git checkout 8210941
如果你还没有安装git ,可以直接下载Portia的最新版,其网址为https://github.com/scrapinghub/portia/archive/master.zip 。
安装完成后,可以进入slyd目录运行服务器端来启动Portia。
(portia_example)$ cd slyd (portia_example)$ twistd -n slyd
如果安装成功,就可以在浏览器中访问到Portia工具,网址为http://localhost:9001/static/main.html 。
图8.1所示为其初始屏幕。
图8.1
如果你在安装过程中遇到了问题,可以查看Portia的问题页,网址为https://github.com/scrapinghub/portia/issues ,也许其他人已经经历过相同的问题并且找到了解决方案。
8.3.2 标注
在Portia的启动页,有一个用于输入待抓取网站URL的文本框,比如http://example.webscraping.com 。输入后,Portia会在其主面板加载该网页,如图8.2所示。
图8.2
默认情况下,项目名称被设为new_project ,而爬虫名称则被设为待爬取域名(example.webscraping.com ),这两项都可以通过单击相应标签进行修改。接下来,浏览器会定位到一个示例国家网页,让你标注感兴趣的数据,如图8.3所示。
单击Annotate this page 按钮,然后再单击国家人口数量,就会弹出如图8.4所示的对话框。
单击+field 按钮创建一个名为population 的新域,然后单击Done 保存。接下来,对国家名称以及你感兴趣的其他域进行相同操作。被标注的域会在网页中高亮显示,并且可以在右边栏的面板中进行编辑,如图8.5所示。
图8.3
图8.4
图8.5
完成标注后,单击顶部的蓝色按钮Continue Browsing 。
8.3.3 优化爬虫
标注完成后,Portia会生成一个Scrapy项目,并将产生的文件保存到data/projects 目录中。要运行爬虫,只需执行portiacrawl 命令,并带上项目名和爬虫名即可。不过,如果爬虫使用默认设置运行的话,很快就会遇到服务器错误。
(portia_example)$ portiacrawl portia/slyd/data/projects/new_project example.webscraping.com [example.webscraping.com] DEBUG: Crawled (200) [example.webscraping.com] DEBUG: Scraped from http://example.webscraping.com/view/Antarctica-9> { '_template': '9300cdc044d4b75151044340118ccf4efd976922', '_type': u'default', u'name': [u'Antarctica'], u'population': [u'0'], 'url': 'http://example.webscraping.com/view/Antarctica-9'} ... [example.webscraping.com] DEBUG: Retrying http://example.webscraping.com/edit/Antarctica-9> (failed 1 times): 500 Internal Server Error
这和“优化放置”小节中遇到的问题是一样的,因为Portia生成的项目使用了默认的Scrapy爬取设置,导致下载速度过快。我们仍然可以在设置文件中修改这些设置(文件位于data/projects/new_project/spiders/ settings.py )。不过,为了演示一些新方法,这次我们改为使用命令行进行设置。
(portia_example)$ portiacrawl portia/slyd/data/projects/new_project example.webscraping.com -s CONCURRENT_REQUESTS_PER_DOMAIN=1 -s DOWNLOAD_DELAY=5 ... [ example.webscraping.com ] DEBUG: Crawled (200) http://example.webscraping.com/user/login?_next=%2Findex%2F1> [ example.webscraping.com ] DEBUG: Crawled (200) http://example.webscraping.com/user/register?_next=%2Findex%2F1>
当运行这个放慢速度的爬虫时,就可以避免被封禁的问题了。不过,接下来同样也会遇到下载非必要网页(比如登录和注册页)这个降低效率的问题。默认情况下,Portia生成的爬虫会爬取给定域名的所有URL。要想只爬取特定URL,可以配置右边栏面板中的Crawling 选项卡,如图8.6所示。
图8.6
这里,我们添加/index/ 和/view/ 作为爬虫跟踪模式,并且将/user/ 作为排除模式,这些都和之前Scrapy项目中的用法相似。如果勾选了底部的Overlay blocked links 复选框,Portia就会把跟踪链接高亮为绿色,排除链接高亮为红色,如图8.7所示。
图8.7
8.3.4 检查结果
现在就可以执行Portia生成的爬虫了,另外和之前一样,我们使用--output 选项指定输出的CSV文件。
(portia_example)$ python >>> from scrapely import Scraper >>> s = Scraper() >>> train_url = 'http://example.webscraping.com/view/Afghanistan-1' >>> s.train(train_url, { 'name': 'Afghanistan', 'population': '29,121,286' } ) >>> test_url = 'http://example.webscraping.com/view/United-Kingdom-239' >>> s.scrape(test_url) [ { u'name': [u'United Kingdom'], u'population': [u'62,348,447' ] } ]
当运行如上命令时,该爬虫将会产生和手工创建的Scrapy版本相同的输出。
Portia是一个非常方便的与Scrapy配合的工具。对于简单的网站,使用Portia开发爬虫通常速度更快。相反,对于复杂的网站(比如依赖JavaScript的界面),则可以选择使用Python直接开发Scrapy爬虫。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论