Python数据爬取

4,388次阅读
没有评论

文章目录

  • 一.数据爬取介绍
    • 1.数据采集
    • 2.常用数据爬取工具
  • 二.Scrapy爬虫框架
    • 1.安装配置Scrapy框架
    • 2.Debug爬虫工程
    • 3.Scrapy框架组成
    • 4.Scrapy返回爬取页面数据
    • 5.爬取动态网页
    • 6.网站反爬虫

一.数据爬取介绍

1.数据采集

数据来源

  • 从网上爬取数据(crawling)
  • 从本地系统收集数据(scraping):文件、数据库等

网络数据采集模型
Python数据爬取

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

  • 框架配置模块

Python数据爬取
执行顺序:

  • 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源码是不同的

Python数据爬取

爬虫处理动态网页的方法

  • 解决方法
    分析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免费测试

相关文章:

版权声明:Python教程2022-10-27发表,共计4146字。
新手QQ群:570568346,欢迎进群讨论 Python51学习