【项目跟进】KnowledgeManager--2--公众号爬虫原理

1.找到的三种公众号爬取方式

  1. 搜狗搜索。微信搜狗可以直接不使用微信账号就搜索到公众号最近10篇文章,github上也有大神作品,但是无奈测试的时候搜狗搜索接口没有返回。放弃这个方式。
  2. 手机代理。这也是wcplus使用的方法,给手机开代理后,电脑端获得手机搜索的公众号,然后爬取。我猜想这个过程是抓包传到电脑,电脑再爬吧。缺点就是需要手机和电脑端在同一网段,并且手机需要安装描述文件,前期准备麻烦。并且我在使用wcplus的时候,对微信版本还有限制,然后我发现我的版本过高,wcplus竟然因为有的数据找不到,整个爬虫都没法用。虽然可以按照源码重新走一遍,但是能力有限。
  3. 微信公众平台接口。虽然手机代理的方式可行,但是不想走一遍繁琐的调试过程。然后又看到了第三种方法,微信公众平台接口。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)

然后关于接口的使用限制,我暂时没有找到说明,后面在测试过程中有问题,会持续更贴。

有啥问题欢迎关注公众号直接后台问我,博客我不常上,但是公众号有消息推送,我会第一时间回复的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值