如果已经安装好了Scrapy,就可以开始下面的教程了。如果没有,可以看我的博文《安装Scrapy》进行安装后,再回来看哦!
接下来,我们将爬取 quotes.toscrape.com中的名人名言,作为本教程的素材。
入门教程共下列五步:
- 创建一个新的Scrapy项目
- 写一个spider去爬取网页和提取数据
- 使用命令行输出爬取的数据
- 根据链接递归爬取(爬取每一个链接)
- 使用spider 参数
创建一个Scrapy项目
在开始使用Scrapy之前,需要建立一个新的Scrapy项目。进入一个目录,输入下面命令,新建一个Scrapy项目
scrapy startproject tutorial
会建立一个tutorial目录,包含以下内容:
tutorial/ scrapy.cfg # deploy configuration file tutorial/ # project's Python module, you'll import your code from here __init__.py items.py # project items definition file middlewares.py # project middlewares file pipelines.py # project pipelines file settings.py # project settings file spiders/ # a directory where you'll later put your spiders __init__.py
第一个Spider
Spiders是你需要定义的类,用它从网站中爬取信息。
Spiders必须是scrapy.Spider的子类和定义初始化的请求,选择如何在页面中跟踪链接,以及如何解析下载的页面内容以提取数据。
下面代码是我们第一次Spider代码。保存文件名为quotes_spider.py,同时保存在tutorial/spiders目录底下在你新建的Spiders项目中。
import scrapy
class QuotesSpider(scrapy.Spider):
name = "quotes"
def start_requests(self):
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'quotes-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('Saved file %s' % filename)
可以看到Spider的子类scrapy.Spider按定义了一些属性和方法:
- name:Spider的标识。它在项目中必须是独一无二的,不能为不同的Spider设置相同的名称。
- start_requests():必须返回一个可迭代的请求(您可以返回一个请求列表或编写一个生成器函数),而这将使爬虫开始爬行。后续请求将从这些初始请求依次生成。
- parse():将调用一个方法来处理每个请求所下载的响应。响应参数是一个包含页面内容的TextResponse实例,并有进一步的帮助方法来处理它。parse()方法通常解析响应,将剪贴数据提取为dicts,并寻找新的url来跟踪和创建来自它们的新请求(请求)。
怎么运行spider
想要spider工作,先回到项目的顶级目录,然后运行:
scrapy crawl quotes
使用这个命令是运行刚刚添加的name为quotes的爬虫,这将发送一些请求。您将得到一个与此类似的输出:
... (omitted for brevity)
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Spider opened
2016-12-16 21:24:05 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-12-16 21:24:05 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/> (referer: None)
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-1.html
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-2.html
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Closing spider (finished)
...
现在,检查当前目录中的文件。您应该注意到已经创建了两个新文件:quotes-1.html和quotes-2.html,包含了各自的url的内容,这是parse方法所产出的。
小提示:如果您想知道为什么我们还没有解析HTML,请稍候,我们很快就会讲到。
参考Scrapy1.5官方文档:https://docs.scrapy.org/en/latest/intro/tutorial.html#