1. Scrapy介绍
1.1. Scrapy框架
Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
-
Scrapy Engine
(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。 -
Scheduler
(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。 -
Downloader
(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理, -
Spider
(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器), -
Item Pipeline
(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方. -
Downloader Middlewares
(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。 -
Spider Middlewares
(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
1.2. Scrapy运行流程
-
引擎:Hi!Spider, 你要处理哪一个网站?
-
Spider:老大要我处理
xxxx.com
。 -
引擎:你把第一个需要处理的URL给我吧。
-
Spider:给你,第一个URL是
xxxxxxx.com
。 -
引擎:Hi!调度器,我这有request请求你帮我排序入队一下。
-
调度器:好的,正在处理你等一下。
-
引擎:Hi!调度器,把你处理好的request请求给我。
-
调度器:给你,这是我处理好的request
-
引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求
-
下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)
-
引擎:Hi!Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)
-
Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。
-
引擎:Hi !管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。
-
管道``调度器:好的,现在就做!
1.3. 制作Srapy爬虫的四部曲
- 新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
- 明确目标 (编写items.py):明确你想要抓取的目标
- 制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
- 存储内容 (pipelines.py):设计管道存储爬取内容
1.4. 文件目录
插入scrapy01.png
- scrapy.cfg :项目的配置文件
[settings]
default = mySpider.settings
[deploy]
#url = http://localhost:6800/
project = mySpider
- mySpider/ :项目的Python模块,将会从这里引用代码
__init__
: 必须的文件- mySpider/items.py :项目的目标文件
import scrapy
class MyspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# age = scrapy.Field()
pass
- mySpider/Middlewares.py :
- mySpider/pipelines.py :项目的管道文件
class MyspiderPipeline(object):
def process_item(self, item, spider):
return item
- mySpider/settings.py :项目的设置文件
# 你的爬虫名字
BOT_NAME = 'mySpider'
# 你的爬虫的位置
SPIDER_MODULES = ['mySpider.spiders']
NEWSPIDER_MODULE = 'mySpider.spiders'
# 是否遵循robust协议
ROBOTSTXT_OBEY = True
# 爬虫并发量
#CONCURRENT_REQUESTS = 32
# 下载延迟
#DOWNLOAD_DELAY = 3
# 下载延迟的额外设置:一般不用设置
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16
# 是否使用cookie
#COOKIES_ENABLED = False
# 访问电话线设置
#TELNETCONSOLE_ENABLED = False
# 设置默认请求报头
#DEFAULT_REQUEST_HEADERS = {
# 'User-Agent': ''
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
#}
# 爬虫中间键:一般不设置
#SPIDER_MIDDLEWARES = {
# 'mySpider.middlewares.MyspiderSpiderMiddleware': 543,
#}
# 下载中间键: 后面的值是优先级,越小越高
#DOWNLOADER_MIDDLEWARES = {
# 'mySpider.middlewares.MyspiderDownloaderMiddleware': 543,
#}
# 延展,没什么用
#EXTENSIONS = {
# 'scrapy.extensions.telnet.TelnetConsole': None,
#}
# 管道文件---经常使用的,用于指定优先级
#
#ITEM_PIPELINES = {
# 'mySpider.pipelines.MyspiderPipeline': 300,
#}
2. Scrapy全部流程
我们打算抓取:http://www.itcast.cn/channel/teacher.shtml 网站里的所有讲师的姓名、职称和个人信息。
-
创建项目
-
编写items.py文件:设置需要保存的数据字段
-
创建爬虫模板
- 在spiders/文件夹下面运行
scrapy genspider spidername "startURL"
- 在spiders/文件夹下面运行
-
进入xxx/spiders: 编写爬虫文件,文件里的name就是爬虫名
-
写管道文件
- 设置文件保存的形式和写入文件
- 在setting中设置优先级(默认自动设置)
- 添加User-Agent到setting中
-
运行:
-scrapy crawl itcast
scrapy crawl itcast -o json/csv/xml/
-
数据处理
- 数据:交给管道文件处理
yield item
- 请求:重新发送给调度器入、出队列,交给下载器下载
yield scrapy.Request(url, callback = self.parse)
- 数据:交给管道文件处理
3. 写爬虫主要文件
要建立一个Spider
, 你必须用scrapy.Spider
类创建一个子类,并确定了三个强制的属性 和 一个方法。
-
name = ""
:这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。 -
allow_domains = []
是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。 -
start_urls = ()
:爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。 -
parse(self, response)
:解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response
对象来作为唯一参数,主要作用如下:- 负责解析返回的网页数据
(response.body)
,提取结构化数据(生成item) - 生成需要下一页的URL请求。
- 负责解析返回的网页数据