反爬虫

RSS Factory前段时间又出问题了,访问微信公众号RSS一直500,完全没法用了。

经调试,发现由于爬取数据太频繁,触发了搜狗微信公众号的反爬虫,探索了下反爬虫的规则:

没有带Cookie的情况下,频繁访问触发反爬虫

带Cookie的情况下,频繁访问偶尔触发反爬出,偶现500错误

不带Cookie情况下,隔几个小时范围一下不会触发反爬虫

Cookie有几个关键字段用于识别爬虫,SUID,SNUID,SUV。

不带Cookie请求任意搜狗微信公众号页面,应答set-cookie会带SUID,SNUID字段,SUV由JavaScript生成。

应对反爬虫

基于以上探索的反爬虫措施,制定应对反爬虫的策略。

维护一个Cookie池

爬取数据时随机取Cookie

定时更新Cookies池

实现

@tornado.gen.coroutine

def get_cookies():

cookies = []

client = tornado.httpclient.AsyncHTTPClient()

for i in xrange(10):

url = 'http://weixin.sogou.com/weixin?query=%s' % random.choice('abcdefghijklmnopqrstuvwxyz')

# 获取SNUID

cookie_request = tornado.httpclient.HTTPRequest(url=url, method='HEAD')

cookie = yield client.fetch(cookie_request)

SUID = re.findall(r'(SUID=\S+?);', cookie.headers['set-cookie'])[0]

m = re.findall(r'(SNUID=\S+?);', cookie.headers['set-cookie'])

if m:

SNUID = m[0]

headers = {'Cookie:': '; '.join([SUID, getSUV(), SNUID])}

cookies.append(headers)

mc = memcache.Client(['%s:15211' % IP])

if cookies:

mc.set('cookie', cookies)

用到了tornado的协程,使用异步httpClient,发送请求时使用HEAD方法,只请求头部,通过解析set-cookie生成自己的Cookie头,连续不带Cookies访问1-次,生成Cookie池,并且保存在memcached中。

在调用tornado.ioloop.IOLoop.instance().start()之前,调用get_cookies(),任务就能正常运行了,但是我们需要定时更新Cookie池,所以还要添加定时任务。

tornado有两种方式可以定时运行可调用对象:

# 延时运行,接受delta延时时间间隔为datetime.delta对象,func为可调用对象,但是只能调用一次,所以如果用add_timeout还需要在func中显式的再add_timeout才能实现定时调用

tornado.ioloop.IOLoop.instance().add_timeout(delta, func)

# 定时回调,以毫秒为单位,每6个小时调用一次

tornado.ioloop.PeriodicCallback(get_cookies, 6*60*60*1000).start()

效果

实现了定时任务后每6个小时会更新一次Cookie池,产生10个新的Cookie,爬取数据时使用随机Cookie明显降低了产生500的概率,效果良好。

欢迎使用RSS Factory。

php 获取搜狗微信 sn,记搜狗微信号搜索反爬虫相关推荐

  1. 【2020-10-29】记一次WebSocket握手验证反爬虫

    文章目录 前言 一.WebSocket是什么? 二.WebSocket握手验证反爬虫 1.目标网站 2.网站分析 3.获取数据 总结 前言 查了下最新的反爬虫方式,看到一个WebSocket握手验证反 ...

  2. 搜狗微信反爬虫机制探讨及应对方法

    最近项目中,由于需要从微信公众号中获取一些文章内容,所以用到了搜狗微信.一旦搜索的次数稍微多一点,就会触发搜狗微信的反爬虫机制,最初是需要加上User-Agent请求头,后来是要求输入验证码,现在输入 ...

  3. 搜狗微信反爬虫,让自媒体内容更安全

    2023年5月11日,搜狗微信成为最新一家加入反爬虫大军的公司.作为中国最大的社交平台之一,拥有超过2亿活跃用户的搜狗微信,一直以来都在努力保护其平台上的用户账户和信息安全.然而,随着技术越来越先进, ...

  4. 微信搜一搜将开放搜索入口给搜狗搜索

    微信搜一搜开放搜索入口给搜狗搜索,搜索结果展现文章来源,优先抓取搜狗搜索数据. 根据微信搜一搜近期公布的一些通知来看,未来搜一搜大部分文章数据,将优先展示来自搜狗搜索的数据,接着才是微信公众号,微信小 ...

  5. “李记餐厅”微信点餐小程序+后台管理系统

     博主介绍:✌在职Java研发工程师.专注于程序设计.源码分享.技术交流.专注于Java技术领域和毕业设计✌ 项目名称 "李记餐厅"微信点餐小程序+后台管理系统 效果视频 http ...

  6. 微信jssdk ajax 获取签名,【Golang版】微信access_token、jsapi_ticket、signature签名算法生成示例,开箱即用...

    # WXToken 项目地址:[https://github.com/henson/WXToken](https://github.com/henson/WXToken) 因为手上有一个项目需要用到微 ...

  7. 网页中获取微信用户是否关注订阅号的思路

    网页中要获取微信用户是否关注订阅号,请保证在同一个微信开放平台帐号下有一个服务号,否则可能很难实现. 在平时的业务工程中我们需要了解用户是否关注了微信公众号才能继续往下操作.这种操作对服务号来说是很容 ...

  8. ajax 微信code获取_计算机毕业设计中微信小程序实现微信登录(Java后台)

    点击上方"蓝字",关注我们. 需要的材料 1:一个可以测试的微信小程序 2:此微信小程序的APPID和APPscret 流程 微信用户对应一个小程序都有一个唯一的openid,微信 ...

  9. 【记】微信支付服务器证书更换通知的验证流程

    [记]微信支付服务器证书更换通知的验证流程 原文:[记]微信支付服务器证书更换通知的验证流程 [重要]微信支付服务器证书更换通知,请开发人员验证以免影响交易 尊敬的微信支付商户&服务商: 因微 ...

最新文章

  1. Java swing 如何将一个按钮放置到弹出框框的任意位置?(Absolute layout 布局的使用)...
  2. 【RabbitMQ】一文带你搞定RabbitMQ延迟队列
  3. 3-12形参和实参 局部变量
  4. 在SE37里批量执行ABAP函数
  5. 用python画爱心再加一行文字_如何理解python一行代码实现一个爱心字符画?
  6. ug建模文本怎么竖着_UG建模知乎答疑练习小集锦
  7. php preg_match_all匹配正则,字符串过长时出错
  8. “常程跳槽小米”裁决出炉:常程继续履行竞业限制,还要赔500多万...
  9. WebGraph++编译
  10. PAT Basic 1011
  11. 第八章 (一)分治 练习题
  12. 置换矩阵的转置为什么和逆矩阵相等?
  13. 通过高德地图获取 经纬度 以及地理位置等
  14. Unity GUI 中文显示
  15. 计算机科学的拉丁文,拉丁字母A-Z在计算机中对应的二进制编码
  16. Excel 快捷键大全
  17. echarts地图设置legend_ECharts 的第 100 个版本!
  18. 多叉树的构建和树的高度的计算
  19. Blackbox_exporter黑盒监测
  20. 曲师大计算机技术专研毕业,今天,我们从曲师大毕业了!

热门文章

  1. 【词汇】BOSS系统
  2. vue使用支付宝支付
  3. uniapp接入支付宝支付详细申请流程2021.6.1
  4. 仿射密码加密解密代码(java)
  5. shell脚本中等待上一条命令执行结束在执行下一条。
  6. 软件项目管理——人力资源管理
  7. 关于访问自己服务器显示无法访问此网站拒绝了我们的连接请求。
  8. 浙大PAT 1003题 1003. Emergency
  9. 计算机色温调整,如何调节计算机屏幕的色温
  10. 三菱触摸屏通讯错误_三菱触摸屏插上通讯线直接黑屏,老司机手把手教你解决触摸屏黑屏...