网络爬虫之框架
1.scrapy爬虫框架介绍
1.1.scrapy爬虫框架介绍
安装方法:
简要地说,Scrapy不是一个函数功能库,而是一个快速功能强大的网络爬虫框架。
(爬虫框架是实现爬虫功能的一个软件结构和功能组件集合,是一个半成品,能够帮助用户实现专业网络爬虫。)
scrapy爬虫框架的组成如下:
用户提交的网络请求以及从网络上获取的信息形成数据流,在这些模块间流动。
数据流的路径有:
数据流的出入口:
框架中有两个模块是需要用户编写的(可理解为 为框架进行配置),另外的三个是已经实现的。
1.2.scrapy爬虫框架解析
Engine
(1) 控制所有模块之间的数据流
(2) 根据条件触发事件
(3)不需要用户修改
Downloader
(1)根据请求下载网页
(2)不需要用户修改
Scheduler
(1)对所有爬取请求进行调度管理
(2)不需要用户修改
Downloader Middleware(Middleware是中间设备之意)
(1)目的:实施Engine、 Scheduler和Downloader之间进行用户可配置的控制
(2)功能:修改、丢弃、新增请求或响应
(3)用户可以编写配置代码
Spider
(1) 解析Downloader返回的响应(Response)
(2) 产生爬取项(scraped item)
(3) 产生额外的爬取请求(Request)
(4)需要用户编写配置代码
Item Pipelines
(1) 以流水线方式处理Spider产生的爬取项
(2) 由一组操作顺序组成,类似流水线,每个操作是一个Item Pipeline类型
(3) 可能操作包括:清理、检验和查重爬取项中的HTML数据、将数据存储到数据库
(4)需要用户编写配置代码
1.3.requests库和scrapy爬虫的比较
相同点:
两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线
两者可用性都好,文档丰富,入门简单
两者都没有处理js、提交表单、应对验证码等功能(可扩展)
具体区别:
那么选用哪个技术路线开发爬虫呢?
具体看情况,对于非常小的需求,使用requests库;对于不太小的需求,使用Scrapy框架。
而对于定制程度很高的需求(不考虑规模),最好选择自搭框架(requests > Scrapy)。
1.4.scrapy爬虫的常用命令
Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行。命令格式:
常用的命令:
为什么Scrapy采用命令行创建和运行爬虫?
命令行(不是图形界面)更容易自动化,适合脚本控制。而本质上,Scrapy是给程序员用的,功能(而不是界面)更重要。
2.scrapy爬虫框架介绍
2.1.scrapy爬虫的第一个实例
演示HTML页面地址:http://python123.io/ws/demo.html
首先要有一个概念:应用Scrapy爬虫框架主要是编写配置型代码
实例步骤:
步骤1:建立一个Scrapy爬虫工程
选取一个目录(如E:\Code\),然后执行如下命令:
scrapy startproject mydemo
等待一段时候后,可以看到输出如下:
而在对应目录下有python123demo这个文件夹(其实就是工作目录)生成
工作目录的细节解释:
而spiders目录的内部目录解释如下,用户自定义的spider代码就是增加在此处。
步骤2:在工程中产生一个Scrapy爬虫
进入工程目录(E:\Code\python123demo),然后执行如下命令:
scrapy genspider demo python123.io
该命令作用:
(1) 生成一个名称为demo的spider
(2) 在s**piders目录下增加代码文件**demo.py
注意:该命令仅用于生成demo.py,该文件也可以手工生成
对应输出:
打开demo.py后,显示如下:
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = "demo"
allowed_domains = ["python123.io"]
start_urls = (
'http://www.python123.io/',
)
def parse(self, response):
pass
其中parse()用于处理响应,解析内容形成字典,发现新的URL爬取请求。
步骤3:配置产生的spider爬虫
配置:(1)初始URL地址 (2)获取页面后的解析方式
修改demo.py为:
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = "demo"
#allowed_domains = ["python123.io"]#可选
#配置初始URL地址
start_urls = (
'http://www.python123.io/ws/demo.html',
)
def parse(self, response):
#配置获取页面后的解析方式:将捕获页面存储在demo.html
fname=response.url.split('/')[-1]
with open(fname,'wb') as f:
f.write(response.body)
self.log('Save file %s.'% fname)
步骤4:运行爬虫,获取网页
在命令行下,执行如下命令:
scrapy crawl demo
显示的部分效果为:
demo爬虫被执行后,捕获页面存储在demo.html。打开python123demo目录,可以看到demo文件。
至此,第一个实例已经完成了。
而在实际使用scrapy库时,在实际编写代码的时候,将上面的demo.py改写成如下的形式(等价的)会更好。
# -*- coding: utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):
name = "demo"
#allowed_domains = ["python123.io"