本文经过示例简要介绍一下使用Scrapy抓取网站内容的基本方法和流程。css
继续阅读以前请确保已安装了scrapy。html
基本安装方法为:pip install scrapypython
咱们已经在以前的文章中初步介绍了scrapy,本文是前文的进一步拓展。web
本文主要包含以下几部分:chrome
1,建立一个scrapy项目shell
2,编写一个爬虫(或蜘蛛spider,本文中含义相同)类用于爬取网站页面并提取数据json
3,使用命令行导出爬到的数据浏览器
4,递归地爬取子页面app
5,了解并使用spider支持的参数scrapy
咱们测试的网站为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:24: