使用到的技术:python3,微信公众号的全部内容分析

优采云 发布时间: 2021-07-28 21:03

  使用到的技术:python3,微信公众号的全部内容分析

  使用的技术:python3、selenium、requests

  最近接到一个新项目,需要爬取微信公众号的数据。接下来就和大家分享一下

  笔者在网上也看到过使用**搜狗微信API来抓取数据,但是如果我想按照公众号把它的文章全部抓取,发现不行

  

  它只有最近的文章,意思是我想把他的文章全部弄到手,但是不行(可能作者不合格,但是我没找到。欢迎大家同学帮我改正)。如果你搜索文章,是这种

  

  比如我想爬取公众号的所有文章,还是不行。

  还有使用抓包工具**来抓app的数据接口。这是可行的,但是抓包工具的配置和网页数据接口的分析非常复杂,这里就不介绍了。

  接下来说说我的想法

  1.在微信公众号平台注册一个账号(注册一个即可)

  

  然后点击超链接,进入公众号,选择显示公众号的所有文章信息,如图

  

  

  好的,现在我们找到了数据,继续进行网络分析

  2.分析网页

  F12 调试

  

  这里我们可以观察信息界面,分析这个json数据,可以看到链接收录文章,链接,标题,时间等,所以,接下来添加代码

  3.上代码

  首先解决的是登录问题,我用selenium+chrome登录,

  account_name = "账号"

password = "密码"

def wechat_login():

# 用webdriver启动谷歌浏览器

print("启动浏览器,打开微信公众号登录界面")

driver = webdriver.Chrome()

driver.get("https://mp.weixin.qq.com/")

time.sleep(2)

print("正在输入微信公众号登录账号和密码......")

# 清空账号框中的内容

try:

driver.find_element_by_name("account").clear()

print("正在输入微信公众号登录账号和密码......")

driver.find_element_by_name("account").send_keys(account_name)

time.sleep(1)

driver.find_element_by_name("password").clear()

driver.find_element_by_name("password").send_keys(password)

time.sleep(1)

# 在自动输完密码之后需要手动点一下记住我

print("请在登录界面点击:记住账号")

driver.find_element_by_class_name("frm_checkbox_label").click()

time.sleep(5)

# 自动点击登录按钮进行登录

driver.find_element_by_class_name("btn_login").click()

# 拿手机扫二维码!

print("请拿手机扫码二维码登录公众号")

time.sleep(30)

print("登录成功")

# 获取cookies

cookie_items = driver.get_cookies()

except:

print("请拿手机扫码二维码登录公众号")

time.sleep(30)

print("登录成功")

# 获取cookies

cookie_items = driver.get_cookies()

post = {}

# 获取到的cookies是列表形式,将cookies转成json形式并存入本地名为cookie的文本中

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)

print("cookies信息已保存到本地")

driver.quit()

  这里说明一下,微信公众号平台的登录界面可能不同。

  

  这是一种情况,就是直接扫码登录,另一种是

  

  用账号登录,所以登录的时候多了一种情况,最后记得把网页中的cookie信息保存在本地,用来爬取

  2.获取具体的文章

  def get_content(query):

# query为要爬取的公众号名称

# 公众号主页

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

# 设置headers

header = {

"HOST": "mp.weixin.qq.com",

"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

}

from requests.packages import urllib3

urllib3.disable_warnings() # 关闭警告

# 读取上一步获取到的cookies

with open('cookie.txt', 'r', encoding='utf-8') as f:

cookie = f.read()

cookies = json.loads(cookie)

# 增加重试连接次数

session = requests.Session()

session.keep_alive = False

# 增加重试连接次数

session.adapters.DEFAULT_RETRIES = 511

time.sleep(5)

# 登录之后的微信公众号首页url变化为:https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=1849751598,从这里获取token信息

response = session.get(url=url, cookies=cookies, verify=False)

token = re.findall(r'token=(\d+)', str(response.url))[0]

time.sleep(2)

# 搜索微信公众号的接口地址

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': query,

'begin': '0',

'count': '5'

}

# 打开搜索微信公众号接口地址,需要传入相关参数信息如:cookies、params、headers

search_response = session.get(

search_url,

cookies=cookies,

headers=header,

params=query_id)

# 取搜索结果中的第一个公众号

lists = search_response.json().get('list')[0]

print(lists)

# 获取这个公众号的fakeid,后面爬取公众号文章需要此字段

fakeid = lists.get('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'

}

# 打开搜索的微信公众号文章列表页

appmsg_response = session.get(

appmsg_url,

cookies=cookies,

headers=header,

params=query_id_data)

# 获取文章总数

max_num = appmsg_response.json().get('app_msg_cnt')

# 每页至少有5条,获取文章总的页数,爬取时需要分页爬

num = int(int(max_num) / 5)

# 起始页begin参数,往后每页加5

begin = 0

seq = 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)

time.sleep(5)

# 获取每一页文章的标题和链接地址,并写入本地文本中

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')

if fakeid_list:

for item in fakeid_list:

content_link = item.get('link')

content_title = item.get('title')

fileName = query + '.txt'

seq += 1

with open(fileName, 'a', encoding='utf-8') as fh:

fh.write(

str(seq) +

"|" +

content_title +

"|" +

content_link +

"\n")

num -= 1

begin = int(begin)

begin += 5

  好了朋友们,以上就是对微信公众号全部内容的抓取,希望对大家有所帮助,欢迎各位大佬指正修改,共同学习进步

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线