Scrapy 1.3
Scrapy是用于爬取网站并提取结构化数据的应用程序框架,也可用于各种其他程序,如数据挖掘,信息处理或历史归档。
从一个爬虫例子开始
我们通过使用最简单的方式来运行一个Scrapy Spider 例子,以此来学习Scrapy可以为什么带来那些惊喜。
下面是一个爬虫的代码,我们从http://quotes.toscrape.com/网站抓取其中的句子和作者,并且跟随者下一页超下爬取。
# -*- coding:utf-8 -*-
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
start_urls = [
'http://quotes.toscrape.com/'
]
def parse(self, response):
for quote in response.xpath('//div[@class="quote"]'):
yield {
'text' : quote.xpath('span[@class="text"]/text()').extract_first(),
'author' : quote.xpath('span/small/text()').extract_first(),
}
next_page = response.xpath('//li[@class="next"]/a/@href').extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback= self.parse)
将上边的代码存为python文件,比如 quotes_spider.py 并且用runspider命令在控制台中运行该程序。
scrapy runspider quotes_spider.py -o quotes.json
不出所料的话,控制会输出一大段密密麻麻的记录,当运行完成后我们就可以在当前目录下看到quotes.json文件,如果你没有json格式化工具的话打开以后可能看起来乱糟糟的,这里推荐你使用在线json解析工具,点击前往。打开以后就像下边这个样子
[
{
"text":"“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”",
"author":"Albert Einstein"
},
{
"text":"“It is our choices, Harry, that show what we truly are, far more than our abilities.”",
"author":"J.K. Rowling"
},
{
"text":"“There are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.”",
"author":"Albert Einstein"
},
...]
刚刚发生了什么呢?
当你运行命令scrapy runspider quotes_spider.py,Scrapy 寻找到一个爬虫定义,进入其中并且通过自己的crawler引擎来运行它。我们在start_urls属性中定义了url,爬虫向定义的url发送请求并且回调了默认的回调方法parse,将请求相应的对象作为参数传递给parse方法。在回调方法的解析中,我们使用xpath循环节点,并产生一个Python dict(字典)存储提取到的文本和作者。最后我们找到了下一页的链接并调用另一个使用相同解析方法的请求作为回调。
这里,您可以注意到Scrapy的一个最主要的优势: 请求(request)是 被异步调度和处理的 。 这意味着,Scrapy并不需要等待一个请求(request)完成及处理,在此同时, 也发送其他请求或者做些其他事情。 这也意味着,当有些请求失败或者处理过程中出现错误时,其他的请求也能继续处理
在允许您可以以非常快的速度进行爬取时(以容忍错误的方式同时发送多个request), Scrapy也通过 一些设置 来允许您控制其爬取的方式。 例如,您可以为两个request之间设置下载延迟, 限制单域名(domain)或单个IP的并发请求量,甚至可以 使用自动限制插件 来自动处理这些问题
注释
这里使用了 feed exports 来创建了JSON文件, 您可以很容易的改变导出的格式(比如XML或CSV)或者存储后端(例如FTP或者 Amazon S3)。 您也可以编写 item pipeline 来将item存储到数据库中。
还有什么
您已经了解了如何通过Scrapy提取存储网页中的信息,但这仅仅只是冰山一角。Scrapy提供了很多强大的特性来使得爬取更为简单高效, 例如:
- 对HTML, XML源数据 选择及提取 的内置支持, 提供了CSS选择器(selector)以及XPath表达式进行处理, 以及一些帮助函数(helper method)来使用正则表达式来提取数据
- 提供 交互式shell终端 , 为您测试CSS及XPath表达式,编写和调试爬虫提供了极大的方便
- 通过 feed导出 提供了多格式(JSON、CSV、XML),多存储后端(FTP、S3、本地文件系统)的内置支持
- 提供了一系列在spider之间共享的可复用的过滤器(即 Item Loaders),对智能处理爬取数据提供了内置支持
- 针对非英语语系中不标准或者错误的编码声明, 提供了自动检测以及健壮的编码支持
- 高扩展性。您可以通过使用 signals ,设计好的API(中间件, extensions, pipelines)来定制实现您的功能
- 内置的中间件及扩展为下列功能提供了支持: * cookies and session 处理 * HTTP 压缩 * HTTP 认证 * HTTP 缓存 * user-agent模拟 * robots.txt * 爬取深度限制 * 其他
- 内置 Telnet终端 ,通过在Scrapy进程中钩入Python终端,使您可以查看并且调试爬虫
- 以及其他一些特性,例如可重用的,从 Sitemaps 及 XML/CSV feeds中爬取网站的爬虫、 可以 自动下载 爬取到的数据中的图片(或者其他资源)的media pipeline、 带缓存的DNS解析器,以及更多的特性
接下来呢
下一步你将要安装Scrapy,参照本教程学习如何创建一个完整的Scrapy项目。谢谢你的加入。