V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
slysly759
V2EX  ›  Python

分享爬取微信公众号的一点心得

  •  2
     
  •   slysly759 · 2016-09-14 15:50:51 +08:00 · 37890 次点击
    这是一个创建于 3026 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己探索出来一套爬取微信公众号的方法,发布出来就想看看这个微信反爬虫部门什么时候封。

    先上一张图片:

    关于这个探索出来的方法有几点我想写在前面

    1.为什么公布出来

    因为原来外包需求取消不涉及商业利益

    2.公布出来有什么好处么

    有,通过接受大家批评,来获得提高,认识一些有意思的人。

    3.发布出来这个能有效多长时间呢?

    不清楚,但是目前用的是一个笨方法。我觉得封的概率不太大。具体下面说明

    思路: 在 key 不和公众号绑定前,用的方法是每隔半个小时获取一个微信有效 key 然后批量获取微信文章页。

    问:如何获取 key 。

    思路:利用 fiddler 截获微信请求报文获取有效 key

    问:截取的 key 如何导入到本地或者实现上传到 FTP 方便我后续程序处理

    答:我修改了 fiddler 的 custom rules 让他可以遇到微信请求公众号的请求保留其 request 和 response 分别保存到 C 盘 text 文件具体可以参考我的博客(这个我真的不是广告,只是分享,不想了解就别点开了) 利用 fiddler 截获微信传输数据 (方便抓取公众号信息) 批量抓取微信公众号文章

    问:现在一个 key 只能获取一个公众号,我该如何办?

    答:目前我觉得你模拟点击电脑版的微信,截取其内容就好了。如果你要跟新 2000 个公众号,那么历史文章你只需要一个 key 在半小时内获取完一个公众号的所有文章(这个不难 几分钟就好了) 以后只需要每天模拟点开是否有新文章 如果有就加入 MySQL 。

    问:我看了你的文章,要获取历史文章列表,除了很傻比的模拟点击以外,你有提供任何解决方案么?

    答:有的,历史文章页通过 frommsgid 一个参数和 count 控制,修改他们就可以凭借你的 key 来获取任何时间的文章 list

    问:现在抓取微信公众号不是还有搜狗,他们还不需要关注公众号

    答:抓取傻逼搜狗并不能满足我一开始客户的需求,他要求至少 30 天,并且每天跟新。搜狗只能是最近 10 篇。

    问:我明白了,你现在的解决方案是通过模拟用户操作微信然后截取数据进行入库对么 这样看起来效率不高啊

    答:的确,但是本方法往往很难被封。其次你也可以手动获取 key 然后去批量获取历史文章啊,没有人拦着你啊 或者你发现那个 key 与公众号 ID 的加密算法被你解出来你完全可以直接用 key 啊 或者你社工好,拿到一个万能 key ,没有人拦着你去用更快更高效的方法呢。

    问:我看到你 github 写的代码很烂,而且还有一个 prepare_request 的东西,那个是什么?

    答:恩新手才学不就,以前并没有 Java 或者 c++功底。至于那个 prepare_request python 文件是原来 key 没有雨公众号关联的时候写的一个小脚本,之所以关联是因为我手残发帖到 V2EX 上来问大家 key 算法被微信反爬虫的小伙伴发现了就给我封掉了。。。。。所以就换了一个写

    问:我看到你目录下依旧有 fiddler 的生成文件了,为什么你的程序还要再处理一遍

    答:因为 fiddler 生成的是数据流文本,在每个字母之间有十六进制的 00 存在我的程序将其处理了,这个不到二十行的代码花了我一下午来折腾,说来惭愧。

    问:基本上你说的我了解,但是没有代码你说个 xx

    答:github 地址 如果各位大爷看我码字分享很辛苦 可否给小的一个 star 呢 转行不易,需要大家鼓励~

    43 条回复    2020-02-14 18:24:33 +08:00
    IJustmaogepao
        1
    IJustmaogepao  
       2016-09-14 16:13:43 +08:00
    先 mark ,已 star ,等有空看看
    slysly759
        2
    slysly759  
    OP
       2016-09-14 16:14:46 +08:00
    ytmsdy
        3
    ytmsdy  
       2016-09-14 16:16:53 +08:00
    哈哈哈哈,我也整了一个。 www.wdiandi.com
    目前我比较头疼的问题是数据量的上升不是一般的快啊,目前我的数据库已经上升到了 56G 。而且这还是文章内容进过 base64 ,转码,然后压缩过的。
    生怕那一天数据库挂了,然后就思密达了。
    slysly759
        4
    slysly759  
    OP
       2016-09-14 16:20:40 +08:00
    @ytmsdy 哈哈~用的也是通过 key 获取的喵
    要不自己买一个小服务器呢 我好像没有打开你的网站
    ytmsdy
        5
    ytmsdy  
       2016-09-14 16:24:00 +08:00
    @slysly759 现在服务器正在抓数据, mysql 数据库有点缓不过来。没有做读写分离的就是这么的悲剧!
    ljcarsenal
        6
    ljcarsenal  
       2016-09-14 16:29:54 +08:00
    @ytmsdy 你做这网站有啥收益么。。。感觉这类网站目前太多了
    slysly759
        7
    slysly759  
    OP
       2016-09-14 16:30:28 +08:00
    @ytmsdy 额你居然不做读写分离好吧 你赢了。。。。
    ytmsdy
        8
    ytmsdy  
       2016-09-14 16:31:55 +08:00
    @ljcarsenal 目前来看木有啥收益,访问量低的不行。坚持两年,如果不行就要关了。
    zijikai
        9
    zijikai  
       2016-09-14 16:31:57 +08:00 via iPhone
    从哪里转的行?
    ytmsdy
        10
    ytmsdy  
       2016-09-14 16:37:12 +08:00   ❤️ 1
    @slysly759 服务器资源有限,目前我网站的数据量大概是 650w 篇文章。目前数据库是 56G ,如果做读写分离,一个主库,一个从库。加起来就是差不多 120G !小服务器。。硬盘总共才 500G,还有其他的应用跑在上面。最多给 100G 的空间给这个网站,木有办法。
    slysly759
        11
    slysly759  
    OP
       2016-09-14 16:41:28 +08:00
    @zijikai 目前学生,国际经贸专业,虽然我喜欢我的专业也喜欢这里的老师,不过我更喜欢 IT 所以希望能够转过来。目前在凯捷实习。
    1987618girl
        12
    1987618girl  
       2016-09-14 18:21:56 +08:00
    小伙子有潜力啊,就是代码不够简洁,不过不错了,加油
    slysly759
        13
    slysly759  
    OP
       2016-09-14 18:47:46 +08:00 via Android
    @1987618girl 感谢,我会好好努力的| ू•ૅω•́)ᵎᵎᵎ
    verydxz
        14
    verydxz  
       2016-09-15 04:21:52 +08:00
    strategically mark
    mingyun
        15
    mingyun  
       2016-09-15 09:28:03 +08:00
    star+1
    GreatMartial
        16
    GreatMartial  
       2016-09-16 16:39:37 +08:00
    关注一下,已 star 。
    rearcher
        17
    rearcher  
       2016-09-16 23:45:34 +08:00 via Android
    之前实验室也是做了这样一个微信数据分析平台,我们是跑一台 windows 用脚本不断点击微信客户端文章,然后这个 windows 连到自己写的代理服务器,记录 request ,存日志,程序通过正则表达式提取 key 。
    lixuda
        18
    lixuda  
       2016-09-19 10:39:00 +08:00
    Fiddler 获得的链接 批量是靠按键精灵去点击吗?
    slysly759
        19
    slysly759  
    OP
       2016-09-19 10:42:52 +08:00
    @lixuda 可以按键精灵 可以自己写脚本 可以获取 key 然后拼接获得 key 获取公众号所有历史文章 自己选择 最后一项我会跟新的
    lixuda
        20
    lixuda  
       2016-09-19 11:16:21 +08:00
    @rearcher 能否提供下思路?模拟点击,谢谢
    lixuda
        21
    lixuda  
       2016-09-19 11:27:24 +08:00
    @slysly759 感谢,按照你的方法,目前我最大问题是模拟按键。希望楼主能提供下脚本模拟按键。
    slysly759
        22
    slysly759  
    OP
       2016-09-19 12:32:38 +08:00 via Android
    @lixuda 1. 按键精灵提供录制脚本
    2.工业级脚本 肯定是需要设置的,不一定适合。
    写脚本 JAVA Python 都行 按键精灵的据说是 VBA 效率不高用着用着崩溃了
    lixuda
        23
    lixuda  
       2016-09-19 13:47:06 +08:00
    @slysly759 如果是 python ,那意味着要模拟微信客户端的操作,貌似很难吧。我只知道 python 能模拟按键,至于操作一款软件,很难吧
    lixuda
        24
    lixuda  
       2016-09-19 16:24:09 +08:00
    @ytmsdy 模拟按键你是如何解决?谢谢哈
    pigpi
        25
    pigpi  
       2016-09-19 22:11:25 +08:00
    star+1 请教下 如果采用的脚本点击微信桌面版,那订阅的公众号怎么收集?难道手工一个一个去订阅吗
    slysly759
        26
    slysly759  
    OP
       2016-09-19 22:37:20 +08:00   ❤️ 1
    @pigpi 大锅有一个东西叫做一键批量订阅的工具==
    原来傻吊微信没有改 key 算法是可以获取所有的
    brucedone
        27
    brucedone  
       2016-09-20 08:52:43 +08:00
    欣赏大神的杰作!
    slysly759
        28
    slysly759  
    OP
       2016-09-20 10:33:27 +08:00
    @brucedone 感谢大神赏光~我会好好努力滴~
    pigpi
        29
    pigpi  
       2016-09-21 11:08:24 +08:00
    @slysly759 我试了下 貌似现在修改 formmsgid 和 count 不起作用了。
    rearcher
        30
    rearcher  
       2016-09-22 12:34:02 +08:00
    @lixuda 我觉得就是我们获取 key 的方式不一样吧,你是通过 fiddler 存到本地的吧,我是自己写了一个代理服务器,作用和 fiddler 一样,模拟点击的那台 windows 连我的代理服务器,所有的请求都记录到日志,通过正则从日志里提取 key 。至于以上提到的需不需要订阅所有公众号的问题,答案是不需要的,有一个 key 是可以访问所有文章的,我那台模拟点击的 windows 就是写了一个 python 点击脚本,一直重复点击某个公众号里的某几篇文章。
    lixuda
        31
    lixuda  
       2016-09-22 17:33:01 +08:00
    @rearcher 谢谢,模拟点击是微信客户端里面的内容吗?还是模拟点击浏览器网址?
    rearcher
        32
    rearcher  
       2016-09-24 10:43:22 +08:00
    @lixuda 过程大概是这样, 点击订阅号,出现你订阅的公众号列表,然后随便点一个公众号,然后点击这个公众号的历史文章,然后就会出现文章列表,然后我是从上到下所有文章都点一遍。这样循环。
    graetdk
        33
    graetdk  
       2016-09-27 17:21:49 +08:00
    @ytmsdy 有问题想请教,能给个联系方式吗?
    ytmsdy
        34
    ytmsdy  
       2016-09-27 18:27:29 +08:00 via iPhone
    @graetdk amhzaGVuZ3h5QGdtYWlsLmNvbQ==
    sundyli
        35
    sundyli  
       2016-10-26 18:05:57 +08:00
    我用 go 实现了一个, 基本原理和楼主的是一样的, 操作简单, 只需要几行代码运行, 手机设置代理, 微信点击历史文章, 不用 fiddle 之类的抓包, 已经实现自动翻页抓取, 防止微信屏蔽, 默认每页抓取休眠 50ms
    https://github.com/sundy-li/wechat_spider
    slysly759
        36
    slysly759  
    OP
       2016-10-26 23:45:33 +08:00 via Android
    @sundyli 棒棒哒
    cangbaotu
        37
    cangbaotu  
       2017-04-19 13:01:31 +08:00
    建议使用神箭手提供的专门爬取微信公众号文章的解决方案,还可以自动把爬到的文章进行伪原创同步到自己的网站和数据库,功能很强大: http://www.shenjianshou.cn/index.php?r=market/product&product_id=283
    85437898
        38
    85437898  
       2017-05-31 08:42:36 +08:00
    建议使用微信热文捕手提供的专门爬取微信公众号文章的解决方案,还可以自动把爬到的文章进行伪原创同步到自己的网站和数据库,功能很强大: http://www.wxhand.com.cn
    bestehen
        39
    bestehen  
       2018-07-03 17:33:51 +08:00
    如果我想获取每天更新的文章,你能抓取订阅号里面的那些公众号文章吗?
    5748hao
        40
    5748hao  
       2018-11-28 20:23:09 +08:00
    谢谢,你的贡献,刚好用上~
    LinJiu
        41
    LinJiu  
       2019-05-15 12:00:31 +08:00
    你好,我想问一下 这个代码 现在还可以用吗?
    kakalongcn
        42
    kakalongcn  
       2019-05-15 23:09:42 +08:00
    现在依然有效,想批量下载公众号的试试这个 www.xiaokuake.com
    golangggg
        43
    golangggg  
       2020-02-14 18:24:33 +08:00
    我这边也提供了一套免费抓取的方式, github.com/Edaaaaa/wx-spider 可以供大家参考 codes 里面有 php 和 py 的 demo 简单写一点逻辑就可以使用了 api 方式可以 在几分钟时间内从开发到上线.比起自己搭建 效率高了很多倍 如果对你有帮助的话 记得在 github 点一下 star 谢谢了~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   967 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:06 · PVG 06:06 · LAX 14:06 · JFK 17:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.