一 Scrapy框架的简介
为了爬取网站数据而编写的一款应用框架,所谓的框架其实就是一个集成了相应的功能且具有很强通用性的项目模板
该框架提供了高性能的异步下载,解析和持久化等功能
二 安装
linux or max os :
pip install scrapy
windows:
pip install wheel 下载 twisted框架:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载好后安装:pip insta 下载的框架.whl pip install pywin32 pip install scrapy
三 基础使用
(1) 创建一个工程: scrapy startproject 工程名称
(2) 在工程目录下创建一个爬虫文件
目录结构:
project_name/ scrapy.cfg: project_name/ __init__.py items.py pipelines.py settings.py spiders/ __init__.py
scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)
items.py 设置数据存储模板,用于结构化数据,如:Django的Model
pipelines 数据持久化处理
settings.py 配置文件,如:递归的层数、并发数,延迟下载等
spiders 爬虫目录,如:创建文件,编写爬虫解析规则
(3) 对应的文件中编写爬虫程序来完成爬虫的相关操作
cd 工程目录
执行scrapy genspider 爬虫文件的名称 起始url
文件内容:
# -*- coding: utf-8 -*- import scrapy class FirstSpider(scrapy.Spider): # 爬虫文件的名称: 可以通过爬虫文件的名称可以指定的定位到某一个具体的爬虫文件 name = 'first' # 允许的域名: 只可以爬取指定域名下的页面数据 allowed_domains = ['www.qiushibaike.com'] # 起始url:当前工程要爬取的页面所对应的url start_urls = ['http://www.qiushibaike.com/'] # 解析方法:对获取的页面数据进行指定内容的解析 # response:根据起始url列表发起请求,请求成功后返回的响应对象 # parse方法的返回值:必须为迭代器或者空 def parse(self, response): print(response.text) # 获取响应对象的页面数据
(4) 配置文件的编写(settings.py)
所需更改的配置:
# Obey robots.txt rules ROBOTSTXT_OBEY = False # 改成False # 对请求载体的身份进行伪装 USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
(5) 执行
scrapy crawl 爬虫文件的名称
四 Scrapy框架的组件
Scrapy主要包括了以下组件:
- 引擎(Scrapy)
用来处理整个系统的数据流处理, 触发事务(框架核心) - 调度器(Scheduler)
用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 - 下载器(Downloader)
用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的) - 爬虫(Spiders)
爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面 - 项目管道(Pipeline)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。 - 下载器中间件(Downloader Middlewares)
位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。 - 爬虫中间件(Spider Middlewares)
介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。 - 调度中间件(Scheduler Middewares)
介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
Scrapy运行流程大概如下:
- 引擎从调度器中取出一个链接(URL)用于接下来的抓取
- 引擎把URL封装成一个请求(Request)传给下载器
- 下载器把资源下载下来,并封装成应答包(Response)
- 爬虫解析Response
- 解析出实体(Item),则交给实体管道进行进一步的处理
- 解析出的是链接(URL),则把URL交给调度器等待抓取
五 爬虫文件中指定页面解析操作
需求:爬取糗事百科中段子的内容和作者
(1) 创建一个工程 scrapy startproject spiderqiubai
(2) 创建一个爬虫文件 cd spiderqiubai scrapy gensider www.qiushibaike.com/text
(3) 编写代码
class QiubaiSpider(scrapy.Spider): name = 'qiubai' # allowed_domains = ['www.qiushibaike.com/text'] start_urls = ['https://www.qiushibaike.com/text/'] def parse(self, response): # 建议使用xpath进行解析(框架集成了xpath解析的接口) div_list = response.xpath('//div[@id="content-left"]/div ') for div in div_list: # xpath解析到的指定内容存储到了Selector对象 # extract()该方法可以将Selector对象存储中存储的数据值拿到 author = div.xpath('./div/a[2]/h2/text()').extract_first() # extract_first = extract()[0] content = div.xpath('.//div[@class="content"]/span/text()').extract_first() print(author) print(content)