文章目录
- 一.数据爬取介绍
-
- 1.数据采集
- 2.常用数据爬取工具
- 二.Scrapy爬虫框架
-
- 1.安装配置Scrapy框架
- 2.Debug爬虫工程
- 3.Scrapy框架组成
- 4.Scrapy返回爬取页面数据
- 5.爬取动态网页
- 6.网站反爬虫
一.数据爬取介绍
1.数据采集
数据来源
- 从网上爬取数据(crawling)
- 从本地系统收集数据(scraping):文件、数据库等
网络数据采集模型
2.常用数据爬取工具
第三方库实现爬取
- Requests、lxml:灵活,简单
PySpider爬虫框架
- 提供WebUI界面编写及管理爬虫
- 上手快,学习简单
- 对Windows操作系统支持很差
Scrapy爬虫框架
- 功能强大
- 可定制性强
- 多线程,爬取效率高
二.Scrapy爬虫框架
1.安装配置Scrapy框架
安装Scrapy
- conda install scrapy
配置Scrapy环境变量
- 将Anaconda的Scripts文件夹加入到Path环境变量中
创建scrapy项目的命令
- scrapy startproject 新工程名
创建Spider
- scrapy genspider 爬虫名 start_url
- 修改parse()方法,在控制台输出文本
启动Spider - scrapy crawl 爬虫名
2.Debug爬虫工程
使用Python脚本执行命令行启动爬虫
- 在项目根目录添加脚本文件
- 调用Scrapy框架的命令行执行方法启动爬虫: cmdline模块 execute()方法
from scrapy.cmdline import execute execute('scrapy crawl examplespider'.split())
调试爬虫
- 在parse()方法中设置断点
- 使用Debug模式调试项目
3.Scrapy框架组成
spiders文件夹
- 定义爬虫文件
items.py
- 定义框架内数据传输格式
pipelines.py
- 数据保存模块
middlewares.py
- 中间件模块
settings.py
- 框架配置模块
执行顺序:
- 1.Spider的yield将requests发送给Engine
- 2.Engine对requests不做任何的处理就发送给Scheduler
- 3.Scheduler(url调度器),生成requests交给Engine
- 4.Engine拿到requests,通过middleware进行层层过滤发送给Downloader
- 5.downloader在网上获取到response数据之后,又经过middleware进行层层过滤发送给Engine
- 6.Engine获取到response之后,返回给Spider,Spider的parse()方法对获取到的response数据进行处理解析出items或者requests
- 7.将解析出来的items或者requests发送给Engine
- 8.Engine获取到items或者requests,将items发送给ITEMPIPELINES,将requests发送给Scheduler只有当调度器中不存在任何的requests的时候,整个程序才会停止( 也就是说,对于下载失败的URL,scrapy也会重新进行下载)
4.Scrapy返回爬取页面数据
通过解析方法返回爬取页面数据
- parse()方法的response参数
- response对象常用属性和方法
url | 当前返回数据所对应的页面url |
status | http请求状态码 |
meta | 用于request与response之间的数据传递 |
body | 返回页面html源码,如用纯正则表达式匹配数据需要获得页面html源码 |
xpath() | 使用xpath选择器解析网页 |
css() | 使用css选择器解析网页 |
在Scrapy爬虫框架中提取网页数据的方法
-
xpath选择器
-
用于选择XML文档中的节点的语言,可以与HTML一起使用
-
css选择器
-
用于将样式应用于HTML文档的语言
-
将样式与特定的HTML元素相关联
-
Scrapy中css选择器的代码最后也会转换成xpath选择器的代码
-
正则表达式
-
提取非标签内容
xpath语法
- xpath:使用路径表达式来选取 XML 文档中的节点或节点集
nodename | 选取的节点名 |
/ | 从根节点选取 |
// | 选取所有符合条件的节点,而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
路径表达式举例
/bookstore | 选取根元素 bookstore |
/bookstore/book | 选取属于 bookstore 的子元素的所有 book 元素 |
//book | 选取所有 book 子元素,而不管它们在文档中的位置 |
/bookstore//book | 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置 |
//@lang | 选取名为 lang 的所有属性 |
/bookstore/book/text() | 选取属于 bookstore 的子元素的所有 book 元素的文本 |
谓语
- 谓语用来查找某个特定节点或者包含某个指定的值的节点
- 谓语被嵌在方括号中
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素 |
//title[@lang=‘eng’] | 选取所有拥有值为 eng 的 lang 属性的 title 元素 |
xpath选择器
-
Scrapy中xpath选择器
基于lxml库 -
获取选择器的网页数据
extract()
提取selector列表中的网页数据
如果列表为空,取下标为0的网页数据会抛出异常
extract_first()
提取selector列表中下标为0的网页数据
如果列表为空,不会抛出异常,返回None
爬取从页面提取的URL
- 使用场景
详情页爬取
多层级目录爬取 - 提取URL发起HTTP请求
构造request对象
指定HTTP请求的URL
指定处理这个页面的回调方法
关闭去重标记
使用yield返回request对象 - request与对应的response传递数据
meta字典
Scrapy的item模块
- item的作用
定义框架中数据传输的形式 - 定义item
定义Item类并继承scrapy.Item
定义变量
变量名
变量类型
scrapy.Field() - 使用item
使用字典的方式给item赋值
item[“变量名”] = 赋值 - 使用yield返回item
将爬取数据保存到文件中
- Feed exports
将数据导出成常用数据格式的方法 - 默认支持的格式
JSON
JSON lines
CSV
XML - 使用Feed exports的方法
在命令行中使用-o来调对应的Feed exports
在settings.py中配置Feed exports
FEED_FORMAT = 'CSV' FEED_URI = ‘quotes.csv’
5.爬取动态网页
查看动态网页代码
- 按住F12返回的html结果
- 鼠标右键查看页面源代码:淘宝的商品详情页中的原始html中居然没价格
动态网页的特点
- 渲染后的html源码和渲染前的html源码是不同的
爬虫处理动态网页的方法
- 解决方法
分析js请求以及html源码去发现动态加载数据的位置
找到ajax并去请求该接口并解析该请求的返回 - 分析步骤
使用Chrome的Network监控网络请求
反复触发动态加载,分析出数据接口url
6.网站反爬虫
网站最主要的反爬虫原因
- 不遵守规范的爬虫会影响网站的正常使用
网站反爬虫的其他原因
- 网站上的数据就是公司的重要资产
- 爬虫对网站的爬取会造成网站统计数据的污染
网站反爬虫手段举例
- 根据访问IP频率封禁IP:一个IP某一个时刻访问频率太频繁,则封禁
- 设置账号登陆时长,账号访问过多封禁
- 弹出数字验证码和图片确认验证码
- 对API接口的限制
爬虫的反反爬策略
- 反反爬的总体思想
将爬虫伪装成自然人的浏览行为 - 自然人浏览的特点
访问频率不会非常的高
使用的是浏览器进行访问
网站设置登录要求后仍能正常使用
可以完成验证操作 - Scrapy反反爬功能实现
爬虫配置settings.py
爬虫框架中间件
模拟自然人访问频率
- 配置settings.py控制爬虫爬取行为
设置爬取间隔
设置并发爬取量
相关配置如下
DOWNLOAD_DELAY | 0 | 单位秒,爬取间隔时间为(0.5~1.5)*DOWNLOAD_DELAY |
CONCURRENT_REQUESTS | 16 | Scrapy downloader 并发请求的最大值 |
CONCURRENT_REQUESTS_PER_DOMAIN | 16 | 对单个网站进行并发请求的最大值 |
CONCURRENT_REQUESTS_PER_IP | 0 | 对单个IP进行并发请求的最大值 |
User Agent介绍
- User Agent的本质
一个特殊字符串头 - User Agent的作用
使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等 - 查看浏览器UA的方法
- 查看Scrapy爬虫UA的方法
scrapy shell https://www.qq.com
request.headers
Scrapy设置随机UA
- 安装UA生成库
pip install user_agent - 编写的UserAgent中间件的类
重写process_request()方法 - 设置settings.py文件设置相应的配置和属性
在DOWNLOADER_MIDDLEWARES下配置中间件
启用自定义UserAgent中间件
禁用Scrapy默认的UserAgnet中间件
Cookie的介绍
- Cookie保存的位置
总是保存在用户客户端浏览器中 - Cookie的有效性
最短的浏览器关闭后就消失了
最长是可以一直保存,直到被删除 - Cookie就是用来绕开HTTP的无状态性的
服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器的状态 - Cookie常用于保持用户登录状态
- 打开网页时请求中携带的Cookie
- 打开网页时服务器设置客户端的Cookie
使用Cookie使爬虫突破登录限制
- 使用Cookie实现爬取需要登录的信息
定义Cookie字符串
在构造request时设置Cookie属性
cookies=SCRAPE_COOKIE - 使用Cookie登录的优缺点
优点:
不需要知道登录url和表单字段以及其他参数
不需要频繁登录输入用户名和密码
缺点:
Cookie有过期时间
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试