Python数据爬取
数据采集
- 数据来源
- 从网上爬取数据(crawling)
- 从文件系统收集数据(scraping)
- 文件、数据库等
- 网络数据采集模型
常用数据爬取工具
- 第三方库实现爬取
- Requests、lxml
- 灵活、简单
- Requests、lxml
- PySpider爬虫框架
- 提供WebUI界面编写及管理爬虫
- 上手快,学习简单
- 对Windows操作系统支持很差
- Scrapy爬虫框架
- 功能强大
- 可定制性强
- 多线程,爬取效率高
安装配置Scrpy框架
- 安装Scrapy
- conda install scrapy
- 配置Scrapy环境变量
- 将Anaconda的Scripts文件夹加入到Path环境变量中
- 创建Scrapy项目的命令
- scrapy startproject 新工程名
- 创建Spider
- scrapy genspider 爬虫名 start_url
- 修改parse()方法,在控制台输出文本
- scrapy genspider 爬虫名 start_url
- 启动Spider
- scrapy crawl 爬虫名
Debug爬虫名称
- 使用Python脚本执行命令行启动爬虫
- 在项目根目录添加脚本文件
- 调用Scrapy框架的命令行执行方法启动爬虫
- cmdline模块
- execute()方法
from scrapy.cmdline import execute
execute('scrapy crawl example_spider'.split())
- 调试爬虫
- 在parse()方法中设置断点
- 使用Debug模式调试项目
Scrapy框架组成
- spiders文件夹
- 定义爬虫文件
- items.py
- 定义框架内数据传输格式
- pipelines.py
- 数据保存模块
- middlewares.py
- 中间件模块
- settings.py
- 框架配置模块
- 框架配置模块
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元素相关联
- 正则表达式
- 提取非标签内容
xpath语法(一)
- xpath
- 使用路径表达式来选取XML文档中的节点或节点集
表达式 | 描述 |
---|---|
nodename | 选取的节点名 |
/ | 从根节点选取 |
// | 选取所有符合条件的节点,而不考虑它们的位置 |
· | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
路径表达式举例
路径表达式 | 结果 |
---|---|
/bookstore | 选取元素bookstore |
/bookstore/book | 选取属于bookstore的子元素的所有book元素 |
//book | 选取所有book子元素,而不管它们在文档中的位置 |
/bookstore//book | 选取属于bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置 |
//@lang | 选取名为lang的所有属性 |
/bookstore/book/text() | 选取属于bookstore的子元素的所有book元素的文本 |
xpath语法(二)
- 谓语
- 谓语用来查找某个特定节点或者包含某个指定的值的节点
- 谓语被嵌在方括号中
路径表达式 | 结果 |
---|---|
/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
- extract()
爬取从页面提取的URL
- 使用场景
- 详情页爬取
- 多层级目录爬取
- 提取URL发起HTTP请求
- 构造request对象
- 指定HTTP请求的URL
- 指定处理这个页面的回调方法
- 关闭去重标记
- 使用yield返回request对象
- 构造request对象
- request与对应的response传递数据
- meta字典
Scrapy的item模块
- item的作用
- 定义框架中的数据传输的形式
- 定义item
- 定义item类并继承scrapy.Item
- 定义变量
- 变量名
- 变量类型
- scrapy.Field()
- 使用item
- 使用字典的方式给item赋值
- item[“变量名”]=赋值
- 使用字典的方式给item赋值
- 使用yield返回item
将爬取数据保存到文件中
- Feed exports
- 将数据导出成常用数据格式的方法
- 默认支持的格式
- JSON
- JSON lines
- CSV
- XML
- 使用Feed exports的方法
- 在命令行使用-o来调对应的Feed exports
- 在setting.py中配置Feed exports
FEED_FORMAT = 'CSV'
FEED_URI = ‘quotes.csv’
爬取动态网页
- 查看动态网页代码
- 按住F12返回的html结果
- 鼠标右键查看页面源代码
- 淘宝的商品详情页中的原始html中没有价格
- 动态网页的特点
- 渲染后的html源码和渲染前的html源码是不同的
网站反爬虫
- 网站最主要的反爬虫原因
- 不遵守规范的爬虫会影响网站的正常使用
- 网站反爬虫的其他原因
- 网站上的数据就就是公司的重要资产
- 爬虫对网站的爬取会造成网站统计数据的污染
- 网站反爬虫手段举例
- 根据访问IP频率封禁IP
- 一个IP某一个时刻访问频率太频繁,则封禁
- 设置账号登录时长,账号访问过多封禁
- 弹出数字验证码和图片确认验证码
- 对API接口的限制
- 根据访问IP频率封禁IP
爬虫的反反爬策略
- 反反爬的总体思想
- 将爬虫伪装成自然人的浏览行为
- 自然人浏览的特点
- 访问频率不会非常的高
- 使用的是浏览器进行访问
- 网站设置登录要求后仍能正常使用
- 可以完成验证操作
- Scrapy反反爬功能实现
- 爬虫配置settings.py
- 爬虫框架中间件
模拟自然人访问频率
- 配置settings.py控制爬虫爬取行为
- 设置爬取间隔
- 设置并发爬取量
- 相关配置
配置 | 默认值 | 说明 |
---|---|---|
DOWNLOAD_DELAY | 0 | 单位秒,爬取间隔时间为(0.5~1.5)*DOWNLOAD_DELAY |
CONCURRENT_REQUESTS_PER_DOMAIN | 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 http://www.qq.com
- request.headers
Scrapy设置随机UA
- 建立user-agent池
- 在每次发送request之前从agent池中随机选取一项设置request的User-Agent
- 编写的UserAgent中间件的基类
- 自定义RotateUserAgentMiddleware类
- 继承UserAgentMiddleware
- 自定义RotateUserAgentMiddleware类
- 设置settings.py文件设置相应的配置和属性
- 在DOWNLOADER_MIDDLEWARES下配置中间件
- 启用自定义UserAgent中间件
- 禁用Scrapy默认的UserAgent中间件
- 在DOWNLOADER_MIDDLEWARES下配置中间件
Cookie的介绍
- Cookie保存的位置
- 总是保存在用户客户端浏览器中
- Cookie的有效性
- 最短的浏览器关闭后就消失了
- 最长是可以一直保存,直到被删除
- Cookie就是用来绕开HTTP的无状态性的
- 服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器的状态
- Cookie常用于保持用户登录状态
查看Cookie
-
打开网页时请求中携带的Cookie
-
打开网页时服务器设置客户端的Cookie
使用Cookie使爬虫突破登录限制
- 使用Cookie实现爬取需要登录的信息
- 定义Cookie字符串
- 在settings.py中定义DEFAULT_COOKIE字符串
- 在构造request是设置Cookie属性
- cookies=DEFAULT_COOKIE
- 定义Cookie字符串
- 使用Cookie登录的优缺点
- 优点:
- 不需要知道登录url和表单字段以及其他参数
- 不要频繁登录输入用户名和密码
- 缺点:
- Cookie有过期时间
- 优点: