每次更换代理IP仍然被反爬

客户问题

使用产品类型:

隧道代理动态版(每次请求更换IP)。

问题描述:

目标网站有反爬机制,两次搜索的间隔时间不得少于25秒。使用了我们的隧道代理后,还是会被检测出来,依旧只能25秒访问一次。遂怀疑是我们的隧道代理没有更换IP。

技术支持流程

0x01 排除产品问题
按照流程,我们先使用用户的隧道代理进行访问测试,看看是否每次更换了IP。

在用户的隧道代理订单下添加我们测试机器的外网IP,在Linux/macOS下使用curl命令访问cip.cc进行测试。

curl cip.cc -x tps1xx.kdlapi.com:15818

可以看到在实际测试中,我们使用隧道代理访问了三次cip.cc都正常每次更换了IP,排除了隧道代理本身产品的问题。在向用户表达了并非隧道代理产品问题后,我们继续刨根问底,帮助客户找到真正的问题。

0x02 分析网站
分析用户访问的网站:

https://www.kquanben.com/modules/article/search.php

发现是一个普通的小说搜索网页,连续搜索两次关键词"霸道总裁",发现就已经提示错误。果然两次两次搜索间隔不得小于25s。

打开Chrome浏览器控制台,查看发送的请求。可以发现在搜索的过程中,浏览器发送了一个POST请求,携带的参数大致如下。

#header
{'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,','image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9,','Accept-Language': 'zh-CN,zh;q=0.9,','Cache-Control': 'no-cache,','Connection': 'keep,','Host': 'www.kquanben.com,','Pragma': 'no-cache,','Upgrade-Insecure-Requests': '1,','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ','Chrome/86.0.4240.111 Safari/537.36,','sec-ch-ua': ''Google Chrome;v=89, Chromium;v=89, ;Not A Brand;v=99',','sec-ch-ua-mobile': '?0,','Sec-Fetch-Dest': 'document,','Sec-Fetch-Mode': 'navigate,','Sec-Fetch-Site': 'none,','Sec-Fetch-User': '?1,'...
}

响应Header如下

{'content-type': 'text/html; charset=utf-8','date': 'Wed, 14 Apr 2021 02': '53': '09 GMT','location': 'result/?searchid=31435','server': 'nginx','set-cookie': 'alllc111lastsearchtime=1618368789; expires=Thu, 15-Apr-2021 02': '53': '09 GMT; Max-Age=86400; path=/; secure','strict-transport-security': 'max-age=31536000'...
}

其中的set cookie字段一下就吸引了我们的注意。
在alllc111lastsearchtime=1618368789中有一段数字与时间戳非常相似。我们推断在首次浏览器进行小说搜索时,服务器会返回set-cookie字段记录用户上次的搜索时间,当用户进行第二次搜索时,请求会携带上这个cookie字段,如果服务器判断两次搜索时间间隔小于25s,请求就会直接被拒绝。为了验证,我们将时间戳实时生成进行请求,果然没有了搜索限制,每次请求都可以正常得到响应。所以获取网站的主要反爬虫措施是cookie时间戳限制,并不是和客户端IP相关,也就说主要原因并不是隧道代理,可以判断是用户的代码问题了。

0x03 排查用户代码
我们向用户询问了代码,为了便于展示,只保留了关键发送请求的相关逻辑。

# coding:utf-8
# 看全本import requestsdef test(info):book_name = info[0]book_auth = info[1]data = {"searchkey": book_name.strip(),"searchtype": "articlename",}s = requests.session() # 使用了sessionurl = 'https://www.kquanben.com/modules/article/search.php'headers = {# 省略}tunnel = "tps1xx.kdlapi.com:15818"username = "txxxxxxxxxx"password = "password"proxies = {"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel},"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password, "proxy": tunnel}}response = s.post(url, headers=headers, data=data, timeout=12.1)# 解析response

用户使用了Requests[1]框架中的session发送请求,查看文档可知Requests框架有持久 Cookie 的会话的功能,查看session源码可见,在使用session发送请求的过程前会进行prepare_request,将会话的cookie进行合并。

class Session(SessionRedirectMixin):"""A Requests session.Provides cookie persistence, connection-pooling, and configuration......."""def prepare_request(self, request):"""Constructs a :class:`PreparedRequest <PreparedRequest>` fortransmission and returns it. The :class:`PreparedRequest` has settingsmerged from the :class:`Request <Request>` instance and those of the:class:`Session`.:param request: :class:`Request` instance to prepare with thissession's settings.:rtype: requests.PreparedRequest"""cookies = request.cookies or {}# Bootstrap CookieJar.if not isinstance(cookies, cookielib.CookieJar):cookies = cookiejar_from_dict(cookies)# Merge with session cookiesmerged_cookies = merge_cookies(merge_cookies(RequestsCookieJar(), self.cookies), cookies)# ......

有关cookie的更多操作可以查看Requests-Cookie[2]。

所以根据上一步我们分析用户网站得知,用户使用了session发送请求,在首次用户请求中,目标网站返回了set cookie字段。于是Requests框架就将此cookie自动保存了起来,用于下一次请求。所以在第二次访问的过程中,请求会带上上一次访问的时间戳,两者间隔小于了25s,所以请求被拒绝。解决办法也很简单,就是不使用session发送请求,直接使用requests.post(),部分代码如下:

import requests
import time
url = 'https://www.kquanben.com/modules/article/search.php'
headers = {'cookie': 'alllc111lastsearchtime=%s' % int(time.time())# 省略
}
data = {# 省略
}
response = s.post(url, headers=headers, data=data, timeout=12.1)

在通过快代理工程师的建议下,用户很快地修改了代码,顺利使用上代理进行网站的访问。

结论

•对于requests.session要慎用,它会进行cookie存储,使用不当会被目标网站识别。
•并不是所有的网站防爬措施都是限制访问IP,需要进行具体分析。

                           ****关注【快代理客户服务】了解更多技术好文****

每次更换代理IP仍然被反爬相关推荐

  1. Python之网络爬虫(验证码、代理IP、防反爬策略、封装一个抓取页面的函数)

    文章目录 一.使用tesseract做OCR验证码识别 二.代理服务器设置 三.反爬与防反爬 四.封装一个抓取页面的函数 一.使用tesseract做OCR验证码识别 1.cookie, sessio ...

  2. 【实用工具系列之爬虫】python实现爬取代理IP(防 ‘反爬虫’)

    系列 [实用工具系列之爬虫]python实现爬取代理IP(防 '反爬虫') [实用工具系列之爬虫]python实现快速爬取财经资讯(防 '反爬虫') 本文使用python实现代理IP的爬取,并可以防' ...

  3. 使用proxy_pool来为爬虫程序自动更换代理IP

    文章目录 1. 前言 2. 教程 3. 官网 4. 在线demo 4.1. 本地部署 4.2. 安装 4.2.1. Python源码构建安装 4.2.1.1. 安装redis数据库 4.2.1.1.1 ...

  4. 爬虫实战篇--更换代理ip

    背景 我们在爬取网站数据,防止被对方服务器发现的一个最重要的操作是更换代理ip,因为你的电脑主机在局域网下的ip是固定的,所以你经常使用一个代理ip对网站进行大规模爬取,就容易被对方服务器检测出来是非 ...

  5. Puppeteer 不重启如何更换代理 IP

    我们知道,在写爬虫的过程中,如果总是使用同一个 IP,很容易就会被网站识别并封禁,所以需要使用代理 IP 并经常更换. 但如果你在网上搜索 Puppeteer 如何更换代理 IP,你会发现,网上的解决 ...

  6. python爬虫热点代理_Python爬虫实战——反爬策略之代理IP【无忧代理】

    一般情况下,我并不建议使用自己的IP来爬取网站,而是会使用代理IP. 原因很简单:爬虫一般都有很高的访问频率,当服务器监测到某个IP以过高的访问频率在进行访问,它便会认为这个IP是一只"爬虫 ...

  7. requests模块代理IP池搭建视频爬取

    requests模块&代理IP池搭建 一 requests模块使用 1.1 get请求 1.2 url编码和解码 1.3 携带请求头 1.4 携带cookie 1.5 发送post请求 1.6 ...

  8. 反爬与反反爬常见知识点

    服务器反爬的原因1. 爬虫占总PV较高,浪费资源2. 资源被批量抓走,丧失竞争力3. 法律的灰色地带服务器常反什么样的爬虫1. 十分低级的应届毕业生根本不管服务器的压力,很容易把站点搞挂2. 十分低级 ...

  9. Python爬虫第二课 Selenium介绍和反爬技术

    selenium的介绍 知识点: 了解 selenium的工作原理 了解 selenium以及chromedriver的安装 掌握 标签对象click点击以及send_keys输入 1. seleni ...

最新文章

  1. 端口映射问题:Bad Request This combination of host and port requires TLS.
  2. js进阶 12-8 如何知道鼠标和键盘当前操作的是哪个键
  3. phoenix hbase Can't get master address from ZooKeeper; znode data == null
  4. weblogic中ssrf漏洞修复_WebLogic SSRF 及漏洞修复
  5. Web 前端——项目文件夹命名规范
  6. 7-8垃圾箱分布_您认为有关垃圾收集的7件事-完全错了
  7. 使用Vim,让你工作效率更高
  8. c++实验总结_高考化学选三简答题总结6——配位化合物、配位键、配位数
  9. 自己动手写Docker系列 -- 6.3 手动配置容器网络(下)
  10. O365(世纪互联)SharePoint 之使用Designer报错
  11. T-SQL语言(一)
  12. crtmpserver 在VS2010下的build
  13. 和平精英微信和qq不是一个服务器,和平精英qq和微信能一起玩吗 qq微信数据互通吗...
  14. word绘制表格三斜线表头
  15. java自举_Javac为什么是由java写的?(关于自举)
  16. Caused by: java.lang.UnsatisfiedLinkError: Library hello-jni not found“问题解决
  17. 2022年中国版权保护中心计算机软件著作权登记最全申请步骤流程
  18. iOS逆向开发,突破微信强制升级,让低版本的iPhone也能正常使用
  19. 读论文|利用GAN生成三维点云WarpingGAN: Warping Multiple Uniform Priors for Adversarial 3D Point Cloud Generation
  20. int型和char型之间的类型转换

热门文章

  1. 红旗Linux桌面4.1文本装配进程图解(四)
  2. Android手机SD卡创建文件并写入内容
  3. c++ pimpl编程技法
  4. hikaripool信息_HikariPool源码(三)资源池动态伸缩
  5. 信息隐藏隐写系统框架
  6. Java-SpringBoot:用户认证(Authentication)和用户授权(Authorization)
  7. Win10无法拖动文件怎么办?Win10系统无法拖动文件的解决方法
  8. 计算机毕业设计Java的健身俱乐部综合管理系统(源码+系统+mysql数据库+lw文档)
  9. 安装FREENAS 虚拟机
  10. elasticsearch启动成功,访问不成功问题