爬虫 — 反爬

目录

  • [一、UA 反爬](#一、UA 反爬)
  • [二、Cookie 验证与反爬](#二、Cookie 验证与反爬)
    • [1、Cookie 简介](#1、Cookie 简介)
    • [2、使用 Cookie 原因](#2、使用 Cookie 原因)
    • [3、Cookie 作用](#3、Cookie 作用)
  • [三、Referer 反爬](#三、Referer 反爬)

一、UA 反爬

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

python 复制代码
# 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,以此来辨认浏览器状态。

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

3、Cookie 作用

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

3.1、模拟登录

清除 Cookie 就会需要重新登录

python 复制代码
# 需求:获取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、反反爬

python 复制代码
# 需求: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,用来表示从哪儿链接到当前的网页。

python 复制代码
# 需求:获取梨视频中的视频

# 导入模块
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)

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

相关推荐
不会玩技术的技术girl3 分钟前
Java爬虫与淘宝API接口:深度解析销量和商品详情数据获取
java·开发语言·爬虫
小爬虫程序猿5 小时前
Python爬虫:深度解析商品详情的自动化之旅
爬虫·python·自动化
数学人学c语言5 小时前
从熟练Python到入门学习C++(record 6)
c++·python·学习
Tony_long748310 小时前
Python学习——猜拳小游戏
开发语言·python·学习
陈苏同学10 小时前
机器翻译 & 数据集 (NLP基础 - 预处理 → tokenize → 词表 → 截断/填充 → 迭代器) + 代码实现 —— 笔记3.9《动手学深度学习》
人工智能·pytorch·笔记·python·深度学习·自然语言处理·机器翻译
股票GPT分析11 小时前
《Python 股票交易分析:开启智能投资新时代》(二)
大数据·服务器·python·c#·fastapi
大熊程序猿11 小时前
python Flask指定IP和端口
开发语言·python·flask
我叫白小猿11 小时前
【大模型-智能体】AutoGen Studio测试和导出工作流程
人工智能·python·workflow·工作流·智能体·autogen
K2SO4钾11 小时前
16. 清理Python包管理工具(pip 和 conda)的缓存和冗余文件
python·conda·pip
YONG823_API11 小时前
1688商品数据采集API的测试对接步骤分享(提供免费测试key)
开发语言·数据库·爬虫·python·数据挖掘