更新:2019-08-03 18:07:02

事实证明打脸是非常快的,在写文章的时候还能正确抓取,可是第二天发现RSS文件并没有更新!在查看了任务日志以后,发现原Scenario提取出来的文章列表为空,用浏览器在测试后发现搜狗不提供最近的10篇文章列表了,在百度站长BBS上也有讨论,现在只能抓取搜索结果页中最近文章一篇了!所以就有了这个新的Scenario,点我下载呀!
搜狗不提供文章列表了

另外增加k=<k>&h=<h>两个参数的函数也被搜狗更新啦,有个小小的改动!

8月2日左右更新前
8月2日左右更新后

注意:多个公众号不要用同一个Agent去抓,会被封IP的,#1 搜索公众号 的Agent可以多复制几个,在不同的时间Schedule!IP被封了之后用浏览器正确填写一次验证码就可以解封了!


又来折腾这件事,要说到上个月和老板远程开过会之后,忘记关闭TV就看了微信公众号,然后老板私信我让我关掉…不得不说,现在打开手机没事就看一下微信,时间是被碎片化了,所以就又回来使用RSS订阅了,三年前使用过一段时间,那个时候微广场还在运行,这次发现已经停服了,RSSHub上边有几个微信公众号的RSS服务商,尝试后觉得都不好用,广告还特别多,所有就决定自己动手搭建一个。

关于Huginn就不介绍了,这次在折腾的过程中,发现网上已有教程都失效了,搜狗升级了反爬虫逻辑,最新的(2019-08-01)的反反爬方法可以参考搜狗微信公众号更新反爬,反反爬思路,其实文中提到的SUV cookie不是必须的,获取公众号文章列表最简洁的需要四个必须项:

  • 搜索结果的URL中加上k=<k>&h=<h>,上文中有代码可以参考
  • Cookie需要SNUID
  • 需要Referer, 就是 搜索url
  • User-Agent

比如我要爬的是利器公众号,各步骤如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 1. 搜索公众号,找到响应头中的SNUID cookie, 比如SNUID=561D77724842C842B2EDA025480F1841 
以及找到文章列表的连接
curl -i "https://weixin.sogou.com/weixin?type=1&query=liqiio&ie=utf8&s_from=input&_sug_=n&_sug_type_=" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"

# 2. 重新构造连接,比如抓到的链接是
# "https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6EzDJysI4ql5MPrOUp16838dGRMI7NnPqYjgTZJTvyIe0v47eKKaovwwvDqyjOWdznRm5urIxFAe1fUoYJ9nyUAdrQXl_05eaVpD2RJskiB3QPjBPE_rT5n5vjKqGbCyDk8ML1vrm9Qpav4blJrSbroDBwqIvthprh6n2T3AixuKv-px0u4VvZGRTpLLTNgHY&type=1&query=liqiio"

# 构造后可能是(不一定,里边有随机数逻辑)
# "https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6EzDJysI4ql5MPrOUp16838dGRMI7NnPqYjgTZJTvyIe0v47eKKaovwwvDqyjOWdznRm5urIxFAe1fUoYJ9nyUAdrQXl_05eaVpD2RJskiB3QPjBPE_rT5n5vjKqGbCyDk8ML1vrm9Qpav4blJrSbroDBwqIvthprh6n2T3AixuKv-px0u4VvZGRTpLLTNgHY&type=1&query=liqiio&k=55&h=v"

# 3. 请求获得中间要要跳转的URL
curl "https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6EzDJysI4ql5MPrOUp16838dGRMI7NnPqYjgTZJTvyIe0v47eKKaovwwvDqyjOWdznRm5urIxFAe1fUoYJ9nyUAdrQXl_05eaVpD2RJskiB3QPjBPE_rT5n5vjKqGbCyDk8ML1vrm9Qpav4blJrSbroDBwqIvthprh6n2T3AixuKv-px0u4VvZGRTpLLTNgHY&type=1&query=liqiio&k=55&h=v" \
-H "Cookie: SNUID=561D77724842C842B2EDA025480F1841" \
-H "Referer: https://weixin.sogou.com/weixin?type=1&query=liqiio&ie=utf8&s_from=input&_sug_=n&_sug_type_=" \
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"

# 请求结果是
<meta content="always" name="referrer">
<script>
var url = '';
url += 'http://mp.w';
url += 'eixin.qq.co';
url += 'm/profile?s';
url += 'rc=3&timest';
url += 'amp=1564659';
url += '518&ver=1&s';
url += 'ignature=09';
url += '1ydch1Etmv2';
url += 'cTRl3quzz8a';
url += 'MuPSr2pdCSo';
url += 'QecoCjYJ4vZxdW1USUwcMcy62HAs5lWA4jDFW8FWVVfdafVXL7g==';
url.replace("@", "");
window.location.replace(url)
</script>

# 4. 把上边的结果拼一下访问就行了,注意这个网页列表是JS修改DOM出来的内容,可以用无头浏览器抓取解析后的HTML
curl "http://mp.weixin.qq.com/profile?src=3&timestamp=1564659518&ver=1&signature=091ydch1Etmv2cTRl3quzz8aMuPSr2pdCSoQecoCjYJ4vZxdW1USUwcMcy62HAs5lWA4jDFW8FWVVfdafVXL7g=="

根据上边的步骤,我在Huginn写了一个Scenario,用来抓取微信公众号文章并烧录RSS,点击下载,不要问我为什么不直接用PhantomJSCloudAgent省去中间跳转URL的解析过程,我不会告诉你是因为我配置Referer和cookies费老大劲都没成功,所以决定自己来。整一个线性流程,如图。

微信公众号RSS订阅

参考

  1. 搜狗微信公众号更新反爬,反反爬思路
  2. Huginn实现自动通过slack推送豆瓣高分电影
  3. https://huginnio.herokuapp.com/scenarios
  4. https://gist.github.com/cdpath/fcf4c59e933275e5db2758920a9c1fd8
  5. 使用Huginn+RSS构建个人信息中心