前言
本文仅用于学习使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
一、数据准备
1、在某信公众平台上注册一个账号用于获取关键数据
2、注册完成后按照下面图文操作获取待爬取的公众号信息,搜索自己想要的公众号
点击进入待爬取的公众号,然后在浏览器上鼠标右键点击查看审核元素,点击网络(即network)找到"appmsg"开头的文档打开。
下面我们来解析一下这份文档:
1、URL:
从这可以看出该文档基本url为:问号前面这部分
2、cookie:
cookie隔断时间会自动更新,没有cookie的话直接requests.get()是获取不了文章的。
3、user-agent:
user-agent用于将python伪装成一个普通的用户去正常访问服务器
这里有个需要注意的点:
1、fakeid是微信公众号的唯一标识符
2、token是一个用于限制爬虫的一个参数,隔段时间也会更新
二、完整代码
先附上完整代码,后面有详细代码解析
import requests
import re
import csv
import time
import pandas as pd
headers = {
"Cookie":"appmsglist_action_3274572572=card; RK=XehxU9peSU; ptcz=95a8ffbd10736622148737eb73888f7660e7dddd656271c5870fd813f3651f2c; pac_uid=1_504168539; iip=0; tvfe_boss_uuid=9aee0d93d6d67858; pgv_pvid=5314099328; o_cookie=504168539; pgv_pvi=9233449984; ua_id=mQ5C92HdkxsSpIApAAAAAKZzHtK_BXPTYp3jfSaKY9o=; wxuin=46308164865891; mm_lang=zh_CN; uuid=7a48a466b231ccd67cd8329a06aefb7b; rand_info=CAESIOkdo/sKbVU446lVSmc5E3d9jm+2CB1pJy7mS2lHoveJ; slave_bizuin=3274572572; data_bizuin=3274572572; bizuin=3274572572; data_ticket=a7JfO8AVShaa17EkiagXFtwQDmXXB2H2Ui35fRixQ4ceQq0KbQI3tgjSlE7Gi2yV; slave_sid=UF9XMjJkeXljRGlTMEJtcWpuUFJXOWRLenRVWk1LQ2JqSWxRU0x2dEJEd2tMVVNvUjJwQlpYcENKOE5BS2hlT3J0cHduT2Y1T2tVZ241OWJBSDRJbUpsRUZlNmVMUnAwXzI4MHpiUVpnemNxV0VoNzhVU3dnV3NvRTloeGtHRUxkZDFPRW5YVkd0bEF5RWQ3; slave_user=gh_b77ee583f1f7; xid=56410b97e460e56d19283daf8432f73b",
"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg'
data = {'token':'111525524', # 隔段时间要更新
"lang":"zh_CN",
"f":"json",
"ajax":"1",
"action":"list_ex",
"begin":"0",
"count":"4",
"query":"",
"fakeid":"Mzg2ODU0NTA2Mw==",
"type":"9",
}
content_list = []
n = int(input("需要爬取多少页(一页有四篇):"))
for i in range(n): # 爬取n三页
data["begin"] = i*4 # 修改data中的begin数值(一页有4个结果)
time.sleep(3) # 防止被检测(不要低于3)
content_json = requests.get(url=url,headers=headers,params=data).json()
# print(content_json) 用于观察
# 获取信息
for item in content_json["app_msg_list"]:
# 提取每页文章的标题及对应的url
items = []
items.append(item["title"])
items.append(item["link"])
content_list.append(items)
print("正在爬取第",i+1,"页")
name=['title','link']
test=pd.DataFrame(columns=name,data=content_list)
test.to_csv("test.csv",mode='a',encoding='utf-8')
print("保存成功")
三、代码解析
1、导入库
import requests
import re
import csv
import time
import pandas as pd
2、将上面准备的数据存放在一个变量上
headers = {
"Cookie":"appmsglist_action_3274572572=card; RK=XehxU9peSU; ptcz=95a8ffbd10736622148737eb73888f7660e7dddd656271c5870fd813f3651f2c; pac_uid=1_504168539; iip=0; tvfe_boss_uuid=9aee0d93d6d67858; pgv_pvid=5314099328; o_cookie=504168539; pgv_pvi=9233449984; ua_id=mQ5C92HdkxsSpIApAAAAAKZzHtK_BXPTYp3jfSaKY9o=; wxuin=46308164865891; mm_lang=zh_CN; uuid=7a48a466b231ccd67cd8329a06aefb7b; rand_info=CAESIOkdo/sKbVU446lVSmc5E3d9jm+2CB1pJy7mS2lHoveJ; slave_bizuin=3274572572; data_bizuin=3274572572; bizuin=3274572572; data_ticket=a7JfO8AVShaa17EkiagXFtwQDmXXB2H2Ui35fRixQ4ceQq0KbQI3tgjSlE7Gi2yV; slave_sid=UF9XMjJkeXljRGlTMEJtcWpuUFJXOWRLenRVWk1LQ2JqSWxRU0x2dEJEd2tMVVNvUjJwQlpYcENKOE5BS2hlT3J0cHduT2Y1T2tVZ241OWJBSDRJbUpsRUZlNmVMUnAwXzI4MHpiUVpnemNxV0VoNzhVU3dnV3NvRTloeGtHRUxkZDFPRW5YVkd0bEF5RWQ3; slave_user=gh_b77ee583f1f7; xid=56410b97e460e56d19283daf8432f73b",
"user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg'
data = {'token':'111525524', # 隔段时间要更新
"lang":"zh_CN",
"f":"json",
"ajax":"1",
"action":"list_ex",
"begin":"0",
"count":"4",
"query":"",
"fakeid":"Mzg2ODU0NTA2Mw==",
"type":"9",
}
需要用自己浏览器上对应的参数,cookie与token隔断时间也会更新,写错的话会返回
'base_resp': {'ret': 200003, 'err_msg': 'invalid session'}这个结果
3、requests它的json文件,观察一下里面有什么
content_list = [] # 用于存放爬取的数据
n = int(input("需要爬取多少页(一页有四篇):"))
for i in range(n): # 爬取n三页
data["begin"] = i*4 # 修改data中的begin数值(一页有4个结果)
time.sleep(3) # 防止被检测(不要低于3)
content_json = requests.get(url=url,headers=headers,params=data).json()
print(content_json)
如果需要爬取该公众号全部文章的话可以自行将for循环改成”while True:”,这里为了方便测试就用了for循环。
json文件爬取的结果:
整理一下文档格式找一下有用信息发现关键信息都在app_msg_list列表中:
4、用列表提取app_msg_list列表关键信息并保存:
content_list = []
n = int(input("需要爬取多少页(一页有四篇):"))
for i in range(n): # 爬取n三页
data["begin"] = i*4 # 修改data中的begin数值(一页有4个结果)
time.sleep(3) # 防止被检测(最好不要低于3)
content_json = requests.get(url=url,headers=headers,params=data).json()
# print(content_json) 用于观察
# 获取信息
for item in content_json["app_msg_list"]:
# 提取每页文章的标题及对应的url
items = []
items.append(item["title"])
items.append(item["link"])
content_list.append(items)
print("正在爬取第",i+1,"页")
5、将爬取的信息以csv格式保存在电脑上
name=['title','link']
test=pd.DataFrame(columns=name,data=content_list)
test.to_csv("test.csv",mode='a',encoding='utf-8')
print("保存成功")