前言:一觉睡醒,发现原有的搜狗微信爬虫失效了,网上查找一翻发现10月29日搜狗微信改版了,无法通过搜索公众号名字获取对应文章了,不过通过搜索主题获取对应文章还是可以的,问题不大,开搞!

目的:获取搜狗微信中搜索主题返回的文章。

涉及反爬机制:cookie设置,js加密。

进入正题。

流程一:正常套路流程

打开搜狗微信,在搜索框输入“咸蛋超人”,这里搜索出来的就是有关“咸蛋超人”主题的各个公众号的文章列表

按照正常的采集流程,此时按F12打开浏览器的开发者工具,利用选择工具点击列表中文章标题,查看源码中列表中文章url的所在位置,也就是这个href的值,为避免混乱,我们称之为“列表页面的文章url”。

可以看到“列表页面的文章url”需要拼接,一般这种情况需要在浏览器中正常访问一下这篇文章,对比观察跳转后的url(我们称之为“真实的文章url”),再缺头补头缺脚补脚即可。下面是两个url的对比:

列表页面的文章url:

/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNFzn4G2S0Yt3MduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGSa3_pkMzadQg75Zhmxb9YI0psZvVepKtN4hpzQgtGa2iOlKKLwV_oxooGE6sxg1qinKxTb5VwJUcLBM1RgkzAPRtmyIGw2VAg..&type=2&query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&k=92&h=z

真实的文章url:

https://mp.weixin.qq.com/s?src=11&timestamp=1573092595&ver=1959&signature=FjD709D-0vHSyVgQyXCS-TUAcnT0M9Gx6JljQEb6O55zpuyyDaTHqgkRCxNDtt5ZDifDRUUBOemzxcz71FMOmO88m6RWfR0r4fFBe0VefAsjFu0pl-M0frYOnXPF5JD8&new=1

这里很明显两个url的路径不一致,应该是中间经过了一些调转,python的requests库是带自动调转功能,我们先把域名https://mp.weixin.qq.com补上试一下访问

明显这里做了反爬限制,那么这里开始,我们就需要抓包分析了。这里用到的工具是Firefox浏览器的开发者工具。抓包观察的是从搜索页面列表文章点击跳转到文章页面的过程,这里点击文章超链接会在新窗口打开,我们只需要在网页源码中把对应a标签的target属性改为空,就可以在一个页面上观察整个流程的数据包了。

流程二:抓包分析之跳转实现

抓包分析:

通过抓包我们可以找到搜索页面跳转到文章页面的过程,这里观察“列表页面的文章url”返回的结果中就包含了“真实的文章url”的信息,这意味着我们只需要正确访问到“列表页面的文章url”,根据返回的数据就能拼接出“真实的文章url”并访问了!

流程三:抓包分析之搜索页面url无法访问分析

此时我们的目标就从获取“真实的文章url”转变到正确的访问“列表页面的文章url”,继续分析抓包数据中的“列表页面的文章url”信息:

抓包数据:

url:https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNEnNekGBXt9LMduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGaBLLLEV3E0vo604DcwbvX2VNudQZNnBemevd34BJP94ZL5zUiA49LgzIjRlpGxccVxTTaLhHZKstaeqw41upSVAe0f8bRARvQ..&type=2&query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&k=60&h=Umethod:GET

参数:{"url":"dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNEnNekGBXt9LMduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGaBLLLEV3E0vo604DcwbvX2VNudQZNnBemevd34BJP94ZL5zUiA49LgzIjRlpGxccVxTTaLhHZKstaeqw41upSVAe0f8bRARvQ..","type":"2","query":"咸蛋超人","k":"60","h":"U"}

headers:

Host: weixin.sogou.com

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate, br

Connection: keep-alive

Referer:https://weixin.sogou.com/weixin?type=2&query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&ie=utf8&s_from=input&_sug_=n&_sug_type_=1&w=01015002&oq=&ri=1&sourceid=sugg&sut=750912&sst0=1573092594229&lkt=0%2C0%2C0&p=40040108

Cookie: 见下

Cookie:{"ABTEST":"4|1573094886|v1","IPLOC":"CN4401","JSESSIONID":"aaa3VBk4eXnIf8d4bdx4w","SNUID":"57A28ED20A0F9FB2BBE3E0180AF00D25","SUID":"5EAB87DB2613910A000000005DC385E6","SUV":"00F221C2DB87AB5E5DC385E7BC43F633"}

这里的重点有三个:参数:对比我们获取的“列表页面的文章url”分析可以发现,这里多了两个参数“k”、“h”,这是需要我们设法获取的。

headers:经过测试该网站对User-Agent敏感,一次访问前后User-Agent需要一致。

Cookie:Cookie中参数需要获取才能正确访问该url。这些参数分别是:ABTEST、IPLOC、JSESSIONID、SNUID、SUID、SUV。

第一步,获取参数“k”、“h”。

按照经验,从一个url转变成另一个url有两种情况:跳转和javascript字符串处理。经过多次抓包分析发现,搜索页面点击文章超链接到我们现在的目标url并没有存在跳转情况,抓包数据中的“列表页面的文章url”和我们获取的“列表页面的文章url”可以判定为同一个url,所以猜测为javascript字符串处理。经过一番搜寻,发现搜索页面的源码中有一段非常可疑的代码:

这其中最重要的代码就是:this.href+="&k="+b+"&h="+a,这代码就是在点击事件发生时给a标签href属性的内容添加"&k="、"&h=",网页中正是用这段代码对该url参数进行js加密的。我们只需要把这段代码用python实现就可以解决这个问题了,下面是实现python实现代码:

def get_k_h(url):

b = int(random.random() * 100) + 1a= url.find("url=")

url= url + "&k=" + str(b) + "&h=" + url[a + 4 + 21 + b: a + 4 + 21 + b + 1]

reuturn url

第二步,获取Cookie的参数。

观察抓包数据可以发现,当我们一开始访问时并没有带任何cookie,但经过一系列请求,到我们的目标请求时候,cookie已经通过前面的返回数据包的Set-Cookie属性把Cookie构造出来了,而我们要做的就是在Cookie构造从无到有这个过程中找到所有ResponseHeaders中带SetCookie属性的而且参数是我们需要的参数的请求,并模拟访问一遍,就能得到所有参数并构建出我们需要的Cookie了。

例如搜狗微信搜索的请求的ResponseHeaders就有5个Set-Cookie字段,其中ABTEST、SNUID、IPLOC、SUID都是我们最终构造Cookie所需的参数(和最后的Cookie值对比可以发现,这里的SUID值还不是我们最终需要的,要在后面的数据包中继续发掘)。

经过分析,经过四个请求获取到的ResponseHeaders后我们就能正确构建Cookie了:

1. 得到ABTEST、SNUID、IPLOC、SUID:

https://weixin.sogou.com/weixin?type=2&query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&ie=utf8&s_from=input&_sug_=n&_sug_type_=1&w=01015002&oq=&ri=1&sourceid=sugg&sut=750912&sst0=1573092594229&lkt=0%2C0%2C0&p=40040108

2. 需要IPLOC、SNUID,得到SUID:

https://www.sogou.com/sug/css/m3.min.v.7.css3. 需要ABTEST、IPLOC、SNUID、SUID,得到JSESSIONID:

https://weixin.sogou.com/websearch/wexinurlenc_sogou_profile.jsp

4. 需要IPLOC、SNUID、SUID,得到SUV

https://pb.sogou.com/pv.gif

这四个请求都能根据前面请求获取到的Cookie参数来构造自己需要的Cookie去正确访问。值得注意的是最后一个请求,除了需要正确拼接Cookie外,还需要获取正确的请求参数才能正常访问:

这种找参数的活可以利用浏览器的全局搜索功能,一番搜寻后,就会发现在搜索页面的源代码中已经返回了这里所需的所有参数,用正则把这些参数解析出来即可:

那么根据这些解析出来的参数和前面三个请求得到的Cookie参数就能正确访问这个请求得到所需的所有Cookie参数啦!

流程四:构造正确的请求信息

此时,我们已经分析出所有正确模拟请求的流程了,梳理一下:获取“k”、“h”参数,传入搜索页面得到的url,调用get_k_h()即可。

获取所需参数,构造正确的Cookie,按照流程三给出的4个url,分别构造请求获取ResponseHeaders中的SetCookie即可。

构造正确的请求访问“列表页面的文章url”。

根据3中请求返回的数据,拼接出“真实的文章url”。

请求“真实的文章url”,得到真正的文章页面数据。

至此,所有分析结束,可以愉快的码代码啦!

完整代码可参考本人gayhub,如果对您有帮助,劳烦看客大人给个星星!

结语:此次斗智斗勇涉及到的反爬技术是Cookie构造和简答的js加密,难度不大,最重要的是耐心和细心。此外提醒各位看客大人遵循爬虫道德,不要对他人网站造成伤害,peace!

搜狗微信文章采集php,搜狗微信采集 —— python爬虫系列一相关推荐

  1. 微信文章抓取:微信临时链接转永久链接方法,一招摆脱链接过期烦恼

    上一篇文章<微信文章抓取:微信公众号文章抓取常识之临时链接.永久链接>中介绍了微信临时链接和微信永久链接的情况.那么大家一定会有一个问题:如何让临时链接不再过期?或者说如何把临时链接转换为 ...

  2. Python爬虫系列之爬取微信公众号新闻数据

    Python爬虫系列之爬取微信公众号新闻数据 小程序爬虫接单.app爬虫接单.网页爬虫接单.接口定制.网站开发.小程序开发 > 点击这里联系我们 < 微信请扫描下方二维码 代码仅供学习交流 ...

  3. Python爬虫系列之MeiTuan优选商家端商品自动化管理(商品发布、商品排期、订单采集)

    Python爬虫系列之MeiTuan优选商家端商品自动化管理(商品发布.商品排期.订单采集) 小程序爬虫接单.app爬虫接单.网页爬虫接单.接口定制.网站开发.小程序开发> 点击这里联系我们 & ...

  4. Python爬虫系列之爬取某社区团微信小程序店铺商品数据

    Python爬虫系列之爬取某社区团微信小程序店铺商品数据 如有问题QQ请> 点击这里联系我们 < 微信请扫描下方二维码 代码仅供学习交流,请勿用于非法用途 数据库仅用于去重使用,数据主要存 ...

  5. Python爬虫系列之爬取某优选微信小程序全国店铺商品数据

    Python爬虫系列之爬取某优选微信小程序全国商品数据 小程序爬虫接单.app爬虫接单.网页爬虫接单.接口定制.网站开发.小程序开发 > 点击这里联系我们 < 微信请扫描下方二维码 代码仅 ...

  6. 微信文章抓取:微信公众号文章抓取常识之临时链接、永久链接

    未经允许请勿转载 曾经尝试过抓取微信文章的小伙伴,一定很熟悉搜狗微信.搜狗微信是腾讯官方提供的搜索引擎,专门用来搜索微信公众号发表的文章(不包含服务号). 对于想要获取微信文章进行研究学习的小伙伴,首 ...

  7. java 微信文章评论点赞_微信文章留言评论刷赞怎么弄?如何给微信文章

    微信文章留言评论刷赞怎么弄?如何给微信文章留言刷赞?如今微信公众号众多,每个微信公众号都会定期推送微信文章,我们可以在微信文章下面留言评论.现在有的商家还会通过微信文章留言评论点赞的活动来做宣传,导致 ...

  8. php 获取微信文章阅读量,获取微信公众号的文章的阅读数的实践(请求参数不支持文章 ID)...

    1.新的需求为:需要实现微信渠道的文章的阅读数的显示.如图1 图1 2.实则最为理想的情况,应该是能够基于文章 ID 获取此文章的阅读数,就像抖音.查看抖音开放平台文档 – 资源中心 – Open A ...

  9. 写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片!

    文章目录 前言 分析 理想状态 实际分析 爬虫实现 其他注意 效果与总结 前言 在我们写文章(博客.公众号.自媒体)的时候,常常觉得自己的文章有些老土,这很大程度是因为配图没有选好. 笔者也是遇到相同 ...

  10. python爬虫微信_搜狗微信采集 —— python爬虫系列一

    前言:一觉睡醒,发现原有的搜狗微信爬虫失效了,网上查找一翻发现10月29日搜狗微信改版了,无法通过搜索公众号名字获取对应文章了,不过通过搜索主题获取对应文章还是可以的,问题不大,开搞! 目的:获取搜狗 ...

最新文章

  1. 在CentOS 6.6 64bit上为vim 7.4安装并配置vim-airline插件
  2. 第十五届全国大学生智能汽车竞赛 车模检查手册
  3. onmousewheel
  4. 驾照考试:六百公里考试流程与注意事项
  5. python开发工具管理系统_Python开发桌面软件文档及网址管理工具,强迫症的福音...
  6. win7下声音图标消失的解决办法
  7. MaterialDesign 之 DrawerLayout
  8. 对Object.prototype.toString.call(obj)的理解
  9. 离线bootstrap_css下载
  10. CAN总线波特率的计算方法
  11. 【金融基建】证券交易机制(三)(证券估值、拍卖、竞价撮合、做市商交易、市场交易指令、交易时段)
  12. APP内打电话的小功能
  13. 联想服务器怎么使用uefi启动不了系统,联想小新如何用uefi启动在win10下装win7系统...
  14. 【转】使用cocosbuilder在cocos2d-…
  15. MySQL索引key_len
  16. docker --privileged=true 参数作用
  17. mysql怎么创建和调用out参数的存储过程
  18. Unity 2020.3.17 从UnityHub下载安装失败(含Android)
  19. cp2102驱动下载链接
  20. js同步等待ajax结果返回

热门文章

  1. ShuffleNet
  2. html 中 div 盒子上下垂直居中显示
  3. 捷联惯导系统学习2.3(方向余弦阵微分方程)
  4. 一键分享java英文_bShare RESTful分享API
  5. GIS基础(3)火星坐标系?
  6. python中的对数_python中计算log对数的方法
  7. 英文简历模板计算机专业,计算机专业英文简历模板制作
  8. Opencv图像美颜滤镜
  9. 1016day3:city查询系统json模块、餐厅点菜系统、点餐系统(class类)
  10. onlyoffice 在线编辑