Python爬虫实战练习:爬取微信公众号文章

优采云 发布时间: 2020-08-25 22:24

  Python爬虫实战练习:爬取微信公众号文章

  接着,我们通过Python来获取同样的资源,但直接运行如下代码是难以获取资源的

  import requests

url = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI1MjU5MjMzNA==&type=9&query=&token=1957521839&lang=zh_CN&f=json&ajax=1"

requests.get(url).json()

# {'base_resp': {'ret': 200003, 'err_msg': 'invalid session'}}

  我们之所以能在浏览器上获取资源,是因为我们登陆了微信公众号前端。而Python并没有我们的登入信息,所以恳求是无效的。我们须要在requests中设置headers参数,在其中传入Cookie和User-Agent,来模拟登录

  由于每次头信息内容还会变动,因此我将这种内容装入在单独的文件中,即"wechat.yaml",信息如下

  cookie: ua_id=wuzWM9FKE14...<br />user_agent: Mozilla/5.0...

  之后只须要读取即可

  # 读取cookie和user_agent

import yaml

with open("wechat.yaml", "r") as file:

file_data = file.read()

config = yaml.safe_load(file_data)

headers = {

"Cookie": config['cookie'],

"User-Agent": config['user_agent']

}

requests.get(url, headers=headers, verify=False).json()

  在返回的JSON中,我们就听到了每位文章的标题(title), 摘要(digest), 链接(link), 推送时间(update_time)和封面地址(cover)等信息。

  appmsgid是每一次推送的惟一标识符,aid则是整篇推文的惟一标识符。

  

  实际上,除了Cookie外,URL中的token参数也会拿来限制爬虫,因此上述代码太有可能输出会是{'base_resp': {'ret': 200040, 'err_msg': 'invalid csrf token'}}

  接着我们写一个循环,获取所有文章的JSON,并进行保存。

  import json

import requests

import time

import random

import yaml

with open("wechat.yaml", "r") as file:

file_data = file.read()

config = yaml.safe_load(file_data)

headers = {

"Cookie": config['cookie'],

"User-Agent": config['user_agent']

}

# 请求参数

url = "https://mp.weixin.qq.com/cgi-bin/appmsg"

begin = "0"

params = {

"action": "list_ex",

"begin": begin,

"count": "5",

"fakeid": config['fakeid'],

"type": "9",

"token": config['token'],

"lang": "zh_CN",

"f": "json",

"ajax": "1"

}

# 存放结果

app_msg_list = []

# 在不知道公众号有多少文章的情况下,使用while语句

# 也方便重新运行时设置页数

i = 0

while True:

begin = i * 5

params["begin"] = str(begin)

# 随机暂停几秒,避免过快的请求导致过快的被查到

time.sleep(random.randint(1,10))

resp = requests.get(url, headers=headers, params = params, verify=False)

# 微信流量控制, 退出

if resp.json()['base_resp']['ret'] == 200013:

print("frequencey control, stop at {}".format(str(begin)))

break

# 如果返回的内容中为空则结束

if len(resp.json()['app_msg_list']) == 0:

print("all ariticle parsed")

break

app_msg_list.append(resp.json())

# 翻页

i += 1

  在里面代码中,我将fakeid和token也储存在了"wechat.yaml"文件中,这是因为fakeid是每位公众号都特有的标识符,而token则会经常性变动,该信息既可以通过解析URL获取,也可以从开发者工具中查看

  

  在爬取一段时间后,就会碰到如下的问题

  {'base_resp': {'err_msg': 'freq control', 'ret': 200013}}

  此时你在公众号后台尝试插入超链接时才能遇见如下这个提示

  

  这是公众号的流量限制,通常须要等上30-60分钟能够继续。为了完美处理这个问题,你可能须要申请多个公众号,可能须要和微信公众号的登陆系统斗智斗勇,或许还须要设置代理池。

  但是我并不需要一个工业级别的爬虫,只想爬取自己公众号的信息,因此等个一小时,重新登陆公众号,获取cookie和token,然后运行即可。我可不想用自己的兴趣挑战他人的饭碗。

  最后将结果以JSON格式保存。

  # 保存结果为JSON

json_name = "mp_data_{}.json".format(str(begin))

with open(json_name, "w") as file:

file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))

  或者提取文章标识符,标题,URL,发布时间这四列信息,保存成CSV。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线