1.找到的三种公众号爬取方式
- 搜狗搜索。微信搜狗可以直接不使用微信账号就搜索到公众号最近10篇文章,github上也有大神作品,但是无奈测试的时候搜狗搜索接口没有返回。放弃这个方式。
- 手机代理。这也是wcplus使用的方法,给手机开代理后,电脑端获得手机搜索的公众号,然后爬取。我猜想这个过程是抓包传到电脑,电脑再爬吧。缺点就是需要手机和电脑端在同一网段,并且手机需要安装描述文件,前期准备麻烦。并且我在使用wcplus的时候,对微信版本还有限制,然后我发现我的版本过高,wcplus竟然因为有的数据找不到,整个爬虫都没法用。虽然可以按照源码重新走一遍,但是能力有限。
- 微信公众平台接口。虽然手机代理的方式可行,但是不想走一遍繁琐的调试过程。然后又看到了第三种方法,微信公众平台接口。attention:需要有公众号账号,这个是一定要有的,需要登陆公众平台。个人创建公众号(订阅号)也很简单。只要有公众号,就好办了。
2.公众平台接口
如何使用公众平台爬取公众号文章呢?
2017年某天,微信可以在公众号编辑素材时引用别人公众号的文章。官宣网址点我。
就是素材编辑那里上面那个超链接选项。点开以后竟然可以直接查找公众号和文章。
那我们只要直接抓包再试试token和一些其他参数是不是就可以了?答案是是的,我好懒。
具体过程可以参考已有大神的做法点我。下面我就直接贴代码了,过程分析,大神链接里写的很清楚,还有视频。
3.代码实现
首先获取身份认证的cookie,使用的selenium自动化工具,需要点一下就好。xpath我和大神的有不同,可能是因为微信改版。
from selenium import webdriver
import time
import json
from pprint import pprint
post = {}
driver = webdriver.Chrome(executable_path="E:\#2temp\#1downloadCache\chromedriver_win32\chromedriver.exe")
driver.get('https://mp.weixin.qq.com/')
time.sleep(2)
driver.find_element_by_xpath("//*[@id='header']/div[2]/div/div/form/div[1]/div[1]/div/span/input").clear()
driver.find_element_by_xpath("//*[@id='header']/div[2]/div/div/form/div[1]/div[1]/div/span/input").send_keys('your account')
driver.find_element_by_xpath("//*[@id='header']/div[2]/div/div/form/div[1]/div[2]/div/span/input").clear()
driver.find_element_by_xpath("//*[@id='header']/div[2]/div/div/form/div[1]/div[2]/div/span/input").send_keys('psw')
# 在自动输完密码之后记得点一下记住我
time.sleep(5)
driver.find_element_by_xpath("//*[@id='header']/div[2]/div/div/form/div[4]/a").click()
# 拿手机扫二维码!
time.sleep(15)
driver.get('https://mp.weixin.qq.com/')
cookie_items = driver.get_cookies()
for cookie_item in cookie_items:
post[cookie_item['name']] = cookie_item['value']
cookie_str = json.dumps(post)
with open('cookie.txt', 'w+', encoding='utf-8') as f:
f.write(cookie_str)
获得cookie以后再转换成token再获得公众号fakeid,接着获取文章就好。不清楚token有效时间,希望不会很短吧,文章链接也有可能不是长期有效的,最好直接保存下来。
import requests
import redis
import json
import re
import random
import time
gzlist = ['CVer']
url = 'https://mp.weixin.qq.com'
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
}
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
response = requests.get(url=url, cookies=cookies)
token = re.findall(r'token=(\d+)', str(response.url))[0]
for query in gzlist:
#get gzh fakeid
query_id = {
'action': 'search_biz',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'query': query,
'begin': '0',
'count': '5',
}
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
lists = search_response.json().get('list')[0]
fakeid = lists.get('fakeid')
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '0',
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
max_num = appmsg_response.json().get('app_msg_cnt')
print('max_num',max_num)
num = int(int(max_num) / 5)
begin = 0
while num + 1 > 0:
query_id_data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'action': 'list_ex',
'begin': '{}'.format(str(begin)),
'count': '5',
'query': '',
'fakeid': fakeid,
'type': '9'
}
print('翻页###################', begin)
query_fakeid_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
fakeid_list = query_fakeid_response.json().get('app_msg_list')
for item in fakeid_list:
print(item.get('title'))
print(item.get('link'))
num -= 1
begin = int(begin)
begin += 5
time.sleep(2)
然后关于接口的使用限制,我暂时没有找到说明,后面在测试过程中有问题,会持续更贴。
有啥问题欢迎关注公众号直接后台问我,博客我不常上,但是公众号有消息推送,我会第一时间回复的。