30分钟学会微信公众号的数据抓取

网络爬虫实战之微信公众号

简介: 这篇文章主要教大家怎么获取一些电脑无法访问的微信公众号数据,干货满满,30分钟包学会。

ps. 开始之前,我们先做个实验,大家把下面这个链接用电脑中的浏览器打开:
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU4MTIzNTE2Mw==&scene=124#wechat_redirect
理论上结果是,如图:
pc端访问微信
下面同样把链接复制到手机微信中打开,你会发现可以访问,如图:
这里写图片描述
怎么回事? 那我们怎么爬?手机上写程序吗?赶紧开始,不浪费时间了…

实战

环境

安装

> Fiddler安装

  • 抓包工具有很多,这里我使用的是Fiddler,下面我也是按照这个工具展示,其他工具不在这里讨论。

数据接口分析

1 我们虽然电脑不能直接访问该微信公众号,但我们可以通过电脑设置手机代理来访问,具体的步骤大家请参考这里。(由于我觉得这里写的很详细,就不自己单独写一份了)

2 如果第一步成功了,我们再次用手机微信访问上面提到的那个神奇的链接,这时候再查看Fiddler,我们应该可以找到下图所示的内容:
这里写图片描述

入口地址的Header信息如下:

GET https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU4MTIzNTE2Mw==&scene=124&devicetype=iPhone+OS9.3.2&version=16060223&lang=zh_CN&nettype=WIFI&a8scene=1&fontScale=100&pass_ticket=HzJHDnkJb3%2B0ahfIxvOkfBNKHuHMqPSTy6BhUfH%2Fh%2FIvlm9I3TXDMu%2BLVTBJrlje&wx_header=1 HTTP/1.1
Host: mp.weixin.qq.com
Cookie: devicetype=iPhoneOS9.3.2; lang=zh_CN; pass_ticket=HzJHDnkJb3+0ahfIxvOkfBNKHuHMqPSTy6BhUfH/h/Ivlm9I3TXDMu+LVTBJrlje; rewardsn=; version=16060223; wap_sid2=CPqn++IDElwyUVRfYlQzbUgtQXhyalNJSUNZV0FtQWN6aUpZanlOTzBPbXZhTmlLY254WXpUTTA0MlIyajVNQ1lzaXd0a25NTmRxRktFNzlsYWRDdHlBTEFaSy10YThEQUFBfjDG9vTTBTgNQJVO; wxtokenkey=53c052ead40aff8e2cd6620b4318c2cd55b1fa8b11fc42bb68b0259eaff6737b; wxuin=1012847610; pgv_pvid=9292485220; tvfe_boss_uuid=fd1f6cd130701ba3
X-WECHAT-KEY: f766f1cd6ee0ff274dc9860b51eae7f688d14083adcad2ef8de83924c183947c6bd72b106319c39f3de71761aa71412f6d75e59c7819490a459ccac7c46d3473489343f4fe4cb6c7db495ff9fb9b3c11
Proxy-Connection: keep-alive
X-WECHAT-UIN: MTAxMjg0NzYxMA%3D%3D
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69 MicroMessenger/6.6.2 NetType/WIFI Language/zh_CN
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
Connection: keep-alive

3 我们已经找到了入口地址,但是你会发现,就这个公众号而言,我们还可以下拉刷新的,行,刷新后观察Fiddler的变化,如下图:
这里写图片描述

Header信息如下:

GET https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MzU4MTIzNTE2Mw==&f=json&offset=16&count=10&is_ok=1&scene=124&uin=777&key=777&pass_ticket=HzJHDnkJb3%2B0ahfIxvOkfBNKHuHMqPSTy6BhUfH%2Fh%2FIvlm9I3TXDMu%2BLVTBJrlje&wxtoken=&appmsg_token=943_RlSAGtRNJ4hTeFCpdMXrQE5OMWo7zlA9yV3RsQ~~&x5=0&f=json HTTP/1.1
Host: mp.weixin.qq.com
Accept-Encoding: gzip, deflate
Cookie: devicetype=iPhoneOS9.3.2; lang=zh_CN; pass_ticket=HzJHDnkJb3+0ahfIxvOkfBNKHuHMqPSTy6BhUfH/h/Ivlm9I3TXDMu+LVTBJrlje; rewardsn=; version=16060223; wap_sid2=CPqn++IDElxoZGlxSHVkbU5iUTgxdk5ERml2S0VTUFdTeFppcC1zRDNNS05qLTRvMlBhc0NWV0ZUX212UHYwQTZMQThmNUR6anFjZEh5V1FnNGtIT2NXQkhuUFhHcThEQUFBfjDE9/TTBTgNQJVO; wxtokenkey=53c052ead40aff8e2cd6620b4318c2cd55b1fa8b11fc42bb68b0259eaff6737b; wxuin=1012847610; pgv_pvid=9292485220; tvfe_boss_uuid=fd1f6cd130701ba3
Connection: keep-alive
Proxy-Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69 MicroMessenger/6.6.2 NetType/WIFI Language/zh_CN
Referer: https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU4MTIzNTE2Mw==&scene=124&devicetype=iPhone+OS9.3.2&version=16060223&lang=zh_CN&nettype=WIFI&a8scene=1&fontScale=100&pass_ticket=HzJHDnkJb3%2B0ahfIxvOkfBNKHuHMqPSTy6BhUfH%2Fh%2FIvlm9I3TXDMu%2BLVTBJrlje&wx_header=1
Accept-Language: zh-cn
X-Requested-With: XMLHttpRequest

我这里用上面的方法,对页面访问了两次,截取刷新后的url,分析两次访问的参数的异同,所以参数可能和读者不太一样:

扫描二维码关注公众号,回复: 1634555 查看本文章

第一次访问的url:

https://mp.weixin.qq.com/mp/profile_ext?action=getmsg
&__biz=MzU4MTIzNTE2Mw==
&f=json
&offset=16
&count=10
&is_ok=1
&scene=124
&uin=777
&key=777
&pass_ticket=HzJHDnkJb3%2B0ahfIxvOkfBNKHuHMqPSTy6BhUfH%2Fh%2FIvlm9I3TXDMu%2BLVTBJrlje
&wxtoken=
&appmsg_token=943_RlSAGtRNJ4hTeFCpdMXrQE5OMWo7zlA9yV3RsQ~~
&x5=0
&f=json

第二次访问的url:


https://mp.weixin.qq.com/mp/profile_ext?action=getmsg
&__biz=MzU4MTIzNTE2Mw==
&f=json
&offset=16
&count=10
&is_ok=1
&scene=124
&uin=777
&key=777
&pass_ticket=xbJdEC6xMdTcPhBobs039uy0hsso2Ii03RqWP1a1ACmWJjQe7YaU8XVdcOeQVgDP
&wxtoken=
&appmsg_token=943_WzQEBfwN9QQRZWd2GjBb44hpWWHBGAIx4wOHAA~~
&x5=0
&f=json
  • 这个url直接访问是不会给数据的,因为header中还有其他信息,我们单纯就看其中一些参数知道大概的意思就行,后面我们再用代码去测试。
__biz : 这个似乎没变,不管他
f: 数据格式为json
offset: 数据偏移量为16,可以认为是从哪条数据开始
count: 每一页的数量为10
pass_ticket: 一个加密参数,这个先别管,大家多访问几次就发现不太一样
appmsg_token:也是一个加密参数,先别管
其他的参数似乎都不怎么变动,到时候就带着一起访问吧。
  • 有这些信息就很稳了,我们大致可以发现规律了,第一次访问是有个初始页面的,初始页面中的数据在html中。下拉刷新时,后面的数据就是通过接口来获取,其中一些加密参数怎么来的,这个比较难,暂时教程中就带着这几个加密参数一起走就是,这里不细说。

编写爬虫

  • 终于分析完了,让我们来愉快的写代码吧!
# -*- coding:utf8 -*-
__author__ = 'power'
import urllib2
import re
import json
# 读者自己替换url
url = "https://mp.weixin.qq.com/mp/profile_ext?action=getmsg&__biz=MzU4MTIzNTE2Mw==&f=json" \
           "&offset=16" \
           "&count=10" \
           "&is_ok=1&scene=124&uin=777&key=777&pass_ticket=xbJdEC6xMdTcPhBobs039uy0hsso2Ii03RqWP1a1ACmWJjQe7YaU8XVdcOeQVgDP&wxtoken=&appmsg_token=943_Ybr%252BNzl3hE5TUzCdt3ESYvsmavTcuwaGNKX2-w~~&x5=0&f=json"

# 设置headers,这里可以一个一个试,发现只需要Cookie和User-Agent就行了
# 记得修改Cookie和User-Agent
headers = {
    # 'Accept-Encoding': 'gzip, deflate',
    'Cookie': 'devicetype=iPhoneOS9.3.2; lang=zh_CN; pass_ticket=xbJdEC6xMdTcPhBobs039uy0hsso2Ii03RqWP1a1ACmWJjQe7YaU8XVdcOeQVgDP; version=16060223; wap_sid2=CPqn++IDElw2eTdjZlZqQ2tTUjhWekZwcXN2b0xTNGp1YzhuekIzWVVKenpfRElxbm9iM05oVW5rQUxzU0hxQWhKamVsdEtyalIwMVE2SFNfOWd6ZHdvWWdUVnNsSzhEQUFBfjCHyvXTBTgNQJVO; wxuin=1012847610; pgv_pvid=9292485220; tvfe_boss_uuid=fd1f6cd130701ba3',
    # 'Connection': 'keep-alive',
    # 'Proxy-Connection': 'keep-alive',
    # 'Accept': '*/*',
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69 MicroMessenger/6.6.2 NetType/WIFI Language/zh_CN',
    # 'Referer': 'https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU4MTIzNTE2Mw==&scene=124&devicetype=iPhone+OS9.3.2&version=16060223&lang=zh_CN&nettype=WIFI&a8scene=1&fontScale=100&pass_ticket=xbJdEC6xMdTcPhBobs039uy0hsso2Ii03RqWP1a1ACmWJjQe7YaU8XVdcOeQVgDP&wx_header=1',
    # 'Accept-Language': 'zh-cn',
    # 'X-Requested-With': 'XMLHttpRequest'
}
data = None
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
# 将数据读出来
html = response.read()
# 我们下面将里面的title全部输出出来
# 数据转成字典
msg = json.loads(html)
# 从字典中读出信息列表
msg = msg["general_msg_list"]
pat_title = '"title":"(.*?)"'
# 根据正则表达式获取所有的title信息
titles = re.compile(pat_title, re.S).findall(msg)
for title in titles:
    print title
  • 运行程序,很棒,标题都输出来了,如图:
    结果

这里写图片描述

ps. 这里只是简单的写了一段爬虫的代码,读者有兴趣可以自己改造一下变成多页面或者设置代理去爬取。

注意事项

1 该篇文章只是简单的介绍微信公众号中数据接口如何获取,还有很多加密参数如何破解,这就比较难,下次有时间会给出详细的教程,这里一两下说不完。

2 如果安装或者运行中出了什么问题请留言。

3 由于微信中设置了url的过期时间,如果一个本来能访问的url突然不能访问了,请读者重新抓取。文章中的url应该都已经过期了,哈哈

相关资料

Fiddler设置代理
正则表达式基础
urllib2使用

猜你喜欢

转载自blog.csdn.net/g8433373/article/details/79297095