步骤
1.建立工程和 Spider 模版
scrapy startproject 名称
cd 名称
scrapy genspider 爬虫名称 爬取的地址
进一步修改 spiders/爬虫文件
2.编写 Spider
配置 爬虫文件
修改对返回页面的处理
修改对新增URL爬取请求的处理
3.编写 ITEM Pinpelines
配置 pipelines.py 文件
定义对爬取项(Seraped Item)的处理类
配置并发连接选项
settings.py
CONCURRENT_REQUESTS Downloader 最大并发请求下载数量,默认为32
CONCURRENT_ITEMS Item Pinpeline 最大并发 ITEM 处理数量,默认100
CONCURRENT_REQUESTS_PER_DOMAIN 每个目标域名最大的并发请求数量,默认8
CONCURRENT_REQUESTS_PER_IP 每个目标IP最大并发请求数量,默认0,非0有效
requests vs Scrapy
相同点
两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线
两者可用性都好,文档丰富,入门简单
两者都没有处理js,提交表单,应对验证码等功能(可扩展)
全局命令
startproject
语法: scrapy startproject <project_name>
这个命令是scrapy最为常用的命令之一,它将会在当前目录下创建一个名为 <project_name>的项目。
settings
语法: scrapy settings [options]
该命令将会输出Scrapy默认设定,当然如果你在项目中运行这个命令将会输出项目的设定值。
runspider
语法: scrapy runspider <spider_file.py>
在未创建项目的情况下,运行一个编写在Python文件中的spider。
shell
语法: scrapy shell [url]
以给定的URL(如果给出)或者空(没有给出URL)启动Scrapy shell。
例如,scrapy shell http://www.baidu.com将会打开百度URL,
并且启动交互式命令行,可以用来做一些测试。
fetch
语法: scrapy fetch <url>
使用Scrapy下载器(downloader)下载给定的URL,并将获取到的内容送到标准输出。简单的来说,就是打印url的html代码。
view
语法: scrapy view <url>
在你的默认浏览器中打开给定的URL,并以Scrapy spider获取到的形式展现。 有些时候spider获取到的页面和普通用户看到的并不相同,一些动态加载的内容是看不到的, 因此该命令可以用来检查spider所获取到的页面。
version
语法: scrapy version [-v]
输出Scrapy版本。配合 -v 运行时,该命令同时输出Python, Twisted以及平台的信息。
--项目命令
crawl
语法: scrapy crawl <spider_name>
使用你项目中的spider进行爬取,即启动你的项目。这个命令将会经常用到,我们会在后面的内容中经常使用。
check
语法: crapy check [-l] <spider>
运行contract检查,检查你项目中的错误之处。
list
语法: scrapy list
列出当前项目中所有可用的spider。每行输出一个spider。
genspider
语法: scrapy genspider [-t template] <name> <domain>
在当前项目中创建spider。该方法可以使用提前定义好的模板来生成spider。您也可以自己创建spider的源码文件。
view使用浏览器打开网页
scrapy view http://www.baidu.com
shell命令, 进入scrpay交互环境
#进入该url的交互环境
scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/
之后便进入交互环境
我们主要使用这里面的response命令, 例如可以使用
response.xpath() #括号里直接加xpath路径
runspider命令用于直接运行创建的爬虫, 并不会运行整个项目
scrapy runspider 爬虫名称
为什么Scrapy 采用命令行创建和运行爬虫?
命令行(不是图形界面)更容易自动化,合适脚本控制
本质上, Scrapy 是给程序员用的,功能(而不是界面)更重要
生成的工程目录
python123demo/ 外层目录
scrapy.cfg 部署 Scrapy 爬虫的配置文件
python123demo/ Scrapy 框架的用户自定义 python代码
__init__.py 初始化脚本
items.py Items 代码模版(继承类)
middlewares.py Middlewares 代码模版(继承类)
pipelines.py Pipelines 代码模版(继承类)
settings.py Scrapy 爬虫的配置文件
spiders/ Spiders 代码模版目录(继承类)
__init__.py 初始文件,无需修改
__pycache__/ 缓存目录,无需修改
parse() 用于处理响应,解析内容形成字典,发现新的URL爬取请求
Scrapy 爬虫的数据类型
Request 类
class scrapy.http.Request()
Request 对象表示一个HTTP请求
由 Spider 生成,由 Downloader 执行
.url Request 对应的请求URL
.method 对应的请求方法,‘GET’'POST'等
.headers 字典类型风格的请求头
.body 请求内容主体,字符串类型
.meta 用户添加的扩展信息,在 Scrapy 内部,模块间传递信息使用
.copy() 复制该请求
Response 类
class scrapy.http.Response()
Response 对象表示一个HTTP请求
由 Downloader 生成,由 Spider 执行
.url Response 对应的请求URL
.status HTTP 状态码,默认200
.headers Response 对应的头部信息
.body Response 对应的内容信息,字符串类型
.flags 一组标记
.request 产生 Response 类型对应的 Response 对象
.copy() 复制该请求
Item 类
class scrapy.item.Request()
Item 对象表示一个从HTML页面中提取的信息内容
由 Spider 生成,由 Item Pinpeline 执行
Item 类似字典类型,可以按照字典类型操作
CSS Selector 的基本使用
<html>.css('a::attr(href)').extract()
Scrapy 爬虫框架结构
Downloader Middleware
目的:实施 Engine,Scheduler,Downloader 之间进行用户可配置的控制
功能:修改,丢弃,新增请求或响应
Spider
解析 Downloader 返回的响应 (Response)
产生爬取项 (scraped item)
产生额外的爬取请求 (Request)
Item Pinpelines
以流水线方式处理 Spider 产生的爬取项
有一组操作顺序组成,类似流水线,每个操作是一个 Item Pinpeline 类型
可能操作包括:清理,检验和查重爬取项中的HTML数据,将数据存储到数据库
需要用户编写配置代码
Spider Middleware
目的:对请求和爬取项的再处理
功能:修改,丢弃,新增请求或爬取项
需要用户编写配置代码
yield 关键字
yield 生成器
生成器是一个不断产生值的函数
包含yield语句的函数是一个生成器
生成器每次产生一个值(yield语句),函数被冻结,被唤醒后在产生一个值
为何要有生成器?
生成器相比一次列多所有内容的优势
更节省存储空间
响应更迅速
使用更灵活