前言
《项目实战 | python爬虫及实践(一)》中介绍了网络爬虫的定义、分类和基本流程。
《项目实战 | python爬虫及实践 (二)》中介绍了如何从服务器响应的HTML文档中解析提取想要的内容,主要包括BeautifulSoup方法和正则表达式方法。
在徒手写爬虫代码时,如果请求为一系列URL,我们需要维护URL队列,如果对速度还有要求的话,还那需要编写多线程代码,想想就脑阔疼。所以在python爬虫的第三篇文章,我们将介绍为解决这些问题而设计的爬虫框架——Scrapy,内容安排如下:
- Scrapy是什么
- Scrapy安装
- Scrapy入门实例
一、Scrapy是什么
Scrapy是一个为了爬取网站数据、提取结构性数据而编写的应用框架,我们只需要编写少量的代码,就能够快速抓取。
1.架构图
2.运作流程
代码语言:javascript复制Engine:Hi,Spider,你要处理哪一个网站?
Spider:我要处理xxx.com
Engine:给我第一个要处理的URL吧
Spider:给你,第一个(初始)URL是 xxx.com
Engine:Hi,Scheduler,我这有request请求,你帮我排序入队一下
Scheduler:好的,马上处理
Engine:Hi,Scheduler,把你处理好的request请求给我
Scheduler:给你,这是我处理好的request
Engine:Hi,Downloader,你按照Downloader Middlewares的设置帮我下载这个request请求
Downloader:好的,给你,这是下载好的东西。(如果失败:Sorry,这个request下载失败,然后Engine告诉Scheduler重新记录这个request,待会儿再下载)
Engine:Hi,Spider,这是下载好的东西,你自己处理一下
Spider:Hi,Engine,我这里有两个结果,一个是需要跟进的URL请求,另一个是获取的Item数据
Engine:Hi,Pipeline,我这有Item你帮我处理一下。Hi,Scheduler,这是需要跟进的URL你帮我处理一下
从第4步开始循环,直到Scheduler队列为空。
二、Scrapy安装
1.使用conda安装(如果已经安装anconada)
代码语言:javascript复制conda install scrapy
2.使用pip安装
代码语言:javascript复制pip install --upgrade pip #升级pip版本
pip install Scrapy #pip安装Scrapy框架
#根据命令行提示做下载安装
检测Scrapy安装是否成功,在终端输入scrapy回车,安装成功会出现以下内容
入门Scrapy常用命令主要包括:
代码语言:javascript复制scrapy startproject projectname #创建项目
scrapy genspider spidername domainname #创建爬虫,限制爬行范围
scrapy crawl spidername #运行爬虫
scrapy crawl spidername -o file.json #保存结果至file.json文件中
三、Scrapy入门实例
这个实例中,我们想爬取www.quotes.toscrape.com网站中的名人名言,包括文本、作者、标签这些信息。
1.创建项目
在F:PycharmWorkspace目录下创建名为quotesScrapy的项目
2.创建爬虫
创建名为quote的爬虫,限制爬行区域为http://quotes.toscrape.com/
在pycharm中打开创建的项目,Scrapy已经自动为我们创建了很多内容
3.明确目标(items.py)
- 打开items.py文件
- Item定义结构化数据字段,用来保存爬取到的数据,类似Python中的dict,并提供了一些额外的保护避免错误
- 可以通过创建scrapy.Item类,并且定义类型为scrapy.Field的类属性来创建一个Item
我们想要抓取的内容包括名言、作者和标签,所以在items.py中定义detail、author、tags 属性
代码语言:javascript复制import scrapy
class QuotesscrapyItem(scrapy.Item): #定义目标字段
# define the fields for your item here like:
# name = scrapy.Field()
detail = scrapy.Field()
author = scrapy.Field()
tags = scrapy.Field()
4.制作爬虫(quote.py)
打开quote.py文件,框架已经根据我们创建时的命令编写好了部分代码
代码语言:javascript复制import scrapy
from quotesScrapy.items import QuotesscrapyItem
class QuoteSpider(scrapy.Spider):
name = 'quote' #爬虫名,创建时定义
allowed_domains = ['quotes.toscrape.com'] #允许爬取的域,过滤提取的URL
start_urls = ['http://quotes.toscrape.com/'] #起始的url,列表可修改
def parse(self, response): #response包含downloader下载回来的数据,对response数据做解析的函数
pass
接下来,我们需要在parse函数中填写解析response的代码。
解析方法可以用BeautifulSoup、正则化方法,也可以用scrapy中定义的selectors选择器。
selector选择器:
- Response.css 根据css表达式来"选择"
- Response.xpath 根据XPath表达式做"选择"
本例中用的是Response.css方法
右击-检查(或审查元素)查看页面具体HTML信息,每条名人名言都在class="quote"的标签下,名言、作者和标签分别在class="text"、class="author"和class="tags"的标签中。
代码语言:javascript复制def parse(self, response): #response是downloader下载回来的数据
quotes=response.css('.quote') #quotes为列表,包含所有div的标签
#在每个标签中进一步剥离
for item in quotes:
detail=item.css('.text::text').extract_first() #取列表中第一个内容
author=item.css('.author::text').extract_first()
tags=item.css('.tags .tag::text').extract() #由于tags是列表,在tags下继续查找,得到所有的tag
另外,提取的数据需要送到pipeline中进一步处理,在pipeline中处理的数据为Item类型,所以需要把提取的数据封装成Item对象。完整的quote.py代码如下
代码语言:javascript复制import scrapy
from quotesScrapy.items import QuotesscrapyItem
class QuoteSpider(scrapy.Spider):
name = 'quote' #爬虫名,创建时定义
allowed_domains = ['quotes.toscrape.com'] #允许爬取的域,过滤提取的URL
start_urls = ['http://quotes.toscrape.com/'] #起始的url,列表可修改
def parse(self, response): #response是downloader下载回来的数据
quotes=response.css('.quote') #quotes为列表,包含所有div的标签
#进到每个标签中进一步剥离
for item in quotes:
detail=item.css('.text::text').extract_first() #取列表第一个文本内容
author=item.css('.author::text').extract_first()
tags=item.css('.tags .tag::text').extract() #在tags下继续查找,找到所有的tag
#创建类的对象,封装
new_item=QuotesscrapyItem()
new_item['detail']=detail
new_item['author']=author
new_item['tags']=tags
yield new_item #生成器
5.数据处理(pipelines.py)
对爬取的数据做简单保存操作
代码语言:javascript复制class QuotesscrapyPipeline(object):
def process_item(self, item, spider):
with open('quotes.txt','a') as f:
f.write(item['author'] '--' item['detail'] '--' str(item['tags']) 'n')
6.调整设置(setting.py)
当我们修改pipelines.py中内容时,需要把settings.py中的pipelines相关的代码取消注释
7.运行爬虫
在pycharm的terminal中通过命令运行程序
代码语言:javascript复制scrapy crawl quote
成功抓取10条名人名言
四、总结
本篇文章主要介绍了爬虫框架Scrapy,编写Scrapy爬虫代码,一共需要4步:
- 新建项目(scrapy startproject xxx):新建名为xxx的爬虫项目
- 明确目标(编写items.py):明确想要抓取的目标
- 制作爬虫(spider/xxspider.py):制作爬虫开始爬取网页
- 存储内容(pipelines.py):设计管道处理爬取内容
后续连载文章会继续分享python爬虫相关内容,感兴趣记得关注“程序媛驿站”,记得关注每周更新的“python爬虫概述与实践”
作者:balabala
编辑:葡萄媛