Scrapy 是一个用于抓取网站和提取结构化数据的应用程序框架,可用于各种有用的应用程序,如数据挖掘、信息处理或历史存档。
尽管 Scrapy 最初是为网页元素抓取而设计的,但是它也能通过使用Apis来提取数据,比如亚马逊的服务接口,或者就一个通用的目的,网页元素抓取。
为了向您展示 Scrapy
带来了什么,我们将向您展示一个 Scrapy Spider
示例,使用最简单的方式运行蜘蛛。
下面是一个爬虫的代码,它从网站 http://quotes.toscrape.com 爬取名言,遵循分页:
# 导入scrapy库
import scrapy
# 创建一个蜘蛛类
# 这在以后,会在创建爬虫项目后,自动生成
# 该类默认继承scrapy中的Spider类
class QuotesSpider(scrapy.Spider):
# 定义蜘蛛名,这个在后期,你使用命令行创建的时候,
# 和你使用命令行中的名称保持一致,当然你也可以选择不一致
name = 'quotes'
# 定义爬取的url,它是一个列表
start_urls = [
'http://quotes.toscrape.com/tag/humor/',
]
# 回调函数,对继承类的重写
# 这个response相应,是你请求的url的响应结果
def parse(self, response):
# 遍历你找到的名言
# 通过yield生成一个迭代器,并将其抛出
for quote in response.css('div.quote'):
yield {
'author': quote.xpath('span/small/text()').get(),
'text': quote.css('span.text::text').get(),
}
# 获取下一页数据
next_page = response.css('li.next a::attr("href")').get()
# 如果有下一页数据,就回调parse,进行重新解析
if next_page is not None:
yield response.follow(next_page, self.parse)
创建一个py文件,并在命令终端,进入到对应的文件目录下,执行
文件格式:.jl 类别:Julia Source Code File。JL文件保存为文本格式,因此它可以用任何文本编辑器进行编辑。
scrapy runspider quotes_spider.py -o quotes.jl
完成后,同级目录下,会多一个文件,quotes.jl
文件中将包含 JSON
行格式的引号列表,其中包含文本和作者,如下所示:
{"author": "Jane Austen", "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"}
{"author": "Steve Martin", "text": "\u201cA day without sunshine is like, you know, night.\u201d"}
......
当您运行命令 scrapy runspider quotes_spider.py -o quotes.jl
时,Scrapy
会查找你定义的蜘蛛类 QuotesSpider
,之后自动使用爬虫引擎(框架的核心)运行它。
这个爬取的过程由制造一些请求开始,请求的url
就是你蜘蛛类中定义的start_url
(这是一个url
列表),请求完成后,会调取默认回调函数parse
,且会将请求的响应response
作为一个参数传递给parse
回调函数。在回调函数中,这里使用了css
选择器先获取了页面中所有的元素,然后循环每一句名言,并使用yield函数生成一个python字典,这个数据是被抛出的,你在文件中看到了,然后我们查询是否还有下一页数据,如果存在,我们就使用相同的回调方法,重新执行一遍这个过程,直到没有下一页为止。
在这里您会注意到 Scrapy
的主要优势之一: 请求是异步调度和处理的。
Scrapy
不需要等待请求完成和处理,它可以在此期间发送另一个请求或做其他事情。虽然这使您可以进行非常快速的爬网(以容错方式同时发送多个并发请求),但 Scrapy
还让您可以通过一些设置来控制爬网的礼貌。
你可以做一些事情,比如设置每个请求之间的下载延迟,限制每个域或每个 IP
的并发请求数量,甚至使用自动限制扩展来尝试自动找出这些。
上面这些设置,后面我们会涉及到,现在不着急了解具体是怎么设置的。
注意
对数据储存,你可以选择多种方式,导出格式可以使用:json\XML\csv
。或者写item pipline
存储到数据库上。
您已经了解了如何使用 Scrapy
从网站中提取和存储项目,但这只是表面。
Scrapy
提供了许多强大的功能来使抓取变得简单高效,例如:
内置的css
选择器和xpath
表达式以及辅助正则表达式,来帮助我们提取数据.
一个交互式 shell
控制台(IPython
感知),用于尝试使用CSS
和XPath
表达式来抓取数据,在编写或调试蜘蛛时非常有用。
内置支持以多种格式(JSON、CSV、XML
)生成提要导出并将它们存储在多个后端(FTP、S3、本地文件系统
)
强大的编码支持和自动检测,用于处理外部、非标准和损坏的编码声明。
强大的可扩展性支持,允许您使用signals
和定义良好的(middlewares, extensions, and pipelines)
插入自己的功能。
用于处理的各种内置扩展和中间件:
一个 Telnet 控制台,用于连接到在Scrapy
进程中运行的Python 控制台
,以检查和调试您的爬虫
加上其他好东西,比如可重复使用的蜘蛛类,从Sitemap和 XML/CSV
提要中抓取url
、用于自动下载与抓取的项目相关联的图像(或任何其他媒体)的媒体管道、缓存 DNS
解析器等等!
安装 Scrapy
,按照教程学习如何创建一个成熟的 Scrapy
项目。 谢谢你的关注!