绕过HTTPS请求中的TLS特征识别及反爬机制

简介: 使用 urllib.request 库进行 HTTPS 请求时,可能会出现 TLS 特征被识别的情况,可以考虑以下一些方法来绕过反爬机制:使用代理 IP、修改请求头部信息、降低请求频率或使用其他语言库,如 aiohttp、 Scrapy、Selenium 等,来进行复杂的反爬处理。这段代码实现了一个基于 asyncio 和 aiohttp 的异步百度百科查询工具,具有较高的并发性能和响应速度,同时通过爬虫代理加强版IP和随机User-Agent能够提高采集的效率。

095e96ecc98a41e6d5cf511ec3ab72bc.png

在使用 urllib.request 库进行 HTTPS 请求时,可能会出现 TLS 特征被识别的情况。这通常是因为目标网站的反爬机制检测到了你的请求不符合正常浏览器的请求特征,或者你的请求被检测到是从程序中发出的,而非浏览器。其中,一些反爬机制会检测请求头部中的 User-Agent 字段,以此来判断请求是否来自正常浏览器。如果 User-Agent 字段为 Python/urllib 或者其他非浏览器的 User-Agent 字段,就会被判定为爬虫。

另外,反爬机制还会检测 TLS 特征,如 TLS 版本、握手方式、常量等,以此来判断请求是否为程序发出的。如果 TLS 特征异常,就会被判定为爬虫。因此,我们可以通过修改请求头部中的 User-Agent 字段来伪装成浏览器,或者使用代理 IP 来隐藏请求的真实 IP,以绕过反爬机制。同时,我们还可以通过更改 TLS 特征,如修改 TLS 版本、握手方式等来欺骗反爬机制。

如果出现 TLS 特征被识别的情况,可以考虑以下一些方法来绕过反爬机制:使用代理 IP、修改请求头部信息、降低请求频率或使用其他语言库,如 aiohttp、 Scrapy、Selenium 等,来进行复杂的反爬处理。

下面以百度百科网站做测试,使用aiohttp、爬虫代理加强版IP和随机User-Agent实现信息采集:

importurllib.parseimportasyncioimportaiohttpimportlxml.htmlimportrandomURL_TEMPLATE='https://baike.baidu.com/item/{}'HEADERS_LIST= [
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299',
'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; AS; rv:11.0) like Gecko',
# 添加更多 User-Agent]
# 代理服务器( www.16yun.cn)proxyHost="t.16yun.cn"proxyPort="31111"# 代理验证信息proxyUser="16yun"proxyPass="16ip"PROXIES="http://%(user)s:%(pass)s@%(host)s:%(port)s"% {
"host" : proxyHost,
"port" : proxyPort,
"user" : proxyUser,
"pass" : proxyPass,
}
asyncdefquery(content):
asyncwithaiohttp.ClientSession(headers=get_random_headers()) assession:
url=URL_TEMPLATE.format(urllib.parse.quote(content))        
asyncwithsession.get(url, proxy=PROXIES) asresponse:
html=lxml.html.fromstring(awaitresponse.read())
sen_list=html.xpath('//div[contains(@class,"lemma-summary") or contains(@class,"lemmaWgt-lemmaSummary")]//text()')
sen_list_after_filter= [item.strip('\n') foriteminsen_list]
return'\n'.join(sen_list_after_filter).encode('utf-8')
asyncdefmain():
asyncforcontentinget_input():
result=awaitquery(content)
print("查询结果:\n%s"%result.decode('utf-8'))
asyncdefget_input():
whileTrue:
yieldinput('查询词语:')
defget_random_headers():
return {'User-Agent': random.choice(HEADERS_LIST)}
if__name__=='__main__':
asyncio.run(main())

这段代码实现了一个基于 asyncio 和 aiohttp 的异步百度百科查询工具,具有较高的并发性能和响应速度,同时通过爬虫代理加强版IP和随机User-Agent能够提高采集的效率。

相关文章
|
3月前
|
应用服务中间件 nginx
百度搜索:蓝易云【HTTP请求是如何关联Nginx server{}块的?】
总结来说,Nginx中的 `server{}`块用于关联HTTP请求和虚拟主机,通过配置不同的 `server{}`块,可以实现多个域名或IP地址的请求分发和处理。这样,Nginx可以根据不同的请求来提供不同的服务和内容。
37 0
|
3月前
|
存储 缓存 API
HTTP 请求的响应头部字段 Cache-Control 的值为 no-store 是什么意思
HTTP 请求的响应头部字段 Cache-Control 的值为 no-store 是什么意思
60 0
|
3月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)(上)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
29 0
|
3月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)(下)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
25 0
|
29天前
|
数据采集 缓存 前端开发
http和https请求服务器的时候在请求头部分都带什么到服务器呢?
HTTP和HTTPS请求头基本结构相似,HTTPS多了一层SSL/TLS加密。常见请求头如Accept(指定内容类型)、Authorization(身份验证)、Cookie(会话跟踪)、User-Agent(标识用户代理)等。HTTPS特有的头包括Upgrade-Insecure-Requests(升级到HTTPS)、Strict-Transport-Security(强制使用HTTPS)、Sec-Fetch-*(安全策略)和X-Content-Type-Options、X-Frame-Options等(增强安全性)。实际应用中,请求头会根据需求和安全策略变化。
20 0
|
3月前
|
Java API Spring
使用OkHttp在Spring Boot应用中发送HTTP请求
使用OkHttp在Spring Boot应用中发送HTTP请求
76 0
|
3月前
|
安全 Java 网络安全
HTTPS的TLS/SSL协议详解及Java代码示例
HTTPS的TLS/SSL协议详解及Java代码示例
222 0
|
3月前
|
存储 缓存 安全
面试题:HTTP 协议包括哪些请求?
面试题:HTTP 协议包括哪些请求?
23 0
|
3月前
|
移动开发 自然语言处理 网络协议
Http解析实现/服务器Get请求的实现
Http解析实现/服务器Get请求的实现
46 0
|
3月前
|
Web App开发 网络协议 Linux
Linux C/C++ 开发(学习笔记十 ):实现http请求器(TCP客户端)
Linux C/C++ 开发(学习笔记十 ):实现http请求器(TCP客户端)
47 0