本文通过示例简要介绍一下使用Scrapy抓取网站内容的基本方法和流程。
继续阅读之前请确保已安装了scrapy。
基本安装方法为:pip install scrapy
我们已经在之前的文章中初步介绍了scrapy,本文是前文的进一步拓展。
本文主要包含如下几部分:
1,创建一个scrapy项目
2,编写一个爬虫(或蜘蛛spider,本文中含义相同)类用于爬取网站页面并提取数据
3,使用命令行导出爬到的数据
4,递归地爬取子页面
5,了解并使用spider支持的参数
我们测试的网站为quotes.toscrape.com,这是一个收录名人警句的站点。Let’s go!
-
创建爬虫项目
Scrapy将爬虫代码各模块及配置组织为一个项目。Scrapy安装成功后,你可以在shell中使用如下命令创建一个新的项目:
scrapy startproject tutorial
这将会创建一个tutorial目录,该目录的文件结构如下所示:
scrapy.cfg # 部署配置文件
tutorial/ # 项目的Python模块, 我们从这个模块中导入所需代码
__init__.py
items.py # items定义文件
middlewares.py # middlewares(中间件)定义文件
pipelines.py # pipelines(流水线)定义文件
settings.py # 项目配置文件
spiders/ # 存放spider的目录
__init__.py
-
编写蜘蛛类
Spiders是Scrapy中需要定义的实现爬取功能的类。
每个spider继承自Spider基类。spider主要定义了一些起始url,并负责解析web页面元素,从中提前所需数据。也可以产生新的url访问请求。
下边这段代码就是我们所定义的spider,将其保存为quotes_spider.py,放在项目的tutorial/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)
在我们的代码中,QuotesSpider继承自scrapy.Spider,并定义了一些属性和方法:
name:用于在项目中唯一标识一个spider。项目中可以包含多个spider,其name必须唯一。
start_requests():用于产生初始的url,爬虫从这些页面开始爬行。这个函数需要返回一个包含Request对象的iterable,可以是一个列表(list)或者一个生成器(generator)。我们的例子中返回的是一个生成器。
parse():是一个回调函数,用于解析访问url得到的页面,参数response包含了页面的详细内容,并提供了诸多从页面中提取数据的方法。我们通常在parse中将提取的数据封装为dict,查找新的url,并为这些url产生新的Request,以继续爬取。
-
运行蜘蛛
Spider定义好了之后,我们可以在项目的顶层目录,即最顶层的tutorial,执行如下命令来运行这个spider:
scrapy crawl quotes
这个命令会在项目的spiders目录中查找并运行name为quotes的Spider,它会向quotes.toscrape.com这个网站发起HTTP请求,并获取如下响应:
...
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: