如何使用python3抓取微信公众号文章,了解一下?
admin
2023-01-21 08:40:04
0
通过微信公众平台的查找文章接口,抓取我们需要的相关文章
1.首先我们先看一下,通过正常的登录自己的微信公众号,然后用文章搜索功能,搜索一下我们需要查找的相关文章。
  • 打开https://mp.weixin.qq.com
  • 登录公众号,打开素材管理,点击新建分享图文
    如何使用python3抓取微信公众号文章,了解一下?
  • 打开一个文章搜索接口
    如何使用python3抓取微信公众号文章,了解一下?
  • 输入要搜索的内容后,可以搜索到相关文章的标题、出自哪个公众号等信息。
2.实现思路
  • 这里有一个问题,打开微信公众平台首页,输入账号密码后需要使用管理的微信号扫码确认一下才能最终成功登录微信公众号,这个要怎么解决呢?

  • 我们可以第一次登录的时候按正常的流程输入账号密码,扫码登录,拿到cookies,保存下来以便后面调用这个cookies来验证登录;当然cookies是有失效时间的,但是我在测试的时候好像过了3-4个小时还能用,够做好多事情了。

  • 基本思路:1.通过selenium驱动浏览器 打开登录页面 ,输入账号密码登录 ,获取登录后的cookies,保存cookies以便调用;2.拿到cookies之后 ,去请求首页 登录后直接跳转到个人首页,打开文章搜索框,找一些需要的信息;3.拿到有用的信息后,构造data数据包 ,模拟post请求, 然后返回数据,拿到数据之后 ,解析出我们需要的数据。
3.获取cookies,话不多说,贴个代码
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
from selenium import webdriver
import time
import json
driver = webdriver.Chrome()    #需要一个谷歌驱动chromedriver.exe,要支持你当前谷歌浏览器的版本
driver.get('https://mp.weixin.qq.com/')     #发起get请求打开微信公众号平台登录页面,然后输入账号密码登录微信公众号

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('这里输入你的账号')   #定位到账号输入框,输入账号
time.sleep(3)     #等待3秒后执行下一步操作,避免因为网络延迟,浏览器来不及加载出输入框,从而导致以下的操作失败
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('这里输入你的密码')   #定位到密码输入框,输入密码
time.sleep(3)     #原因和以上相同
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[3]/label').click()   #点击记住密码
time.sleep(3)     #原因和以上相同
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[4]/a').click()   #点击登录

time.sleep(15)    #15秒内扫码登录
cookies = driver.get_cookies()  #获取扫码登录成功之后的cookies
print(cookies)       #打印出来看看,如果超时了还不扫码,获取到的cookies是不完整的,不能用来登录公众号,所以第一次必须扫码登录以获取完整的cookies
cookie = {}      #定义一个空字典,以便把获取的cookies以字典的形式写入

for items in cookies:             #把登录成功后获取的cookies提取name和value参数写入空字典cookie
    cookie[items.get('name')] = items.get('value')

with open('cookies.txt','w') as file:          #新建并打开一个cookies.txt文件
    file.write(json.dumps(cookie))  #写入转成字符串的字典

driver.close()      #关闭浏览器
4.新建一个py文件,代码如下
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
import requests
import json
import re       #正则模块
import random   #随机数模块
import time

#query = 'python'
#读取之前登录后保存的cookies
with open('cookies.txt','r') as file:
    cookie = file.read()

url = 'https://mp.weixin.qq.com/'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
    'Referer': 'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&share=1&token=773059916&lang=zh_CN',
    'Host': 'mp.weixin.qq.com',
}

cookies = json.loads(cookie)    #加载之前获取的cookies
print(cookies)     #可以打印看看,和之前保存的cookies是一样的

response = requests.get(url, cookies = cookies)    #请求https://mp.weixin.qq.com/,传cookies参数,登录成功
token = re.findall(r'token=(\d+)',str(response.url))[0]    #登录成功后,这是的url里是包含token的,要把token参数拿出来,方便后面构造data数据包发起post请求
#print(token)
#random.random()返回0到1之间随机数
#构造data数据包发起post请求
data = {
    'token': token,
    'lang': 'zh_CN',
    'f': 'json',
    'ajax': '1',
    'random': random.random(),
    'url': 'python',
    'begin': '0',
    'count': '3',
}

search_url = 'https://mp.weixin.qq.com/cgi-bin/operate_appmsg?sub=check_appmsg_copyright_stat'      #按F12在浏览器里找post请求的url(搜索文章请求的url)
search_response = requests.post(search_url, cookies=cookies, data=data, headers=headers)     #发起post请求,传cookies、data、headers参数
max_num = search_response.json().get('total')   #获取所有文章的条数
num = int(int(max_num/3)) #每页显示3篇文章,要翻total/3页,不过实际上我搜索了几个关键词,发现微信公众号文章搜索的接口最多显示667页,其实后面还有页数,max_num/3的结果大于667没关系

if __name__ == '__main__':
    query = input('请输入你要搜索的内容:')
begin = 0
while num +1 > 0:
    print(begin)
    data = {
        'token': token,
        'lang': 'zh_CN',
        'f': 'json',
        'ajax': '1',
        'random': random.random(),
        'url': query,
        'begin': '{}'.format(str(begin)),
        'count': '3',
    }

    search_response = requests.post(search_url, cookies=cookies, data=data, headers=headers)

    contentt = search_response.json().get('list')               #list里面是我们需要的内容,所以要获取list

    for items in contentt:                                       #具体需要list里面的哪些参数可以自己选择,这里只获取title、url、nickname、author
        f = open('search.txt',mode='a',)                             #打开一个txt文档,把获取的内容写进去,mode='a'是追加的方式写入,不覆盖
        print('文章标题:',items.get('title'))  #获取文章标题
        f.write('文章标题:')
        f.write(items.get('title'))
        f.write("\n")
        f.write('文章url:')
        f.write(items.get('url'))
        f.write("\n")
        f.write('公众号:')
        f.write(items.get('nickname'))
        f.write("\n")
        f.write('作者:')
        f.write(items.get('author'))
        f.write("\n")
        f.write("\n")
        print('文章url:',items.get('url'))    #获取文章的url
        print('公众号:',items.get('nickname'))  #获取出自哪个微信公众号
        print('文章作者:',items.get('author'))   #获取文章作者

    num -= 1
    begin = int(begin)
    begin += 3
    time.sleep(3)
  • 运行结果如下:

如何使用python3抓取微信公众号文章,了解一下?
如何使用python3抓取微信公众号文章,了解一下?

  • search.txt里保存的内容如下:

如何使用python3抓取微信公众号文章,了解一下?

  • 只要有一个微信公众号就可以实现,可以注册一个试一试。

相关内容

热门资讯

德国总理:美国正在被伊朗羞辱 德国之声4月27日报道,德国总理默茨在访问一所学校时表示,在当前的持续冲突中,伊朗领导层正试图羞辱美...
理响中国|“长”歌以行,风云激... 光阴如梭,东方潮阔。这里是中国的长三角,世界的长三角。无论过去、现在还是未来,这片土地都因时代而生,...
白宫:特朗普及其国安团队开会讨... 新华社华盛顿4月27日电 美国白宫新闻秘书莱维特27日在记者会上证实,总统特朗普及其国家安全团队当天...
人民日报刊文:日本放开杀伤性武... 日本放开杀伤性武器出口推高地缘冲突风险(国际论坛)常思纯《人民日报》(2026年04月28日 第 0...
医疗保障法草案二审:明确生育保... 满足多样化健康保障需求本报记者 彭 波4月27日,医疗保障法草案二审稿提请十四届全国人大常委会第二十...
天津一景区发生自转旋翼机事故1... 澎湃新闻记者 吕新文中国民用航空华北地区管理局4月22日公布《豪客通航“10•1”天津长芦汉盐旅游区...
卡塔尔埃米尔与美国总统特朗普通... 当地时间24日,卡塔尔埃米尔塔米姆与美国总统特朗普通电话,重点就中东地区局势以及伊朗与美国谈判问题交...
男子30年前被扣押2859克黄... 澎湃新闻记者 王鑫家住辽宁省大连市的潘永嘉近日向澎湃新闻反映称,三十年前,他在大连周水子机场被盖州市...
商务部:取消反制欧盟两家金融机... 中华人民共和国商务部令二〇二六年 第1号鉴于欧盟已取消对中国两家金融机构的制裁措施,现公布《关于取消...
过去24小时共有5艘船只通过霍... 总台记者当地时间24日获悉,过去24小时内,共有5艘船只通过霍尔木兹海峡,其中包括一艘伊朗油轮。(总...