> 技术文档 > 详解(一)Python + Selenium 批量采集微信公众号_selenium微信文章

详解(一)Python + Selenium 批量采集微信公众号_selenium微信文章

在上一篇文章中,我提供了批量采集公众号+coze工作流AI总结+飞书自动推送的方案实现了每日自动跟踪微信公众号进行AI总结简报,效果如下:由于微信公众号的文章篇幅有限,无法对整体实践的全过程完整表述,因此后续将对中间关键阶段进行详细展开,本文主要针对第一阶段:批量采集微信公众号文章列表

自研方案

  • 方案一:影刀 RPA 通过微信公众平台后台接口进行页面抓取
    优点:技术门槛较低,可视化页面编写采集程序
    缺点:需要桌面化系统和浏览器配合,占用系统控制权,微信公众号平台需要扫码登录

  • 方案二:python selenium库通过模拟浏览器访问微信公众号后台接口进行脚本抓取
    优点:脚本环境依赖简单,只需要偶尔配合浏览器扫码登录
    缺点:脚本编写有门槛,微信公众号平台2-3天会登陆过期,需要扫码登录

  • 方案三:通过开源项目WeWe RSS采集公众号文章,通过RSS阅读器进行阅读
    优点:整体比较优雅,无需了解微信机制,页面配置,展现友好
    缺点:需要科学上网,云服务器+docker部署等资源技术,有接口不稳定帐号失效等问题

  • 方案四:通过anyproxy客户端代理解析微信https接口信息进行数据抓取
    优点:从协议层模拟实际访问,无风控风险,适合长期大规模方案
    缺点:多端开发,协议插件代理复杂

综上方案优缺点和个人技术精力,我选择了方案一和方案二进行快速实践,技术难度都不高,利于大家实践

实践过程

Python脚本批量采集微信公众号

使用Python脚本selenium库可以驱动浏览器进行扫码登录自动获取cookie,有效期为2-3天,当获取cookie后需要先获取当前会话token,再通过cookie+token访问微信公众平台的后端接口搜索公众号fakeid,最后通过cookie+token+fakeid查询文章列表,最后通过文章链接直接获取文章内容

1.环境安装

  • 需要安装python selenium模块包,需要使用selenium中的webdriver驱动浏览器进行登录获取Cookie;我安装selenium 版本发现无法调起浏览器,可能与插件不适配,降到主流版本4.5.0 OK

  • 使用webdriver功能需要安装对应浏览器的驱动插件,我这里测试用的是谷歌浏览器:google chrome版本为137.0.7151.104 ;chromedriver版本为:138.0.7204.92 注意:谷歌浏览器版本和chromedriver需要对应,否则会导致启动时报错。

chromedriver的官方下载

chromedriver的官方下载

2.脚本调起浏览器登录获取cookie

当前引入方式已更新至selenium.webdriver.chrome.service import Service as ChromeService,旧方式不可用

import time,random,re,json,requestsfrom selenium import webdriverfrom selenium.webdriver import Chromefrom selenium.webdriver.firefox.options import Optionsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.chrome.service import Service as ChromeServiceimport requestsimport jsonimport datetimedef weChat_login():    #定义一个空的字典,存放cookies内容    post={}    #用webdriver启动谷歌浏览器    logging.info(\"启动浏览器,打开微信公众号登录界面\")    options = Options()    options.add_argument(\'-headless\')  # 无头参数    service = ChromeService(executable_path=\"/opt/homebrew/bin/chromedriver\")    driver = webdriver.Chrome(service=service)    #打开微信公众号登录页面    driver.get(\'https://mp.weixin.qq.com/\')    #等待5秒钟    time.sleep(2)    logging.info(\"正在输入微信公众号登录账号和密码......\")    #清空账号框中的内容    driver.find_element(By.XPATH, \"./*//a[@class=\'login__type__container__select-type\']\").click()    driver.find_element(By.XPATH, \"./*//input[@name=\'account\']\").clear()    #自动填入登录用户名    driver.find_element(By.XPATH, \"./*//input[@name=\'account\']\").send_keys(user)    #清空密码框中的内容    driver.find_element(By.XPATH, \"./*//input[@name=\'password\']\").clear()    #自动填入登录密码    driver.find_element(By.XPATH, \"./*//input[@name=\'password\']\").send_keys(password)    time.sleep(1)    #自动点击登录按钮进行登录    driver.find_element(By.XPATH, \"./*//a[@class=\'btn_login\']\").click()    # 拿手机扫二维码!    logging.info(\"请拿手机扫码二维码登录公众号\")    time.sleep(20)    #重新载入公众号登录页,登录之后会显示公众号后台首页,从这个返回内容中获取cookies信息    driver.get(\'https://mp.weixin.qq.com/\')    #获取cookies    cookie_items = driver.get_cookies()    #获取到的cookies是列表形式,将cookies转成json形式并存入本地名为cookie的文本中    for cookie_item in cookie_items:        post[cookie_item[\'name\']] = cookie_item[\'value\']    if \"slave_sid\" not in post:        logging.info(\"登录公众号失败,获取cookie失败\")        return None    cookie_str = json.dumps(post)    return cookie_str

3.使用cookie调用微信公众平台接口获取关注作者文章列表

该部分在上篇文章有详细说明,此处不再赘述

#爬取微信公众号文章,并存在本地文本中def get_wechat_upper_article_url():    #query为要爬取的公众号名称    #公众号主页    url = \'https://mp.weixin.qq.com\'    #设置headers    header = {        \"HOST\": \"mp.weixin.qq.com\",        \"User-Agent\": \"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0\"        }    #读取上一步获取到的cookies    config_json = read_config_json()    cookies_str = config_json.get(\'wechat\').get(\'cookie\')    if not cookies_str:        cookies = None    else:        cookies = json.loads(cookies_str)    #登录之后的微信公众号首页url变化为:https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=1849751598,从这里获取token信息    response = requests.get(url=url, allow_redirects=False, cookies=cookies)    if not response.headers.get(\"Location\"):        logging.info(\"微信cookie已过期,重新登录刷新\")        cookies = weChat_login()        if not cookies:            feishu_send_message(\"微信cookie过期,请重新登录刷新\")            return        cookies = json.loads(cookies)    response = requests.get(url=url,allow_redirects=False,cookies=cookies)    token = re.findall(r\'token=(\\d+)\', str(response.headers.get(\"Location\")))[0]    logging.info(\"微信token:\"+ token)    article_urls = []    for account_name, account_id in gzlist.items():        #搜索微信公众号的接口地址        search_url = \'https://mp.weixin.qq.com/cgi-bin/searchbiz?\'        #搜索微信公众号接口需要传入的参数,有三个变量:微信公众号token、随机数random、搜索的微信公众号名字        query_id = {            \'action\': \'search_biz\',            \'token\' : token,            \'lang\': \'zh_CN\',            \'f\': \'json\',            \'ajax\': \'1\',            \'random\': random.random(),            \'query\': account_name,            \'begin\': \'0\',            \'count\': \'5\'            }        #打开搜索微信公众号接口地址,需要传入相关参数信息如:cookies、params、headers        search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)        #取搜索结果中的第一个公众号        lists = search_response.json().get(\'list\')[0]        #获取这个公众号的fakeid,后面爬取公众号文章需要此字段        fakeid = lists.get(\'fakeid\')        logging.info(\"fakeid:\" + fakeid)        #微信公众号文章接口地址        appmsg_url = \'https://mp.weixin.qq.com/cgi-bin/appmsg?\'        #搜索文章需要传入几个参数:登录的公众号token、要爬取文章的公众号fakeid、随机数random        query_id_data = {            \'token\': token,            \'lang\': \'zh_CN\',            \'f\': \'json\',            \'ajax\': \'1\',            \'random\': random.random(),            \'action\': \'list_ex\',            \'begin\': \'0\',#不同页,此参数变化,变化规则为每页加5            \'count\': \'5\',            \'query\': \'\',            \'fakeid\': fakeid,            \'type\': \'9\'            }        #打开搜索的微信公众号文章列表页        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\')        item = fakeid_list[0]        # 采集item示例        new_article = {            \'title\': item.get(\'title\'),            \'article_url\': item.get(\'link\'),            \'account_id\': account_id,            \'account_name\': account_name,            \'publish_time\': datetime.datetime.fromtimestamp(int(item.get(\"update_time\"))).strftime(\'%Y-%m-%d %H:%M:%S\'),            \'collection_time\': datetime.datetime.now().strftime(\'%Y-%m-%d %H:%M:%S\')        }        logging.info(\"new_article:\", new_article)        article_urls.append(item.get(\'link\'))        time.sleep(2)    return article_urls

影刀 RPA 批量采集微信公众号

RPA主流程使用了飞书多维表格进行输出记录,主要步骤流程为:建立多维表格连接-->打开微信公众平台-->点击文章、超链接按钮-->循环搜索关注账号列表-->依次分页抓取所有文章链接-->保存链接至飞书多维表格记录,此过程需要浏览器提前进行微信公众平台登录,保存有效cookie,采集流程为全自动,我测试批量采集了150+公众号,共2W+文章,共耗时4—5小时

影刀RPA采集微信公众号1

影刀RPA采集微信公众号2

总结

不管用什么方式获取cookie,有效期都为2-3天,而RPA是需要接管独占浏览器,每日都需要登录,RPA程序本身也是模拟程序过程,因此不如Python脚本直接,脚本也利于与其他组件API进行集成,更加利于自动化,因此最后机器人过程采用了Python脚本进行。由于RPA程序节点较多,如若展开说明篇幅太大,因此仅截图说明思路,如需完整程序可加好友联系。