即使有了两次经验,还是遏制不住我的憨:安装Scrapy这边请
今天来看 爬虫框架
Scrapy爬虫框架
Scrapy是一个功能强大且迅捷的网络爬虫框架
要注意喽,scrapy不是一个函数功能库,而是一个爬虫框架
- 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合
- 爬虫框架是一个半成品,能够帮助用户实现专业网络爬虫
Scrapy爬虫框架的 " 5+2 " 结构
在Scrapy爬虫框架中,
,
和
已经完成,
用户需要自主编写
和
- 控制所有模块之间的数据流,可以根据条件触发事件
- 不需要用户修改
- 根据请求下载网页
- 不需要用户修改
- 对所有爬取请求进行调度管理
- 不需要用户修改
- 目的:实施Engine,Schedule和Downloader之间进行用户可配置的控制
- 功能:修改,丢弃,新增请求或响应
- 用户可以编写配置代码
- 解析Downloader返回的响应(Response)
- 产生爬取项(scrapy item)
- 产生额外的爬取请求(Request)
- 需要用户编写配置代码
- 以流水线方式处理Spider产生的爬取项
- 由一组操作顺序组成,类似一个流水线,每个操作是一个Item Pipeline类型
- 可能操作包括:清理,检验和查看爬取项中的HTML数据,将数据存储到数据库中
- 需要用户编写配置代码
- 目的:对请求和爬取项的再处理
- 功能:修改,丢弃,新增请求或爬取项
- 用户可以编写配置代码
Request库和Scrapy框架的比较
相同点:
- 两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线
- 两者可用性都很好,文档丰富,入门简单
- 两者都没有处理js,提交表单,应对验证码等功能(可扩展)
不同点:
Requests | Scrapy |
---|---|
页面级爬虫 | 网站级爬虫 |
功能库 | 框架 |
并发性考虑不足,性能较差 | 并发性好,性能较高 |
重点在于页面下载 | 重点在于爬虫结构 |
定制灵活 | 一般定制灵活,深度定制困难 |
入门简单 | 入门稍难 |
技术路线选取准则:
- 非常小的需求 —— Requests库
- 较大的需求 —— Scrapy框架
- 定制程度很高的需求(不考虑规模),自搭框架 —— Requests>Scrapy
Scrapy框架的常用命令
Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行
- 命令行(不是图形界面)更容易自动化,适合脚本控制
- 本质上,Scrapy是给程序员用的,功能(而不是界面)更重要
Scrapy命令行格式:
命令 | 说明 | 格式 |
---|---|---|
startproject | 创建一个新工程 | scrapy startproject < name > [dir] |
genspider | 创建一个爬虫 | scrapy genspider [options] < name > < domain > |
settings | 获得爬虫配置信息 | scrapy settings [options] |
crawl | 运行一个爬虫 | scrapy crawl < spider > |
list | 列出工程中的所有爬虫 | scrapy list |
shell | 启动URL调试命令行 | scrapy shell [url] |
Scrapy爬虫的一个实例
C_T丢给你一个链接,如果不太明白就请教前辈吧~
在这个实例中,我们还是访问这个网站:http://python123.io/
步骤一:建立一个Scrapy爬虫工程
在你觉得舒服的路径下新建一个文件夹,在该文件夹下输入cmd指令
scrapy startproject python123demo
之后我们就可以在对应的路径下看到新项目文件了
python123demo/ ----> 外层目录
scrapy.cfg ----> 部署Scrapy爬虫的配置文件
python123demo/ ----> Scrapy框架的用户自定义Python代码
__init__.py ----> 初始化脚本
items.py ----> Items代码模板(继承类)
middlewares.py ----> Middlewares代码模板(继承类)
pipelines.py ----> Pipielines代码模板(继承类)
settings.py ----> Scrapy爬虫的配置文件
spiders/ ----> Spiders代码模板目录(继承类)
__init__.py ----> 初始文件,无需修改
__pycache__/ ----> 缓存目录,无需修改
步骤二:在工程中产生一个Scrapy爬虫
python123demo> scrapy genspider demo python123.io
这条命令的作用是生成一个名叫demo的Spider
打开spider文件夹中的demo.py查看一下:
# demo.py
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
allowed_domains = ['python123.io']
start_urls = ['http://python123.io/']
def parse(self, response):
pass
parse()用于处理响应,解析内容形成字典,发现新的URL爬取请求,需要我们自己编写
步骤三:配置产生的Spider爬虫
修改demo.py:
# demo.py
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
start_urls = ['http://python123.io/ws/demo.html']
def parse(self, response):
fname = response.url.split('/')[-1]
with open(fname , 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
步骤四:运行爬虫,获取网页
python123demo> scrapy crawl demo
yield关键字
- 生成器是一个不断产生值的函数
- 包含yield语句的函数是一个生成器
- 生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值
生成器写法:
def square(n):
for i in range(n):
yield i**2
在调用square函数时,当程序运行到yield语句,程序会被冻结,yield语句这一行得到的值会被返回出来
生成器和循环是最好搭档:
def square(n):
for i in range(n):
yield i**2
for i in square(5):
print(i," ",end="")
### Output
0 1 4 9 16
上面是生成器写法,而普通写法是这样的:
def square(n):
ls = [i**2 for i in range(n)]
return ls
for i in square(5):
print(i," ",end="")
### Output
0 1 4 9 16
Q. 为何要有生成器?
A. 生成器相比一次列出所有内容有很大优势:
- 更节省存储空间
- 响应更迅速
- 使用更灵活
Scrapy爬虫的基本使用
Scrapy爬虫的使用步骤
步骤一:创建一个工程和Spider模板
步骤二:编写Spider
步骤三:编写Item Pipelines
步骤四:优化配置
Scrapy爬虫的数据类型
Request类:向网络提交请求的内容
Response类:从网络上爬取内容的封装类
Item类:由Spider产生的信息的封装类
- Request对象表示一个HTTP请求
- 由Spider生成,由Downloader执行
属性或方法 | 说明 |
---|---|
.url | Request对应的请求URL地址 |
.method | 对应的请求方法,’ GET ’ ’ POST ’ 等 |
.headers | 字典类型风格的请求头 |
.body | 请求内容主体,字符串类型 |
.meta | 用户添加的扩展信息,在Scrapy内部模块见传递信息使用 |
.copy() | 复制该请求 |
- Response对象表示一个HTTP响应
- 由Downloader生成,由Spider处理
属性或方法 | 说明 |
---|---|
.url | Response对应的请求URL地址 |
.status | HTTP状态码,默认是200 |
.headers | Response对应的头部信息 |
.body | Response对应的内容信息,字符串类型 |
.flags | 一组标记 |
.request | 产生Response类型对应的Request对象 |
.copy() | 复制该响应 |
- Item对象表示一个从HTML页面中提取的信息内容
- 由Spider生成,由Item Pipelines处理
- Item类似字典类型,可以支持字典类型操作
Scrapy爬虫提取信息的方法
Scrapy爬虫支持多种HTML信息提取方法
- Beautiful Soup
- lxml( )
- re
- Xpath Selector
- CSS Selector