爬虫 — 反爬

2023-11-17

一、UA 反爬

UA(User Agent):用户代理,是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

在这里插入图片描述

# 1. 导入模块
import requests  # 第三方库,用于 HTTP 请求和响应

# UA 反爬
head = {
    'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
}

# 2. 确定 url:分析是动态加载还是静态加载
response = requests.get(" https://www.baidu.com/", headers=head)
print(response)  # 200 代表请求成功
print(response.request.headers)  # 返回此响应的请求对象中的请求头数据字典
print(response.text)  # 内容获取

二、Cookie 验证与反爬

1、Cookie 简介

Cookie 实际上是一小段的文字信息key - value 格式)。浏览器向服务器发起请求,如果服务器需要记录该状态,服务器就会向浏览器颁发一个 Cookie 。浏览器会把 Cookie 保存起来。当浏览器再请求该服务器时,浏览器把请求的网址连同该 Cookie 一同提交给服务器。服务器检查该 Cookie,以此来辨认浏览器状态。

2、使用 Cookie 原因

浏览器与 Web 服务器之间是使用 HTTP 协议进行通讯的,而 HTTP 协议本身是无状态的。这时就需要一个能保存访问状态的信息,去告诉服务器我已经访问过了,这个信息就可以使用 Cookie 来保存。

3、Cookie 作用

可以用来保存用户使用浏览器访问网站的状态用户信息

3.1、模拟登录

清除 Cookie 就会需要重新登录

# 需求:获取qq空间的源码内容

# 导入模块
import requests  # 第三方库,用于 HTTP 请求和响应

# 指定 url
url = 'https://user.qzone.qq.com/1239079951/'

# 设置请求头参数
head = {
    'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'cookie' : 'welcomeflash=1239079951_58028; 1239079951_todaycount=0; 1239079951_totalcount=711; zzpaneluin=; zzpanelkey=; _qpsvr_localtk=0.7968639470198942; pgv_pvid=2658927712; pgv_info=ssid=s6023428415; uin=o1239079951; skey=@a2rnf3d2i; RK=Pj/cU4cYQh; ptcz=bee843eefb32a24e3fbb4779c00f3b4c63e2147d141bfab48ec2d373876a69fc; p_uin=o1239079951; pt4_token=oAjhJ-Oz3bRCQxzVp1h5a-a0pVPqpKqQoY1zuBFJVSk_; p_skey=XeyEpGYXjpRu7BXRy0X9ziStf01fdmTm8aYrLjWtB0E_; Loading=Yes; qz_screen=1707x960; QZ_FE_WEBP_SUPPORT=1'
}

# 发请求,获取响应
res = requests.get(url, headers=head)

# 获取数据内容
print(res.text)

# 存储数据到网页
with open('qq.html', 'w', encoding='utf-8') as f:
    f.write(res.text)

3.2、反反爬

# 需求:12306 获取车次,商务座,一等座,二等座车票信息

# 导入模块
import requests  # 第三方库,用于 HTTP 请求和响应

# 确定 url,动态加载
url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2023-05-10&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT'

# 请求头
head = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'Cookie': '_uab_collina=168318675077602254447501; JSESSIONID=C5AA287034ADDC01F700CDA3D9EE46D2; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_wfdc_flag=dc; _jc_save_fromDate=2023-05-10; BIGipServerotn=2280128778.50210.0000; BIGipServerpassport=820510986.50215.0000; fo=w8uwzem75d825acts7YB1-2Bj97FKHZ78kByS5lyysh0IxfhP_uETE4wnK33Yo8kl4iHJ4i6APzKUi_i9eCKSkcy49YyQobD21EHjKr2nl_AwYwjoBRMxTekPqrkAguvB1KD96WmtXrXGXSvuKQdfXZnZqu7EeUY6ieU93J0lpqamZUqq0piTKoPq0s; route=9036359bb8a8a461c164a04f8f50b252; _jc_save_toDate=2023-05-09'
}

# 发请求
res = requests.get(url, headers=head)

# 打印文本内容
# print(res.text)  # 输出数据为 json 格式

# 打印内容
json_data = res.json()  # 将 json 格式的数据自动转换
result = json_data['data']['result']
# print(result)

# 数据拆分
# data = result[2]  # 找到一个数据比较全的
# datas = data.split("|")  # 将数据拆分成列表
# print(datas)

# 枚举获取数据对应下标
# for index,value in enumerate(datas):
#     print(index,value)  # 车次3 特等座32 一等座31 二等座30

# 循环打印目标数据
for i in result:
    data = i.split("|")
    print(f'车次为{data[3]},特等座为{data[32]},一等座为{data[31]},二等座为{data[30]}')

三、Referer 反爬

Referer:是 header 的一部分,当浏览器向 Web 服务器发送请求的时候,一般会带上 Referer,用来表示从哪儿链接到当前的网页。

# 需求:获取梨视频中的视频

# 导入模块
import requests  # 第三方库,用于 HTTP 请求和响应

# 确定 url
url = 'https://www.pearvideo.com/videoStatus.jsp?contId=1198526&mrd=0.44597986044359117'

# 请求头
referer = 'https://www.pearvideo.com/video_1198526'
head ={
    'Referer': referer
}

# 发送请求
res = requests.get(url, headers=head)

# 获取数据
data = res.json()  # 将 json 格式的数据自动转换
src_url = data['videoInfo']['videos']['srcUrl'] # 找到视频 url

# https://video.pearvideo.com/mp4/short/20171114/1683772197751-11122362-hd.mp4 爬取的视频链接
# https://video.pearvideo.com/mp4/short/20171114/cont-1198526-11122362-hd.mp4 真实视频链接
# 1683772197751 替换 cont-1198526
# replace(old, new)

# 找到时间戳
systemTime = data['systemTime']

# 获取编号
id = 'cont-' + referer.split('_')[1]

# 时间戳替换成视频 id
video_url = src_url.replace(systemTime, id)
print(video_url)

# 向视频 url 发请求
res1 = requests.get(video_url)

# 视频文件是二进制 —— wb 模式
with open('v1.mp4','wb') as f:
    f.write(res1.content)

记录学习过程,欢迎讨论交流,尊重原创,转载请注明出处~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫 — 反爬 的相关文章

随机推荐

  • c++的常用库

    c 的常用库 C 资源大全 关于 C 框架 库和资源的一些汇总列表 内容包括 标准库 Web应用框架 人工智能 数据库 图片处理 机器学习 日志 代码分析等 标准库 C 标准库 包括了STL容器 算法和函数等 C Standard Libr
  • 用C++封装一个Ocr文字识别程序,离线识别,完全免费

    程序封装了RapidOcr模块 源文件路径Tree信息如下 文件夹 PATH 列表 卷序列号为 43EE 6931 D build windows bat CMakeLists txt CMakeSettings json Ocr cpp
  • Centos7版本的安装超级详细

    Centos7的安装超级详细 关于Centos版本下载地址 https archive kernel org centos vault CentOS 7 0 1406 x86 64 DVD iso 标准安装版 一般下载这个就可以了 Cent
  • 线程创建的三种方法

    继承Thread类 1 继承Thread类 2 重写run 方法 3 调用start 方法开启线程 public class testThread1 extends Thread Override public void run run 方
  • Qt浅谈之一:内存泄露(总结)

    一 简介 Qt内存管理机制 Qt 在内部能够维护对象的层次结构 对于可视元素 这种层次结构就是子组件与父组件的关系 对于非可视元素 则是一个对象与另一个对象的从属关系 在 Qt 中 在 Qt 中 删除父对象会将其子对象一起删除 C 中del
  • 谷歌chrome浏览器的源码分析(一)

    随着网络技术的发展 越来越多应用都已经离不开网络 特别像人类大脑一样的知识库的搜索引擎 更加是离不开功能强大的云计算 不过 即便云计算非常强大 但它还不能直接地把结果呈现给用户 这样就需要一个客户端来呈现出来 这个客户端就是浏览器 现在越来
  • 归并排序(分析与模板)

    归并排序 思路 1 确定分界元素mid left right 2 2 递归分解数组 两两组合组成两个有序数组 3 归并 合二为一 int temp 100010 merge sort int num int l int r if l gt
  • std::thread线程命名

    也可以参考我另外一篇文章 另外一篇更详细些 为线程设置名字的最大的好处是在程序出错时 它会出现在 GDB 的出错信息里 可以更快地定位问题 有两种方法可以给线程设置名字 一种在线程的调用函数内部设置 还有一种是在外部对指定线程变量做设置 i
  • 【软件测试】未来软件测试必备的8大技能,你缺少哪几个?

    软件测试工程师是个神奇的职业 他是开发人员与老板之间的传话筒 三夹板 也是开发人员与老板的好帮手 他不仅需要有销售的沟通能力 也需要具备编辑人员的文档撰写技巧 如此一个面面俱到的岗位 他需要具备的技能到底有哪些呢 有逆向思维的能力 曾经采访
  • 算法:两个有序数组合并成一个有序数组 java语言

    题目 有两个有序数组a 和b 将它们合并成数组c 需要c 也是有序数组 思路 新建一个以两个集合长度之和为长度的新数组 从两数组最左边开始比起 把小的放入新集合 并用变量标记后一位置 每次比较都是比较的最左边未比较过的元素 通过变量 循环比
  • 分享一个可交互的小场景(二)

    先看效果 可互动的小场景 再看代码 JS部分
  • 正点原子I.MX6ULL开发板车牌识别项目实战 1

    1 项目总体概述 下图为 车牌识别项目 的系统框图 借助这个框图 简要介绍项目的总体思路和所需要做的准备工作 1 1 总体思路 通过摄像头采集图像信息 并将图像信息传递开发板 这里使用的是OpenCv 开发板收到图像信息之后 通过定时器 周
  • Python解决ModuleNotFoundError: No module named 'Queue'的问题

    我们知道Python2和Python3两个版本之间 有些不兼容的地方 Python3中引入Queue会报出这个问题 Python3中要这样引入 1 import queue Python2中要这样引入 1 import Queue 为了兼容
  • 第十六课,面剔除

    使用OpenGL的面剔除选项 它默认是禁用状态 glEnable GL CULL FACE 直接运行后 我们发现正方体的部分面确实被剔除了 但是却不是背向面 这是因为我们定义的正方体并不是严格遵循逆时针顺序定义的 原理详见教程 这里就不过多
  • python输出文本 去掉引号,如何从导出的python列表中删除逗号,引号和括号?

    You guys were super helpful with my last newbie question so I figured I would give it another shot Right now my Python 3
  • 基于范围的for循环

    一 基于范围的for循环 C 11 1 范围for的语法 2 范围for的使用条件 二 指针空值nullptr 一 基于范围的for循环 C 11 1 范围for的语法 对于一个有范围的集合而言 由程序员来说明循环的范围是多余的 有时候还会
  • 智能聊天机器人实现(源码+解析)

    前言 之前写了一篇 美女图片采集器 源码 解析 得到了众多朋友的支持 发现这样系列的教程还是挺受欢迎的 也激励我继续写下去 也在那一篇文章中提过 美女图片采集只是我先前那个完整APP中的一个功能罢了 还有其他几个比较好玩的尚未开源 之后有时
  • QWidgetAction实现鼠标滑过菜单项图标高亮显示

    需求是鼠标滑过菜单项时 菜单项的文字 icon以及子菜单的小箭头都要高亮显示 qss中只能设置item背景色 文字颜色以及子菜单小箭头的样式 icon的图片不能切换 另外曾经想过用indicator 对action setCheckable
  • Ubuntu18.04安装QT5

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 QT5是什么 二 安装包安装 1 下载安装包 2 安装QT5 3 运行 4 其他方式 总结 前言 最近在学习QT5 在Windows上的安装自然不必多说
  • 爬虫 — 反爬

    目录 一 UA 反爬 二 Cookie 验证与反爬 1 Cookie 简介 2 使用 Cookie 原因 3 Cookie 作用 3 1 模拟登录 3 2 反反爬 三 Referer 反爬 一 UA 反爬 UA User Agent 用户代