Scrapy文档笔记–2
Scrapy指导
假定你的Scrapy已经安装好,若没有安装好请看Scrapy文档笔记1
我们将要爬取quotes.toscrape.com,这篇文章将包含以下任务:
- 创建一个新的Scrapy项目
- 写一个Spider爬取站点并提取数据
- 使用命令行导出爬取的数据
- 改变爬虫使其递归的寻找链接
- 使用spider参数
Scrapy是用Python写的,如果你对Python还不熟悉,并且学过其他语言,请先阅读官方文档或Dive into Python3;如果这是你第一次接触编程,你可以参考一下Learn Python the hard way,当然你也可以参考the list of Python resources for non-programmer
创建一个项目
在开始scraping前,你需要先创建一个新的Scrapy项目.进入你想要创建项目的目录,运行下面的命令
1 | scrapy startproject tutorial |
这会创建一个tutorial
目录,包含下列内容
1 | tutorial/ |
我们的第一个爬虫
Spiders是我们自己定义的,Scrapy用来从网页上爬取信息的的类.他必须是scrapy.Spider
的子类并且定义了初始请求,在页面中寻找下一个链接,如何解析下载的界面并且提取数据是可选的.
下面是我们第一个Spider类代码,把它保存到tutorial/spiders
目录下的quotes_spider.py
文件中。
1 | import scrapy |
我们可以看到,我们的Spider是scrapy.Spider
的子类,我们在QuotesSpider中
定义了一些属性和方法:
name
: identifies the Spider. It must be unique within a project, that is, you can’t set the same name for different Spiders.start_requests()
: must return an iterable of Requests (you can return a list of requests or write a generator function) which the Spider will begin to crawl from. Subsequent(随后的) requests will be generated successively(依次) from these initial requests.parse()
: a method that will be called to handle the response downloaded for each of the requests made. The response parameter is an instance ofTextResponse
that holds the page content and has further helpful methods to handle it.The
parse()
method usually parses the response, extracting the scraped data as dicts and also finding new URLs to follow and creating new requests (Request
) from them.
运行我们的spider
进入项目顶级目录然后运行
1 | scrapy crawl quotes |
这条命令运行名字叫quotes
的spider,这会发送一些请求到quotes.toscrap.com
域名。你会得到类似下面这样的输出:
1 | 2018-05-02 16:34:31 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: |
现在检查一下当前文件夹中的文件,你应该注意到有两个新的文件被创建:quotes-1.html and quotes-2.html,其中保存着相应URLS的内容,这是解析函数(parse)的功能。
如果你疑惑我们为啥还不解析HTML,请耐心一点,我们后边会讲
刚刚发生了什么?
Scrapy调度Spider的start_requests
方法返回的scrapy.Request
对象。一旦收到响应,就实例化Response
对象并调用与请求关联的回调方法,并将response作为参数传给回调函数
start_requests方法的捷径
你可以仅仅定义一个start_urls
类属性来替代生成start_urls
方法,这个属性会被默认生成的start_urls
使用来创建你的爬虫的初始请求。
1 | import scrapy |
The parse()
method will be called to handle each of the requests for those URLs, even though we haven’t explicitly told Scrapy to do so. This happens because parse()
is Scrapy’s default callback method, which is called for requests without an explicitly assigned callback.
提取数据
了解Scrapy如何提取数据的最好的方式是使用Scrapy Shell的selector,运行下面的命令
1 | scrapy shell 'http://quotes.toscrape.com/page/1' |
Remember to always enclose urls in quotes when running Scrapy shell from command-line, otherwise urls containing arguments (ie.
&
character) will not work.