2019独角兽企业重金招聘Python工程师标准>>>

在这个教材中,我们假定你已经安装了Scrapy。假如你没有安装,你可以参考这个安装指南。

我们将会用开放目录项目(dmoz)作为我们例子去抓取。

这个教材将会带你走过下面这几个方面:

  • 创造一个新的Scrapy项目

  • 定义您将提取的Item

  • 编写一个蜘蛛去抓取网站并提取Items。

  • 编写一个Item Pipeline用来存储提出出来的Items

Scrapy由Python写成。假如你刚刚接触Python这门语言,你可能想要了解这门语言起,怎么最好的利用这门语言。假如你已经熟悉其它类似的语言,想要快速地学习Python,我们推荐这种深入方式学习Python。假如你是新手,想从开始使用Python学习,可以尝试去看看非程序员Python资源列表。

创造一个项目

在你要抓取之前,首先要建立一个新的Scrapy项目。然后进去你的存放代码目录,执行如下命令。

scrapy startproject tutorial

它将会创建如下的向导目录:

复制代码 代码如下:

tutorial/
    scrapy.cfg
    tutorial/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

这是一些基本信息:

  • scrapy.cfg: 项目的配置文件。

  • tutorial/: 项目的python模块, 在这里稍后你将会导入你的代码。

  • tutorial/items.py: 项目items文件。

  • tutorial/pipelines.py: 项目管道文件。

  • tutorial/settings.py: 项目配置文件。

  • tutorial/spiders/: 你将要放入你的spider到这个目录中。

定义我们的Item

Items是装载我们抓取数据的容器。它们工作像简单的Python字典,它提供更多的保护,比如对未定义的字段提供填充功能防止出错。

它们通过创建scrapy.item.Item类来声明并定义它们的属性作为scrapy.item.Field 对象,就像是一个对象关系映射(假如你不熟悉ORMs,你将会看见它是一个简单的任务).

我们将需要的item模块化,来控制从demoz.org网站获取的数据,比如我们将要去抓取网站的名字,url和描述信息。我们定义这三种属性的域。我们编辑items.py文件,它在向导目录中。我们Item类看起来像这样。

from scrapy.item import Item, Fieldclass DmozItem(Item):title = Field()link = Field()desc = Field()

这个看起来复杂的,但是定义这些item能让你用其他Scrapy组件的时候知道你的item到底是什么

我们第一个Spider

Spiders是用户写的类,它用来去抓取一个网站的信息(或者一组网站) 。
我们定义一个初始化的URLs列表去下载,如何跟踪链接,如何去解析这些页面的内容去提取 items.创建一个Spider,你必须是scrapy.spider.BaseSpider的子类, 并定义三个主要的,强制性的属性。

名字: Spider的标识. 它必须是唯一的, 那就是说,你不能在不同的Spiders中设置相同的名字。

开始链接:Spider将会去爬这些URLs的列表。所以刚开始的下载页面将要包含在这些列表中。其他子URL将会从这些起始URL中继承性生成。

parse() 是spider的一个方法, 调用时候传入从每一个URL传回的Response对象作为参数。response是方法的唯一参数。

这个方法负责解析response数据和提出抓取的数据(作为抓取的items),跟踪URLs

parse()方法负责处理response和返回抓取数据(作为Item对象) 和跟踪更多的URLs(作为request的对象)

这是我们的第一个Spider的代码;它保存在moz/spiders文件夹中,被命名为dmoz_spider.py:

from scrapy.spider import BaseSpiderclass DmozSpider(BaseSpider):name = "dmoz"allowed_domains = ["dmoz.org"]start_urls = ["http://www.dmoz.org/Computers/Programming/Languages/Python/Books/","http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"]def parse(self, response):filename = response.url.split("/")[-2]open(filename, 'wb').write(response.body)

为了使你的spider工作, 到项目的顶级目录让后运行:

scrapy crawl dmoz

crawl dmoz命令使spider去爬dmoz.org网站的信息。你将会得到如下类似的信息:

2008-08-20 03:51:13-0300 [scrapy] INFO: Started project: dmoz
2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled extensions: ...
2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled downloader middlewares: ...
2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled spider middlewares: ...
2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled item pipelines: ...
2008-08-20 03:51:14-0300 [dmoz] INFO: Spider opened
2008-08-20 03:51:14-0300 [dmoz] DEBUG: Crawled <http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/> (referer: <None>)
2008-08-20 03:51:14-0300 [dmoz] DEBUG: Crawled <http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: <None>)
2008-08-20 03:51:14-0300 [dmoz] INFO: Spider closed (finished)

注意那些行包含[dmoz], 它和我们的spider相关。你能够看见每行初始化的URL日志信息。因为这些URLs是起始页面,所以他们没有引用referrers。 所以在每行的末尾部门,你能看见(referer: <None>).

但是有趣的是,在我们的parse方法作用下,两个文件被创建: Books and Resources, 它保航两个URLs的内容
刚刚发生了什么事情?

Scrapy为每一个start_urls创建一个scrapy.http.Request对象,并将爬虫的parse 方法指定为回调函数。

这些Request首先被调度,然后被执行,之后通过parse()方法,将scrapy.http.Response对象被返回,结果也被反馈给爬虫。

提取Items
选择器介绍

我们有多种方式去提取网页中数据。Scrapy 使用的是XPath表达式,通常叫做XPath selectors。如果想了解更多关于选择器和提取数据的机制,可以看看如下教程XPath selectors documentation.

这里有一些表达式的例子和它们相关的含义:

  • /html/head/title: 选择<title>元素,在HTML文档的<head>元素里

  • /html/head/title/text(): 选择<title>元素里面的文本

  • //td: 选择所有的<td>元素

  • //div[@class="mine"]: 选择所有的div元素里面class属性为mine的

这里有许多的例子关于怎么使用XPath,可以说XPath表达式是非常强大的。如果你想要学习更多关于XPath,我们推荐如下教程this XPath tutorial.

为了更好使用XPaths, Scrapy提供了一个XPathSelector类,它有两种方式, HtmlXPathSelector(HTML相关数据)和XmlXPathSelector(XML相关数据)。如果你想使用它们,你必须实例化一个Response对象.

你能够把selectors作为对象,它代表文件结构中的节点。所以,第1个实例的节点相当于root节点,或者称为整个文档的节点。

选择器有三种方法(点击方法你能够看见完整的API文档)。

  • select(): 返回选择器的列表,每一个select表示一个xpath表达式选择的节点。

  • extract(): 返回一个unicode字符串 ,该字符串XPath选择器返回的数据。

  • re() : 返回unicode字符串列表,字符串作为参数由正则表达式提取出来。

在Shell里面使用选择器

为了更加形象的使用选择器,我们将会使用Scrapy shell,它同时需要你的系统安装IPython (一个扩展的Python控制台)。

如果使用shell,你必须到项目的顶级目录上,让后运行如下命令:

scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/

shell将会显示如下的信息

[ ... Scrapy log here ... ][s] Available Scrapy objects:
[s] 2010-08-19 21:45:59-0300 [default] INFO: Spider closed (finished)
[s] hxs  <HtmlXPathSelector (http://www.dmoz.org/Computers/Programming/Languages/Python/Books/) xpath=None>
[s] item  Item()
[s] request <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] response <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] spider  <BaseSpider 'default' at 0x1b6c2d0>
[s] xxs  <XmlXPathSelector (http://www.dmoz.org/Computers/Programming/Languages/Python/Books/) xpath=None>
[s] Useful shortcuts:
[s] shelp()   Print this help
[s] fetch(req_or_url) Fetch a new request or URL and update shell objects
[s] view(response) View response in a browserIn [1]:

当shell装载之后,你将会得到一个response的本地变量。所以你输入reponse.body,你能够看见response的body部分或者你能够输入response.headers,你能够看见reponse.headers部分。

shell同样实例化了两个选择器,一个是HTML(在hvx变量里),一个是XML(在xxs变量里)。所以我们尝试怎么使用它们:

In [1]: hxs.select('//title')
Out[1]: [<HtmlXPathSelector (title) xpath=//title>]In [2]: hxs.select('//title').extract()
Out[2]: [u'<title>Open Directory - Computers: Programming: Languages: Python: Books</title>']In [3]: hxs.select('//title/text()')
Out[3]: [<HtmlXPathSelector (text) xpath=//title/text()>]In [4]: hxs.select('//title/text()').extract()
Out[4]: [u'Open Directory - Computers: Programming: Languages: Python: Books']In [5]: hxs.select('//title/text()').re('(\w+):')
Out[5]: [u'Computers', u'Programming', u'Languages', u'Python']

提取数据Extracting the data

现在我们开始尝试在这几个页面里提取真正的信息。

你能够在控制台里面输入response.body,检查源代码里面的XPaths是否与预期相同。然而,检查原始的HTML代码是一件非常枯燥乏 味的事情。假如你想让你的工作变的简单,你使用Firefox扩展的插件例如Firebug来做这项任务。更多关于介绍信息请看Using Firebug for scraping和Using Firefox for scraping。

当你检查了页面源代码之后,你将会发现页面的信息放在一个<ul>元素里面,事实上,确切地说是第二个<ul>元素。

所以我们选择每一个<li>元素使用如下的代码:

hxs.select('//ul/li')

网站的描述信息可以使用如下代码:

hxs.select('//ul/li/text()').extract()

网站的标题:

hxs.select('//ul/li/a/text()').extract()

网站的链接:

hxs.select('//ul/li/a/@href').extract()

如前所述,每个select()调用返回一个selectors列表,所以我们可以结合select()去挖掘更深的节点。我们将会用到这些特性,所以:

sites = hxs.select('//ul/li')
for site in sites:title = site.select('a/text()').extract()link = site.select('a/@href').extract()desc = site.select('text()').extract()print title, link, descNote

如果想了解更多的嵌套选择器,可以参考Nesting selectors和Working with relative XPaths相关的Selectors文档
将代码添加到我们spider中:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelectorclass DmozSpider(BaseSpider):name = "dmoz"allowed_domains = ["dmoz.org"]start_urls = ["http://www.dmoz.org/Computers/Programming/Languages/Python/Books/","http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"]def parse(self, response):hxs = HtmlXPathSelector(response)sites = hxs.select('//ul/li')for site in sites:title = site.select('a/text()').extract()link = site.select('a/@href').extract()desc = site.select('text()').extract()print title, link, desc

现在我们再次抓取dmoz.org,你将看到站点在输出中被打印 ,运行命令:

scrapy crawl dmoz

使用我们的 item

Item对象是自定义python字典;使用标准字典类似的语法,你能够访问它们的字段(就是以前我们定义的属性)

>>> item = DmozItem()
>>> item['title'] = 'Example title'
>>> item['title']
'Example title'

Spiders希望将抓取的数据放在 Item对象里。所以,为了返回我们抓取的数据,最终的代码要如下这么写 :

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelectorfrom tutorial.items import DmozItemclass DmozSpider(BaseSpider):name = "dmoz"allowed_domains = ["dmoz.org"]start_urls = ["http://www.dmoz.org/Computers/Programming/Languages/Python/Books/","http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"]def parse(self, response):hxs = HtmlXPathSelector(response)sites = hxs.select('//ul/li')items = []for site in sites:item = DmozItem()item['title'] = site.select('a/text()').extract()item['link'] = site.select('a/@href').extract()item['desc'] = site.select('text()').extract()items.append(item)return items

Note

你能够找到完整功能的spider在dirbot项目里,同样你可以访问https://github.com/scrapy/dirbot

现在重新抓取dmoz.org网站:

[dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>{'desc': [u' - By David Mertz; Addison Wesley. Book in progress, full text, ASCII format. Asks for feedback. [author website, Gnosis Software, Inc.\n],'link': [u'http://gnosis.cx/TPiP/'],'title': [u'Text Processing in Python']}
[dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>{'desc': [u' - By Sean McGrath; Prentice Hall PTR, 2000, ISBN 0130211192, has CD-ROM. Methods to build XML applications fast, Python tutorial, DOM and SAX, new Pyxie open source XML processing library. [Prentice Hall PTR]\n'],'link': [u'http://www.informit.com/store/product.aspx?isbn=0130211192'],'title': [u'XML Processing with Python']}


存储抓取的数据

最简单的方式去存储抓取的数据是使用Feed exports,使用如下的命令:

scrapy crawl dmoz -o items.json -t json

它将会产生一个items.json文件,它包含所有抓取的items(序列化的JSON)。

在一些小的项目里(例如我们的教程中),那就足够啦。然而,假如你想要执行更多复杂的抓取items,你能够写一个 Item Pipeline。 因为在项目创建的时候,一个专门用于Item Pipelines的占位符文件已经随着项目一起被建立,目录在tutorial/pipelines.py。如果你只需要存取这些抓取后的items的话,就不需要去实现任何的条目管道。

您可能感兴趣的文章:

  • 实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250

  • Python基于scrapy采集数据时使用代理服务器的方法

  • Python使用scrapy采集数据时为每个请求随机分配user-agent的方法

  • Python使用scrapy采集数据过程中放回下载过大页面的方法

  • Python使用scrapy采集时伪装成HTTP/1.1的方法

  • Python打印scrapy蜘蛛抓取树结构的方法

  • Python使用scrapy抓取网站sitemap信息的方法

  • Python实现在线程里运行scrapy的方法

  • Python自定义scrapy中间模块避免重复采集的方法

  • 深入剖析Python的爬虫框架Scrapy的结构与运作流程

转载于:https://my.oschina.net/airship/blog/655799

使用Python的Scrapy框架编写web爬虫的简单示例相关推荐

  1. Python的scrapy框架POST方式爬虫时碰见__VIEWSTATE和__EVENTVALIDATION的参数处理

    1.目标网站 2.碰见__VIEWSTATE和__EVENTVALIDATION的参数 3.参数解释以及必要性 4.详解__EVENTTARGET的参数值对应不同的思路 4.1. 第一种,点击下一页的 ...

  2. python安装scrapy框架命令_python爬虫中scrapy框架是否安装成功及简单创建

    判断框架是否安装成功,在新建的爬虫文件夹下打开盘符中框输入cmd,在命令中输入scrapy,若显示如下图所示,则说明成功安装爬虫框架: 查看当前版本:在刚刚打开的命令框内输入scrapy versio ...

  3. Python的Scrapy框架入门教程

    前言: Scrapy是一个基于Python的Web爬虫框架,可以快速方便地从互联网上获取数据并进行处理.它的设计思想是基于Twisted异步网络框架,可以同时处理多个请求,并且可以使用多种处理数据的方 ...

  4. 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

    关于使用scrapy框架编写爬虫以及Ajax动态加载问题.反爬问题解决方案 参考文章: (1)关于使用scrapy框架编写爬虫以及Ajax动态加载问题.反爬问题解决方案 (2)https://www. ...

  5. Crawler之Scrapy:Python实现scrapy框架爬虫两个网址下载网页内容信息

    Crawler之Scrapy:Python实现scrapy框架爬虫两个网址下载网页内容信息 目录 输出结果 实现代码 输出结果 后期更新-- 实现代码 import scrapy class Dmoz ...

  6. 爬取中国最好大学网数据(Python的Scrapy框架与Xpath联合运用)

    前言        大二上学期学校外出实习,做了一个关于爬取中国最好大学网http://www.zuihaodaxue.com/rankings.html的项目用的这个Scrapy框架,多线程还挺好用 ...

  7. 使用python的scrapy框架简单的爬取豆瓣读书top250

    使用python的scrapy框架简单的爬取豆瓣读书top250 一.配置scrapy环境 1. 配置相应模块 如果没有配置过scrapy环境的一般需要安装lxml.PyOpenssl.Twisted ...

  8. 利用python的scrapy框架爬取google搜索结果页面内容

    scrapy google search 实验目的 爬虫实习的项目1,利用python的scrapy框架爬取google搜索结果页面内容. https://github.com/1012598167/ ...

  9. twisted:基于python的twisted框架编写一个客户端和服务端的对话聊天空间

    twisted:基于python的twisted框架编写一个客户端和服务端的对话聊天空间 目录 输出结果 实现代码 输出结果 更新-- 实现代码 #基于python的twisted框架编写一个简单的聊 ...

最新文章

  1. elasticSearch 内置功能列表
  2. TextArea的滚动条看不到了,可能与height有关
  3. SQL Server 2005登录名,用户名,角色,架构之间的关系
  4. linux路由内核实现分析(一)----邻居子节点(2)
  5. 目标检测(九)--YOLO v1,v2,v3
  6. hdu 1506 单调栈问题
  7. 《数字信号处理》——(一).DTFT、DFT(python实现)
  8. 微型计算机中NOP指令,PLC指令表
  9. 扩展欧几里得求乘法逆元 - 手算(结尾附视频)
  10. Python—Django中的视图(views.py)
  11. java 整型数组定义_JAVA数组的定义及用法
  12. 自定义的毛玻璃效果,高斯模糊
  13. M1芯片完美运行安卓模拟器,简单无坑
  14. 2.6-2.7 向量运算的基本性质零向量
  15. 高德地图画带箭头的线_带插头矿用拉力电缆驻当涂县销售处
  16. SQL Anywhere(ASA) 数据库“File is shorter than expected -- transaction rolled back”错误修复...
  17. 业余学Python是如何挣钱的?
  18. Incorrect number of arguments for FUNCTION XXX
  19. 赞同科技产品开发部诚聘软件工程师
  20. 【CAD插件】YQ插件辅助

热门文章

  1. conflicting requests nothing provides libpq.so.5(RHPG_9.6)(64bit) needed **
  2. 高斯-约当(Gauss-Jordan)消元法
  3. 拓嘉启远电商:拼多多直通车烧钱太多的原因
  4. 极智AI | 全场景算力产品矩阵 看算能系列AI产品
  5. 苏宁618公布8大福利 5亿膨胀红包已到位
  6. 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业
  7. python中print横向打印
  8. vue3中播放视频和m3u8后缀的视频解决办法
  9. zookeeper数据迁移
  10. Vunlhub_Eearth