scrapy分页抓取网页(快速学习Python学习资料列表将是您选择的项目)
优采云 发布时间: 2022-02-28 10:17scrapy分页抓取网页(快速学习Python学习资料列表将是您选择的项目)
在本教程中,我们假设您已安装 Scrapy。如果没有,请参考。
接下来以Open Directory Project (dmoz) (dmoz) 为例来描述爬取。
本教程将带您完成以下任务:
创建一个Scrapy项目,定义提取出来的Item要爬取网站并提取来存储提取出来的Item(即数据)
Scrapy 是用 Python 编写的。如果你是语言新手,对这门语言的特点和 Scrapy 的细节感到好奇,对于已经熟悉其他语言并想快速学习 Python 的编程老手,我们推荐 Learn Python The Hard Way,进行编程想要开始学习 Python 的初学者,非编程的 Python 学习资料列表供您选择。
创建一个项目
在开始抓取之前,您必须创建一个新的 Scrapy 项目。转到您打算存储代码的目录并运行以下命令:
scrapy startproject tutorial
此命令将创建一个收录以下内容的教程目录:
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
这些文件是:
定义项目
Item是爬取数据的容器;它的用法类似于 python 字典,它提供了额外的保护来防止由拼写错误导致的未定义字段错误。
与 ORM 类似,您可以通过创建一个类并定义一个类型的类属性来定义一个 Item。 (如果你不懂ORM,别着急,你会发现这一步很简单)
首先根据需要从获取的数据中为项目建模。我们需要从 dmoz 中获取 网站 的名称、url 和描述。为此,请在 item.xml 中定义相应的字段。编辑教程目录下的 items.py 文件:
import scrapy
class DmozItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
一开始这可能看起来很复杂,但是通过定义一个项目,您可以轻松地使用其他 Scrapy 方法。而这些方法需要知道你的item的定义。
编写你的第一个蜘蛛
Spider 是用户编写的一个类,用于从单个 网站(或多个 网站)中抓取数据。
它收录一个用于下载的初始URL,如何跟随网页中的链接以及如何分析页面中的内容,提取生成的方法。
为了创建蜘蛛,你必须扩展类并定义以下三个属性:
以下是我们的第一个蜘蛛代码,保存在 tutorial/spiders 目录下的 dmoz_spider.py 文件中:
import scrapy
class DmozSpider(scrapy.spiders.Spider):
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]
with open(filename, 'wb') as f:
f.write(response.body)
爬行
进入项目根目录,执行如下命令启动spider:
scrapy crawl dmoz
crawldmoz 启动爬虫进行爬取,您将获得类似于以下内容的输出:
2014-01-23 18:13:07-0400 [scrapy] INFO: Scrapy started (bot: tutorial)
2014-01-23 18:13:07-0400 [scrapy] INFO: Optional features available: ...
2014-01-23 18:13:07-0400 [scrapy] INFO: Overridden settings: {}
2014-01-23 18:13:07-0400 [scrapy] INFO: Enabled extensions: ...
2014-01-23 18:13:07-0400 [scrapy] INFO: Enabled downloader middlewares: ...
2014-01-23 18:13:07-0400 [scrapy] INFO: Enabled spider middlewares: ...
2014-01-23 18:13:07-0400 [scrapy] INFO: Enabled item pipelines: ...
2014-01-23 18:13:07-0400 [dmoz] INFO: Spider opened
2014-01-23 18:13:08-0400 [dmoz] DEBUG: Crawled (200) (referer: None)
2014-01-23 18:13:09-0400 [dmoz] DEBUG: Crawled (200) (referer: None)
2014-01-23 18:13:09-0400 [dmoz] INFO: Closing spider (finished)
查看收录[dmoz]的输出,可以看到输出日志中收录了start_urls中定义的初始URL,和spider一一对应。在日志中可以看到没有指向其他页面((referer:None))。
除此之外,发生了更有趣的事情。正如我们的 parse 方法所指定的,创建了两个文件,其中收录与 url 对应的内容:Book、Resources。
刚刚发生了什么?
Scrapy 在 Spider 的 start_urls 属性中为每个 URL 创建对象,并将 parse 方法分配给 Request 作为回调。
Request对象被调度,生成的对象被执行并发回spider方法。
提取ItemSelectors简介
有很多方法可以从网页中提取数据。 Scrapy 使用基于 XPath 和 CSS 表达式的机制:.有关选择器和其他提取机制的信息,请参见此处。
以下是 XPath 表达式及其对应含义的示例:
以上只是几个简单的 XPath 示例,XPath 实际上远比这强大。如果您想了解更多信息,我们推荐此 XPath 教程。
为了配合XPath,Scrapy不仅提供,而且还提供了避免每次从响应中提取数据时都生成选择器的麻烦的方法。
Selector有四种基本方法(点击对应方法查看详细API文档):
试试 Shell 中的选择器
为了介绍如何使用 Selector,我们接下来会使用内置的 Selector。 Scrapy Shell 要求您预先安装 IPython(一个扩展的 Python 终端)。
你需要进入你的项目的根目录并执行以下命令来启动shell:
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
注意事项
在终端运行Scrapy时,请记得在url地址两边加上引号,否则url中收录参数(如&字符)会导致Scrapy失败。
shell 输出类似于:
[ ... Scrapy log here ... ]
2015-01-07 22:01:53+0800 [domz] DEBUG: Crawled (200) (referer: None)
[s] Available Scrapy objects:
[s] crawler
[s] item {}
[s] request
[s] response
[s] sel
[s] settings
[s] spider
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
>>>
当 shell 加载时,您将获得一个收录响应数据的本地响应变量。输入response.body输出响应的body,输出response.headers可以看到响应的header。
更重要的是,当你输入response.selector时,你会得到一个选择器(selector),可以用来查询返回的数据,并映射到response.selector.xpath()、response.selector.css()的快捷方式: response.xpath() 和 response.css()。
同时,shell根据响应提前初始化变量sel。选择器会根据响应的类型自动选择最合适的解析规则(XML vs HTML)。
让我们试试吧:
In [1]: sel.xpath('//title')
Out[1]: []
In [2]: sel.xpath('//title').extract()
Out[2]: [u'Open Directory - Computers: Programming: Languages: Python: Books']
In [3]: sel.xpath('//title/text()')
Out[3]: []
In [4]: sel.xpath('//title/text()').extract()
Out[4]: [u'Open Directory - Computers: Programming: Languages: Python: Books']
In [5]: sel.xpath('//title/text()').re('(w+):')
Out[5]: [u'Computers', u'Programming', u'Languages', u'Python']
提取数据
现在,让我们尝试从这些页面中提取一些有用的数据。
您可以在终端中键入 response.body 以观察 HTML 源并确定适当的 XPath 表达式。但是,这项任务非常无聊和困难。您可能会考虑使用 Firefox 的 Firebug 扩展来简化操作。详情请参考和。
查看网页的源码后会发现网站的信息收录在第二个