首页 > 其他分享 >一种通过编码的反爬虫机制

一种通过编码的反爬虫机制

时间:2023-04-18 11:24:49浏览次数:32  
标签:编码 浏览器 encoding 爬虫 print +++ 后台 机制

遇到一个反爬虫机制,该网页为gbk编码网页,但是请求参数中,部分请求使用gbk编码,部分请求使用utf8编码,还设置了一些不进行编码的安全字符,在爬取的过程中形成了阻碍。

提示:在认为参数设置正常,又无法正确爬取数据的情况下,通过response.requests.headers和esponse.requests.body与浏览器的请求数据的对比,会比较容易发现问题。

1、python的url编码函数

也有通用函数- decode(解码为unicode),encode(编码)

import requests  
from urllib.parse import urlencode  # 对整个字典进行编码
from requests.utils import quote,unquote  # 对字符串进行编码和解码
# 对整个字典进行编码,对于需要进行局部编码不太方便。
Signature:
urlencode(
    query,
    doseq=False,
    safe='',  # 不进行编码的字符串
    encoding=None,
    errors=None,
    quote_via=<function quote_plus at 0x0000027AB54DD678>,
)
Docstring:
Encode a dict or sequence of two-element tuples into a URL query string.

If any values in the query arg are sequences and doseq is true, each
sequence element is converted to a separate parameter.

If the query arg is a sequence of two-element tuples, the order of the
parameters in the output will match the order of parameters in the
input.

The components of a query arg may each be either a string or a bytes type.

The safe, encoding, and errors parameters are passed down to the function
specified by quote_via (encoding and errors only if a component is a str).
# 对字符串进行编码
Signature: requests.utils.quote(string, safe='/', encoding=None, errors=None)
Docstring:
quote('abc def') -> 'abc%20def'
# 对字符串进行解码
Signature: requests.utils.unquote(string, encoding='utf-8', errors='replace')
Docstring:
Replace %xx escapes by their single-character equivalent. The optional
encoding and errors parameters specify how to decode percent-encoded
sequences into Unicode characters, as accepted by the bytes.decode()
method.
By default, percent-encoded sequences are decoded with UTF-8, and invalid
sequences are replaced by a placeholder character.

unquote('abc%20def') -> 'abc def'.

2、模拟过程 - 以错误编码模式

这里还设置了一个安全符号,如果设置。"+"会进行编码。

# 如果错误的采用了网页编码进行访问
# 1. 请求数据
req1 = '+导出+++'
print('1.原始请求数据:',req1)
# 2. 自行编码以后发送出去的数据
req2 = quote(req1,encoding='gbk',safe='+')
print('2.浏览器编码后发出的数据:',req2)
# 3. 服务区接受的数据为req2,服务器会编码以后提交给后台
req3 = unquote(req2,encoding='gbk')
print('3.经服务器编码以后,后台接收到的数据:',req3)
# 4. 后台逆编码获取浏览器发送的原始数据
req4 = quote(req3,encoding='gbk',safe='+')
print('4.后台逆编码,重新得到浏览器发送的原始数据:',req4)
# 5. 后台再进行正确编码获取正确数据
req5 = unquote(req4,encoding='utf8')
print('5.后台逆编码,重新得到浏览器发送的原始数据,最终获取数据为乱码:',req5)

最后后台获取的数据是乱码,可以进行校准,如果是非正常编码数据则不进行处理。

1.原始请求数据: +导出+++
2.浏览器编码后发出的数据: +%B5%BC%B3%F6+++
3.经服务器编码以后,后台接收到的数据: +导出+++
4.后台逆编码,重新得到浏览器发送的原始数据: +%B5%BC%B3%F6+++
5.后台逆编码,重新得到浏览器发送的原始数据: +����+++

3、模拟过程-正确例子

# 1. 请求数据
req1 = '+导出+++'
print('1.原始请求数据:',req1)
# 2. 自行编码以后发送出去的数据
req2 = quote(req1,encoding='utf8',safe='+')
print('2.浏览器编码后发出的数据:',req2)
# 3. 服务区接受的数据为req2,服务器会编码以后提交给后台
req3 = unquote(req2,encoding='gbk')
print('3.经服务器编码以后,后台接收到的数据:',req3)
# 4. 后台逆编码获取浏览器发送的原始数据
req4 = quote(req3,encoding='gbk',safe='+')
print('4.后台逆编码,重新得到浏览器发送的原始数据:',req4)
# 5. 后台再进行正确编码获取正确数据
req5 = unquote(req4,encoding='utf8')
print('5.后台逆编码,重新得到浏览器发送的原始数据:',req5)
1.原始请求数据: +导出+++
2.浏览器编码后发出的数据: +%E5%AF%BC%E5%87%BA+++
3.经服务器编码以后,后台接收到的数据: +瀵煎嚭+++
4.后台逆编码,重新得到浏览器发送的原始数据: +%E5%AF%BC%E5%87%BA+++
5.后台逆编码,重新得到浏览器发送的原始数据: +导出+++

标签:编码,浏览器,encoding,爬虫,print,+++,后台,机制
From: https://www.cnblogs.com/q-q56731526/p/17328901.html

相关文章

  • redis介绍,redis linux安装,redis启动,redis经典场景,redis通用命令,数据结构和内部编码,red
    目录redis介绍,redislinux安装,redis启动,redis经典场景,redis通用命令,数据结构和内部编码,redis字符串类型昨日内容回顾今日内容1redis介绍2redislinux下安装3redis启动方式3.1最简启动3.2动态参数启动3.3配置文件启动3.4客户端连接命令4redis经典场景5redis通用命令6数据......
  • 【redis】 redis linux下安装 redis启动方式 redis典型场景 redis通用命令 数据结构
    目录上节回顾今日内容1redis介绍2redislinux下安装3redis启动方式3.1最简启动3.2动态参数启动3.3配置文件启动3.4客户端连接命令4redis典型场景5redis通用命令6数据结构和内部编码7redis字符串类型练习上节回顾#dockerfile命令 RUNCOPYADDENV......
  • Java判断文件编码格式
    一般情况下我们遇到的文件编码格式为GBK或者UTF-8。由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。 对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65,所以,判定是否是UTF-8编码格式的代码片段如下:  java.io.Filef=newjava.io.File("待判定的......
  • ffmpeg可支持的编码器、解码器、封装格式、网络协议
    {ffmpeg可支持的编码器./configure--list-encodersffmpeg可支持的解码器./configure--list-decodersffmpeg可支持的封装格式./configure--list-muxersffmpeg可支持的解封装格式./configure--list-demuxersffmpeg可支持的网络协议./configure--list-protocols查看......
  • python爬虫scrapy框架的使用
    总结scrapystartprojectnamescrapygenspiderbaiduhttp://www.baidu.comscrapycrawlbaiduscrapy项目创建scrapystartprojectscrapy_baidu_091创建爬虫文件在spider中创建爬虫文件#scrapygenspider名称域名(不写http)scrapygenspiderbaiduhttp://www.b......
  • C#Unicode编码不可逆,Default也不可逆
    不可逆:4个eunsafestaticvoidMain(string[]args){byte[]by=newbyte[256];for(inti=0;i<by.Length;i++)by[i]=(byte)i;strings=Encoding.Unicode.GetString(by);byte[]by2=Encoding.Unicode.GetBytes(s);for(inti=0;i<by.Leng......
  • WebSocket+心跳机制
    maven依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>WebSocket.classimportcn.hutool.json.JSONUtil;importlombok.SneakyThrows;impo......
  • js EventLoop事件循环机制
    1、js是单线程语言,其事件分为:同步任务和异步任务,异步任务分为宏任务与微任务;2、执行顺序为:同步任务(主流程任务)--->微任务 ---->宏任务先执行同步任务,遇到异步任务则放入任务队列中,等同步任务执行完毕,执行任务队列中的微任务,再执行宏任务...主线程从"任务队列"中读取事件,这......
  • 爬取的数据存mysql中、加代理,cookie,header,加入selenium、布隆过滤器、scrapy-redis实
    上节回顾#1scrapy架构 -爬虫:写的一个个类-引擎: -调度器:排队,去重-下载器-pipline-下载中间件-爬虫中间件#2命令 -scrapystartproject项目名-scrapygensipder爬虫名网址-scrapycrawl爬虫名字-run.py#......
  • MFC运行机制
    1.创建一个窗口代码2.设断点  3.启动调试 调用堆栈窗口:上面的函数被下面的函数所调用 4.双击函数   设断点  F5让程序执行到断点处  F11进入AfxWinMain函数 CWinThread*pThread=AfxGetThread()以Afx打头的是全局函数 F10让程序运行几行把鼠标放在pThread和pApp上......