python爬虫js加密篇—搜狗微信公号文章的爬取
优采云 发布时间: 2020-05-24 08:01今天这篇文章主要介绍的是关于微信公众号文章的爬取,其中上面主要涉及的反爬机制就是 js加密与cookies的设置 ;
微信公众号的上一个版本中的反爬机制中并没有涉及到js加密,仅通过监控用户ip,单个ip访问很频繁会面临被封的风险;在新的版本中加入了js加密反爬机制,接下来我们来逐渐剖析一下文章爬取过程
打开搜狗页面搜狗陌陌页面,在输入框中输入任意关键词比如列车隧洞大火,搜下来的都是涉及关键词的公号文章列表
私信小编01 获取全套学习教程!
这里根据平时套路,直接借助开发者工具的选择工具,查看源码中列表中整篇文章的url,就是下边这个 href属性 标签
看到这个url,按照正常思路的话,就是直接做url拼接:搜狗主域名 + href 就是陌陌主要内容的url,形式如下
https
:
//weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS_yBZajb90fWf-LwgFP7QmnFtbELADqFzFqXa8Fplpd9nrYbnf-BG6fJQmhdTDKRUQC_zVYwjAHQRnKwtfQUOD-aNBz2bhtCuShQywQb837B12cBkYFsYkKXir7Y9WqlRBcZIrhUAYmFlBSVIg7YGFbBdu4rXklGlRslEFpw0lTmIX8pHfpQ9x6clCHaA92qoA9YOaIV2yOyrE-focNFXq7wdVqCwyPdzA..&type=2&query=%E7%81%AB%E8%BD%A6%E9%9A%A7%E9%81%93%E8%B5%B7%E7%81%AB
但是直接点这个链接返回的是402页面,需要输入验证码进行验证,而且验证码通过后仍然进不去;很明显这个url并不是文章的访问入口
经过测试,这篇文章的真实url是下边这些方式(直接通过点击页面标签打开即可):
https
:
//mp.weixin.qq.com/s?src=11×tamp=1567073292&ver=1820&signature=z2h7E*HznopGFidmtUA4PmXgi3ioRqV7XiYIqn9asMT3RCMKss6Y2nPUh7RG63nrwmRii77cL9LyDNJIVp1qpo5LHvQ8s754Q9HtCgbp5EPUP9HjosY7HWDwze6A2Qi7&new=1
是不是太太意外;这里开始就须要转变思路:不管怎样最好先抓一下包,这里我借助的工具是Fidder,关于Fidder怎样使用,可以参照这篇文章:
先从搜索页面的文章列表中步入文章的详情页,我们须要通过Fidder来监控一下文章的跳转情况:
看到没,惊奇地发觉有个 /link?url 开头的url跳转成功了,深入一下,我们再看一下这个链接返回的是哪些,点一下response部份的TextView;
返回的text文本是一串字符串组成的,即使不懂javascript,但上面大约意思就是构造一个url,格式与后面那种真实的url有一些相像呢,经测试以后发觉,返回的这个url就是获取文章内容的真实url
把这个访问成功的而且以link?url开头的url完整复制出来,与源码中的那种 link?url 放在一起,发现这个访问成功的url中多了两个参数一个是k一个是h
# 访问成功的:https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS_yBZajb90fWf-LwgFP7QmnFtbELADqFzFqXa8Fplpd9nrYbnf-BG6fJQmhdTDKRUQC_zVYwjAHQRnKwtfQUOD-aNBz2bhtCuShQywQb837B12cBkYFsYkKXir7Y9WqlRBcZIrhUAYmFlBSVIg7YGFbBdu4rXklGlRslEFpw0lTmIX8pHfpQ9x6clCHaA92qoA9YOaIV2yOyrE-focNFXq7wdVqCwyPdzA..&type=2&query=%E7%81%AB%E8%BD%A6%E9%9A%A7%E9%81%93%E8%B5%B7%E7%81%AB&k=80&h=f
# 访问失败的:https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS_yBZajb90fWf-LwgFP7QmnFtbELADqFzFqXa8Fplpd9nrYbnf-BG6fJQmhdTDKRUQC_zVYwjAHQRnKwtfQUOD-aNBz2bhtCuShQywQb837B12cBkYFsYkKXir7Y9WqlRBcZIrhUAYmFlBSVIg7YGFbBdu4rXklGlRslEFpw0lTmIX8pHfpQ9x6clCHaA92qoA9YOaIV2yOyrE-focNFXq7wdVqCwyPdzA..&type=2&query=%E7%81%AB%E8%BD%A6%E9%9A%A7%E9%81%93%E8%B5%B7%E7%81%AB
现在基本爬取核心思路早已晓得了,主要就是破解这两个参数k和h,拼接成'真'的url( 以/cl.gif开头的 ),然后获取真url; 关于这两个参数的破解就是涉及到了js加密,需要进行调试,不懂的可以参考这篇文章:Chrome DevTools 中调试 JavaScript 入门;
第一步,回到源码中 link?url 位置的地方,因为前面两个参数的降低是因为我们触发了这个假的url,所以这儿须要对假的url进行*敏*感*词*:
开发者工具[Elements] -> 右上角处的[Event Listeners] -> [click] -> 你须要监控的元素标签;
第二步,按流程浏览完前面所有过程时下边会有个js文件,点进去,并对js代码进行低格,发现参数k与h的构造方式:
其实还有一种参数定位的方式,在Google开发者选项中借助全局搜索[Search]就能快速定位,但是并不适用于这儿,因为这儿我们定位的参数都是单个元素,定位的准确度非常低
定位以后,参数k与h的定义十分清楚,没有过多函数嵌套,就是在一个简单的函数中,一个是生成一个随机数字,另一个在这个href标签的链接中获取其中的某一个字符,这里我们可以直python把这个功能实现:
url_list11
=
pq
(
res
.
text
)(
'.news-list li'
).
items
()
for
i
in
url_list11
:
url_list12
=
pq
(
i
(
'.img-box a'
).
attr
(
'href'
))
url_list12
=
str
(
url_list12
).
replace
(
'
'
,
''
).
replace
(
'
'
,
''
).
replace
(
'amp;'
,
''
)
(
url_list12
)
b
=
int
(
random
.
random
()
*
100
)
+
1
a
=
url_list12
.
find
(
"url="
)
result_link
=
url_list12
+
"&k="
+
str
(
b
)
+
"&h="
+
url_list12
[
a
+
4
+
21
+
b
:
a
+
4
+
21
+
b
+
1
]
a_url
=
"https://weixin.sogou.com"
+
result_link
好了,‘真’url也就能构造成功了,通过访问‘真’url来获取 真url(访问时记得加上headers),然后再获取我们须要的信息;然而结果却是下边这样的:
经测试发觉,原因是因为Cookie中最为核心的两个参数SUV和SUNID搜狗微信 反爬虫,而这两个参数在不断地发生改变
其中SUNID有固定得访问次数/时间限制,超过了限制直接变为无效,并且当访问网页恳求失败后,SUNID与SUV须要更换能够再度正常访问
SUV参数是在 ‘真’url 过度到 真url 中某个网页中Response里的Set-Cookie中生成的,也就是下边这个网页:
需要我们恳求这个链接,通过这个链接返回的Cookie,我们领到这个Cookie装入恳求头上面,再访问拼接好的 * ‘真’ url*
最后能够获取到真url最后恳求这个链接,解析出我们想要的数据( 注意用恳求头的时侯最好不要加Cookies搜狗微信 反爬虫,否则会导致访问失败 ) 当解决以上所有问题了,这里再测试一下,已经才能成功地领到我们想要的数据: