功能强大的网络爬虫框架
不是一个简单的函数功能库,而是一个爬虫框架
爬虫框架:是实现爬虫功能的一个软件结构和功能组件集合,是一个半成品,能够根据用户需求帮助用户快速实现专业网络爬虫,约束了一个使用模板。
ENGINE :控制所有模块的数据流并根据条件出发事件进行出发(不需要用户修改)
Downloader Middleware(中间界):实施Engine、Scheduler和Downloader之间的数据流进行用户可配置的控制,即通过中间界的编写修改、丢弃、新增请求或相应。(用户可以 编写代码,也可以不改)
DOWNLOADER:根据用户提供的请求下载网页(不需要用户修改)
SCHEDULER:对所有爬取请求进行调度管理;很多爬取请求先调度的问题(不需要用户修改)
SPIDERS:解析Downloader返回的响应(Response),产生爬取项(scrapy item),产生额外的爬取请求;向整个框架提供了最初始的访问连接,同时对每次爬取回来的内容进行解析再次产生新的爬取请求(因为使用了yield),并且从内容提取出相关的数据;是最核心的单元(自己写)
Spider Middleware(spider和engine之间的中间界): 对请求和爬取项进行再处理。功能:修改、丢弃、新增请求或爬取项。(用户可以编写代码)
ITEM PIPELINES:以流水线处理spiders产生的爬取项,由一组操作顺序组成,类似流水线,每个操作是一个Item Pipeline类型。可能操作包括:对Item进行清理、检验和查重爬取项中的HTML数据、将数据存储到数据库。完全有用户编写和定义。用户需要关注如何使用爬取出来的数据
同:
异:
requests:页面级爬虫; 功能库; 并发性考虑不足,性能较差; 重点在于页面下载; 定制灵活; 上手十分简单。
Scrapy: 网站级爬虫; 框架(更改为支撑一个爬虫的整体结构);并发性好(可以向多个网站同属发起请求),性能较高;重点在于爬取结构(配置型的代码编写); 一般使用灵活,深度定制困难; 入手稍微较难一点。
=====================================================================
对于非常小的网络爬取请求用requests,
不太小的需求,持续的不间断的想形成爬取库用scrapy
定制程度很高的需求(不考虑规模),自搭框架,requests>Scrapy(5+2结构此时会成为限制)。
安装:pip install scrapy
建议在pythoncharm下安装,命令行安装参考 使用pip安装scrapy过程
在pycharm下也是需要手动安装好wheel、lxml和twisted,都是pip install scrapy格式,都安装完成后看看有没有成功运行
scrapy -h
显示这个就是成功了。
Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行
scrapy < command >[options][args]
工程与爬虫的关系:
一个工程是一个最大的单元 ,一个工程可以相当于一个大的Scrapy框架,在Scrapy框架中可以有多个爬虫,每个爬虫相当于框架中一个Spider模块。
Scrapy使用命令行进行操作原因:并不是为了给用户操作使用的,命令行(不是图形界面)更容易自动化,适合脚本控制。程序更关心指令,用户才更关心图形界面。本质上是给程序员用的,功能而不是界面更重要
用实例说明步骤:
1.产生一个scrapy爬虫框架
scrapy startproject python123demo#创建一个名为python123demo的新工程
可以看见生成了一个文件
打开文件:
可以看到这些目录
2. 在工程中产生一个Scrapy爬虫
输入scrapy genspider demo python123.io
产生一个名为demo的爬虫
D:\python123demo>scrapy genspider demo python123.io
可以看见在spider目录下增加了一个代码demo.py
打开:
3. 配置产生的spider爬虫
修改demo.py文件
import scrapy
class DemoSpider(scrapy.Spider):
name = 'demo'
#allowed_domains = ['python123.io']
start_urls = ['http://python123.io/ws/demo.html']#更改链接成所要爬取的链接
def parse(self, response): #对返回页面进行解析、操作。response即返回的对象
fname = response.url.split('/')[-1]
with open(fname,'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % fname)#将网页内容保存为一个HTML文件
4.运行爬虫,获取网页
命令行输入:scrapy crawl demo
运行爬虫demo
D:\python123demo>scrapy crawl demo
yield是python3中33个关键字之一;
名为生成器——一个不断产生值的函数;
一个函数包含yeild语句这个函数就是一个生成器;
生成器每次运行的时候回产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值(与被冻结时候的位置一致);
每次执行就会产生一个数据,多次执行就会源源不断产生很多值。
写法:一般与循环搭配
def gen(n):
for i in range(n):
yeild i**2#执行到这就被冻结,当前yield这一行产生的值会被返回出来,首先产生0的平方值然后逐渐遍历这个循环
优势(相比列表):更好节省存储空间;具有更快的响应速度;使用更加灵活
每调用一次只产生一个值,这个值返回之后再调用产生第二个值,只使用一个存储空间
Request类:向网络上提交请求的内容
表示一个request类对象,,表示一个HTTP请求
由spider生产,由Downloader执行
与requests不同但是很相似
6个常用属性或方法:
Response类:从网页中爬取内容的封装类
Response对象表示一个HTTP响应
由于Downloader生产,由Spider处理
7个常用属性或方法
Item类:由Spider产生的信息封装的类
对象表示从一个HTML页面中提取的信息内容
由spider生产,由Item Pipeline处理
Item类似字典类型,可以按照字典类型进行操作
scrapy爬虫提取信息方法
Beautiful Soup
Ixml
re
XPath Selector
Css Selector
国际公认的HTML提取方法之一## 标题
< HTML>.css(‘a::attr(href)’).extract()
(标签名称。标签属性)
由W3C组织维护并规范