爬虫框架Scrapy
一.scrapy概述
Scrapy使用了Twisted异步网络框架来处理网络通信,该网络框架可以加快下载速度,并且包含了各种中间件接口,可以灵活地完成各种需求
Scrapy功能强大,它支持自定义Item和Pipline数据管道;支持在Spider中指定(网页域范围)以及对应的Rule(爬取规则);支持XPath对DOM的解析等.而且Scrapy还有自己的shell,可以方便地调试爬虫项目和查看爬虫运行结果
二.scrapy框架架构
from IPython.display import Image
Image("./data/10_1.png",width=500)
Scrapy框架主要包含了以下组件:
- 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)
三.scrapy框架的运作流程
scrapy的运作流程由引擎控制,其控制如下:
- 引擎向Spiders请求第一个要爬取的URL
- 引擎从Spiders中获取到第一个要爬取的URL,封装成Request并交给调度器
- 引擎向调度器请求下一个要爬取的Request
- 调度器返回下一个要爬取的Request给引擎,引擎将Request通过下载中间件转发给下载器
- 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件发送给引擎
- 引擎从下载器中接收到Response并通过Spider中间件发送给Spider处理
- Spider处理Response并返回爬取到的Item及新的Request给引擎
- 引擎将爬取到的Item给Item Pipeline,将Request给调度器
- 开始重复第2步,直到调度器中没有更多的Request
四.scrapy框架的操作
使用scrapy框架制作爬虫一般需要以下4个步骤:
- 新建项目(scrapy startproject xx):创建一个新的爬虫项目
- 明确目标(编写items.py):明确想要爬取的目标
- 制作爬虫(spiders/xxspider.py):制作爬虫,开始爬取网页
- 存储数据(piplines.py):存储爬取内容(一般通过管道进行)
1.新建scrapy项目
scrapy startproject 项目名称
from IPython.display import Image
Image("./data/10_2.png",width=500)
项目目录
Image("./data/10_3.png",width=500)
各个文件的作用:
- scrapy.cfg:配置文件,用于存储项目的配置信息
- myspider:项目的python模块
- items.py:实体文件,用于定义项目的目标实体
- middlewares.py:中间件文件,用于定义Spider中间件
- pipelines.py:管道文件,用于定义项目使用的管道
- settings.py:设置文件,用于存储项目的设置信息
- spiders:存储爬虫代码的目录
2.明确爬取目标
页面的网址:http://www.itcast.cn/channel/teacher.shtml;爬取讲师的姓名,级别和个人信息
scrapy框架提供了基类scrapy.Item
用来表示实体数据.scrapy使用Item
实体来表示要爬取的数据.Item
定义结构化数据字段,类似于python中的字典dict
Image("./data/10_4.png",width=500)
import scrapy
class MyspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 姓名
name=scrapy.Field()
# 级别
title=scrapy.Field()
# 个人信息
info=scrapy.Field()
3.制作Spiders
制作Spiders分为3个步骤实现,分别是创建爬虫,运行爬虫以爬取网页和提取数据
创建爬虫
scrapy genspider 爬虫名称 "爬取域"
Image(filename="./data/10_5.png",width=500)
Image(filename="./data/10_6.png",width=500)
首先修改start_urls的值为爬取的第一个URL,然后修改parse()
方法,将响应信息转换成文本,保存在teacher.html
Image(filename="./data/10_7.png",width=500)
运行爬虫,爬取网页
命令格式:scrapy crawl 爬虫名称;此命令在爬虫名称.py所在的目录下执行
scrapy crawl itcast
提取数据
重新编辑parse()
方法,完整itcast.py文件如下
# -*- coding: utf-8 -*-
import scrapy
from myspider.items import MyspiderItem
class ItcastSpider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['itcast.cn']
start_urls = ('http://www.itcast.cn/channel/teacher.shtml',)
def parse(self, response):
"""
with open("teacher.html","w",encoding="utf-8") as file:
file.write(response.text)
pass
"""
items=[]
for each in response.xpath("//div[@class='li_txt']"):
item=MyspiderItem()
# 使用extract()方法返回的都是Unicode字符串
name=each.xpath("h3/text()").extract()
title=each.xpath("h4/text()").extract()
info=each.xpath("p/text()").extract()
# xpath返回的是包含一个元素的列表
item["name"]=name[0]
item["title"]=title[0]
item["info"]=info[0]
items.append(item)
return items
重新执行:scrapy crawl itcast
注意:使用文件内容来运行scrapy爬虫.打开项目,在项目中新建一个start.py文件,内容如下
from scrapy import cmdline
cmdline.execute("scrapy crawl itcast".split())
然后执行start.py文件即可
4.存储数据
# 输出JSON格式,默认为Unicode编码
scrapy crawl itcast -o teachers.json
# 输出JSON Lines格式,默认为Unicode编码
scrapy crawl itcast -o teachers.jsonl
# 输出CSV格式
scrapy crawl itcast -o teachers.csv
# 输出XML格式
scrapy crawl itcast -o teachers.xml
Image(filename="./data/10_8.png",width=500)