
querylist采集微信公众号文章
querylist采集微信公众号文章(批量获取公众号推送超链接的原理(图)介绍)
采集交流 • 优采云 发表了文章 • 0 个评论 • 311 次浏览 • 2022-01-17 22:08
一、前言
二、准备
三、正式开始
四、结束语
一、前言
前几天书文问我能不能爬取微信公众号“北京邮教部”的历史动态,分析最多的成绩和科目。之前没做过微信公众号爬虫,所以研究了一下,发现了这个文章。
二、准备三、正式开始(一)批量获取之前公众号推送的url链接1.微信后台插入其他公众号推送超链接的原理公众号
如果要批量抓取微信公众号过去的推送,最大的问题是如何获取这些推送的url链接。因为通常我们点击一个推送时,微信会随机生成一个url链接,而这个随机生成的url与公众号推送的其他url没有任何关联。因此,如果我们要批量抓取公众号的所有推送,需要手动点击每条推送,复制每条推送的url链接。这显然是不现实的。在广泛查阅各种资料后,我学会了如何爬取公众号所有文章this文章的方法。
这种方式的原理是,当我们登录微信公众号后台编辑图文素材时,可以在素材中插入其他公众号的推送链接。这里,微信公众号后台会自动调用相关API,返回公众号推送的所有长链接列表。
我们打开Chrome浏览器的查看模式,选择网络,然后在编辑超链接界面的公众号搜索栏中输入“北京邮政家教部”,搜索并选择公众号,发现一个刷新的网络以“开头” appmsg”开头的内容,这是我们分析的目标。
我们点击“appmsg”开头的内容,解析请求的url:
https://mp.weixin.qq.com/cgi-b ... x%3D1
链接分为三个部分:
request的基本部分?action=list_ex常用于动态网站,实现不同的参数值生成不同的页面或返回不同的结果&begin=0&count=5&fakeid=MjM5NDY3ODI4OA==&type=9&query=&token= 1983840068&lang=zh_CN&f =json&ajax=1 设置各种参数2.获取Cookie和User-Agent
如果使用Python的Requests库直接访问url,是无法正常获取结果的。原因是在使用网页版微信公众号在后台插入超链接时,我们处于登录状态,但是当我们使用python直接访问时,我们并没有处于登录状态。因此,我们需要在访问时手动获取Cookie和User-Agent,并在使用Python的Requests库访问时将它们传递到headers参数中。这里说一下,我把公众号标识符 fakeid 和 token 参数保存在一个 yaml 文件中,方便爬取时加载。
cookie : appmsglist_action_3899……
user_agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64)……
fakeid : MzI4M……
token : "19……
在python代码中加载如下:
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']
}
3.设置url参数
然后我们设置要请求的url链接的参数:
# 请求参数
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"
}
这里,count 是请求返回的信息数,begin 是当前请求的页数。当begin设置为0时,会以json格式返回最近五次推送信息,以此类推。
4.开始爬取
通过一个循环,begin的值每次加1,循环爬取:
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)))
time.sleep(3600)
continue
# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("app_msg_list.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
print(f"第{i}页爬取成功\n")
print("\n".join(info.split(",")))
print("\n\n---------------------------------------------------------------------------------\n")
# 翻页
i += 1
爬了大概50页的时候,遇到如下错误:{'base_resp': {'err_msg': 'freq control', 'ret': 200013}}这是因为微信公众号有流量限制,等一个小时就好了. 我在这里使用以下代码来解决它:
# 微信流量控制
if resp.json()['base_resp']['ret'] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
time.sleep(3600)
continue
对于每条爬取的信息,对其进行解析并将其存储在一个 csv 文件中:
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("python小屋.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
5.完整代码
完整代码如下:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : Spider.py
@Time : 2021/06/04 02:20:24
@Author : YuFanWenShu
@Contact : 1365240381@qq.com
'''
# here put the import lib
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语句
# 也方便重新运行时设置页数
with open("app_msg_list.csv", "w",encoding='utf-8') as file:
file.write("文章标识符aid,标题title,链接url,时间time\n")
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)))
time.sleep(3600)
continue
# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("app_msg_list.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
print(f"第{i}页爬取成功\n")
print("\n".join(info.split(",")))
print("\n\n---------------------------------------------------------------------------------\n")
# 翻页
i += 1
6.爬取结果
最终结果保存在 csv 文件中,一共 565 条推送消息:
(二)对每次推送进行爬取,提取需要的信息1.对每次推送进行遍历和爬取
从 csv 文件中读取每次推送的 url 链接,并使用 Requests 库抓取每次推送的内容:
with open("app_msg_list.csv","r",encoding="utf-8") as f:
data = f.readlines()
n = len(data)
for i in range(n):
mes = data[i].strip("\n").split(",")
if len(mes)!=4:
continue
title,url = mes[1:3]
if i>0:
r = requests.get(eval(url),headers=headers)
if r.status_code == 200:
text = r.text
projects = re_project.finditer(text)
2.提取信息并写入文件
我们需要提取的是每个导师信息的年级和科目。通过观察推送结构,我决定使用正则表达式进行提取。
有的家教订单长时间没有回复,会在多个帖子中重复出现,从而影响我们的统计结果。我决定用数字来识别不同的辅导信息,相同的数字只会计算一次。所以使用下面的正则表达式来匹配:
<p>re_project = re.compile(r">编号(.*?)年级(.*?)科目(.*?)科目(.*?)年级(.*?)编号(.*?)年级(.*?)科目(.*?) 查看全部
querylist采集微信公众号文章(批量获取公众号推送超链接的原理(图)介绍)
一、前言
二、准备
三、正式开始
四、结束语
一、前言
前几天书文问我能不能爬取微信公众号“北京邮教部”的历史动态,分析最多的成绩和科目。之前没做过微信公众号爬虫,所以研究了一下,发现了这个文章。
二、准备三、正式开始(一)批量获取之前公众号推送的url链接1.微信后台插入其他公众号推送超链接的原理公众号
如果要批量抓取微信公众号过去的推送,最大的问题是如何获取这些推送的url链接。因为通常我们点击一个推送时,微信会随机生成一个url链接,而这个随机生成的url与公众号推送的其他url没有任何关联。因此,如果我们要批量抓取公众号的所有推送,需要手动点击每条推送,复制每条推送的url链接。这显然是不现实的。在广泛查阅各种资料后,我学会了如何爬取公众号所有文章this文章的方法。
这种方式的原理是,当我们登录微信公众号后台编辑图文素材时,可以在素材中插入其他公众号的推送链接。这里,微信公众号后台会自动调用相关API,返回公众号推送的所有长链接列表。

我们打开Chrome浏览器的查看模式,选择网络,然后在编辑超链接界面的公众号搜索栏中输入“北京邮政家教部”,搜索并选择公众号,发现一个刷新的网络以“开头” appmsg”开头的内容,这是我们分析的目标。

我们点击“appmsg”开头的内容,解析请求的url:
https://mp.weixin.qq.com/cgi-b ... x%3D1
链接分为三个部分:
request的基本部分?action=list_ex常用于动态网站,实现不同的参数值生成不同的页面或返回不同的结果&begin=0&count=5&fakeid=MjM5NDY3ODI4OA==&type=9&query=&token= 1983840068&lang=zh_CN&f =json&ajax=1 设置各种参数2.获取Cookie和User-Agent
如果使用Python的Requests库直接访问url,是无法正常获取结果的。原因是在使用网页版微信公众号在后台插入超链接时,我们处于登录状态,但是当我们使用python直接访问时,我们并没有处于登录状态。因此,我们需要在访问时手动获取Cookie和User-Agent,并在使用Python的Requests库访问时将它们传递到headers参数中。这里说一下,我把公众号标识符 fakeid 和 token 参数保存在一个 yaml 文件中,方便爬取时加载。
cookie : appmsglist_action_3899……
user_agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64)……
fakeid : MzI4M……
token : "19……
在python代码中加载如下:
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']
}
3.设置url参数
然后我们设置要请求的url链接的参数:
# 请求参数
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"
}
这里,count 是请求返回的信息数,begin 是当前请求的页数。当begin设置为0时,会以json格式返回最近五次推送信息,以此类推。
4.开始爬取
通过一个循环,begin的值每次加1,循环爬取:
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)))
time.sleep(3600)
continue
# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("app_msg_list.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
print(f"第{i}页爬取成功\n")
print("\n".join(info.split(",")))
print("\n\n---------------------------------------------------------------------------------\n")
# 翻页
i += 1
爬了大概50页的时候,遇到如下错误:{'base_resp': {'err_msg': 'freq control', 'ret': 200013}}这是因为微信公众号有流量限制,等一个小时就好了. 我在这里使用以下代码来解决它:
# 微信流量控制
if resp.json()['base_resp']['ret'] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
time.sleep(3600)
continue
对于每条爬取的信息,对其进行解析并将其存储在一个 csv 文件中:
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("python小屋.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
5.完整代码
完整代码如下:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : Spider.py
@Time : 2021/06/04 02:20:24
@Author : YuFanWenShu
@Contact : 1365240381@qq.com
'''
# here put the import lib
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语句
# 也方便重新运行时设置页数
with open("app_msg_list.csv", "w",encoding='utf-8') as file:
file.write("文章标识符aid,标题title,链接url,时间time\n")
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)))
time.sleep(3600)
continue
# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("app_msg_list.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
print(f"第{i}页爬取成功\n")
print("\n".join(info.split(",")))
print("\n\n---------------------------------------------------------------------------------\n")
# 翻页
i += 1
6.爬取结果
最终结果保存在 csv 文件中,一共 565 条推送消息:

(二)对每次推送进行爬取,提取需要的信息1.对每次推送进行遍历和爬取
从 csv 文件中读取每次推送的 url 链接,并使用 Requests 库抓取每次推送的内容:
with open("app_msg_list.csv","r",encoding="utf-8") as f:
data = f.readlines()
n = len(data)
for i in range(n):
mes = data[i].strip("\n").split(",")
if len(mes)!=4:
continue
title,url = mes[1:3]
if i>0:
r = requests.get(eval(url),headers=headers)
if r.status_code == 200:
text = r.text
projects = re_project.finditer(text)
2.提取信息并写入文件
我们需要提取的是每个导师信息的年级和科目。通过观察推送结构,我决定使用正则表达式进行提取。

有的家教订单长时间没有回复,会在多个帖子中重复出现,从而影响我们的统计结果。我决定用数字来识别不同的辅导信息,相同的数字只会计算一次。所以使用下面的正则表达式来匹配:
<p>re_project = re.compile(r">编号(.*?)年级(.*?)科目(.*?)科目(.*?)年级(.*?)编号(.*?)年级(.*?)科目(.*?)
querylist采集微信公众号文章(贴个代码4.新建一个py文件获取cookies文件 )
采集交流 • 优采云 发表了文章 • 0 个评论 • 138 次浏览 • 2022-01-17 13:21
)
通过微信公众平台的搜索文章界面,先抓取我们需要的相关文章1.,我们先来看看,正常登录我们的微信公众号,然后使用文章搜索功能,搜索我们需要查找的相关文章。 2.实现思路3.获取cookie,不多说,贴个代码
#!/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)
查看全部
querylist采集微信公众号文章(贴个代码4.新建一个py文件获取cookies文件
)
通过微信公众平台的搜索文章界面,先抓取我们需要的相关文章1.,我们先来看看,正常登录我们的微信公众号,然后使用文章搜索功能,搜索我们需要查找的相关文章。 2.实现思路3.获取cookie,不多说,贴个代码
#!/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)


querylist采集微信公众号文章(文章目录[隐藏]要怎么用公众号制作出图文并茂)
采集交流 • 优采云 发表了文章 • 0 个评论 • 132 次浏览 • 2022-01-16 09:16
文章目录[隐藏]
如何使用公众号创建一个图文并茂、布局精美的公众号文章?这次就一起来了解一下吧~
什么编辑器好用
小编刚接触公众号运营的时候,很长一段时间都是直接在公众号后台编辑打文章。做出来的文章看起来很简单,读数一直很惨淡。
直到有同事推荐,我才开始用编辑器做图文,不过一开始编辑器也是用最常见的第三方网页编辑器排版公众号文章,虽然可以在文章中插入各种小装饰,玩文章的排版技巧。
但是,每当小编将编辑后输入的文章同步到公众号后台时,总能发现有些样式没有同步。不仅如此,在某些地方还存在格式错误的问题。这种情况下,小编只能稍微修改一下,很累。
后来小编碰巧用了一个外挂的微信编辑器,然后才意识到可以在公众号后台一站式完成公众号操作的日常工作,比如找文章和图片,编辑和排版文章等等,排版和发布不用太担心。
下面小编就以我常用的一帆助手编辑器为例,为大家介绍一下如何使用一帆创建公众号文章~
如何使用一板助手创建公众号文章
当我们去一板官网下载一板安装包并在常用浏览器上安装后,可以授权登录公众号后台,在公众号背景。
接下来,我们新建一个图文,然后就可以在图文编辑界面查看一帆提供的编辑增强、样式中心、图文工具箱。
我们在原有公众号后台编辑功能的基础上,结合一帆提供的特殊表达、全文过滤、下划线等编辑增强功能,让我们的排版更加精致,也大大提升了我们的排版文章 效率。
当然,如果你觉得编辑和强化功能还不够,想要更新颖有趣的布局样式,可以在页面左侧的样式中心找到大量实用的布局样式,点击即可将他们添加到公共帐户 文章 !
接下来,我们来看看图文工具箱。有大量工具可以提高公众号的排版效率,比如版权地图中心、导入文章、生成永久链接等。点击完成操作。非常友好!
有兴趣的小伙伴快来一班官网下载这款好用的公众号操作神器吧! 查看全部
querylist采集微信公众号文章(文章目录[隐藏]要怎么用公众号制作出图文并茂)
文章目录[隐藏]
如何使用公众号创建一个图文并茂、布局精美的公众号文章?这次就一起来了解一下吧~
什么编辑器好用
小编刚接触公众号运营的时候,很长一段时间都是直接在公众号后台编辑打文章。做出来的文章看起来很简单,读数一直很惨淡。
直到有同事推荐,我才开始用编辑器做图文,不过一开始编辑器也是用最常见的第三方网页编辑器排版公众号文章,虽然可以在文章中插入各种小装饰,玩文章的排版技巧。
但是,每当小编将编辑后输入的文章同步到公众号后台时,总能发现有些样式没有同步。不仅如此,在某些地方还存在格式错误的问题。这种情况下,小编只能稍微修改一下,很累。
后来小编碰巧用了一个外挂的微信编辑器,然后才意识到可以在公众号后台一站式完成公众号操作的日常工作,比如找文章和图片,编辑和排版文章等等,排版和发布不用太担心。
下面小编就以我常用的一帆助手编辑器为例,为大家介绍一下如何使用一帆创建公众号文章~
如何使用一板助手创建公众号文章
当我们去一板官网下载一板安装包并在常用浏览器上安装后,可以授权登录公众号后台,在公众号背景。
接下来,我们新建一个图文,然后就可以在图文编辑界面查看一帆提供的编辑增强、样式中心、图文工具箱。
我们在原有公众号后台编辑功能的基础上,结合一帆提供的特殊表达、全文过滤、下划线等编辑增强功能,让我们的排版更加精致,也大大提升了我们的排版文章 效率。
当然,如果你觉得编辑和强化功能还不够,想要更新颖有趣的布局样式,可以在页面左侧的样式中心找到大量实用的布局样式,点击即可将他们添加到公共帐户 文章 !
接下来,我们来看看图文工具箱。有大量工具可以提高公众号的排版效率,比如版权地图中心、导入文章、生成永久链接等。点击完成操作。非常友好!
有兴趣的小伙伴快来一班官网下载这款好用的公众号操作神器吧!
querylist采集微信公众号文章( 如何搜索微信最新公众号内容?怎样搜索方法/步骤)
采集交流 • 优采云 发表了文章 • 0 个评论 • 151 次浏览 • 2022-01-16 09:15
如何搜索微信最新公众号内容?怎样搜索方法/步骤)
很多朋友在查看最新的微信公众号文章时,通常都会使用搜索功能,那么如何搜索最新的微信公众号的内容呢?如何查询微信公众号文章的历史记录?道路数据将为您介绍。
如何搜索最新的微信公众号内容
如何搜索最新的微信公众号内容?
方法/步骤
打开浏览器,进入搜狗搜索首页,点击“更多”进入更多功能页面。
在输入框中输入你要搜索的关键词(这里以“百度体验”为例),点击“搜索”。
进入搜索结果显示页面。点击任意一个文章阅读相关内容。
进入文字页面,可以看到发文的公众号文章。
微信公众号历史文章如何搜索
方法/步骤
首先,找到您要搜索的公众号并输入。进入后,部分公众号下方有对应的文章历史记录,可点击进入。
除此之外,还可以点击右上角的人形logo进入公众号历史后台文章。
进入后台后会看到文章最近几期的内容,不过这些对我们来说还不够,点击下拉找到全部信息,点击进入全部信息界面。
进入所有历史信息的界面,整个界面往下拉,然后顶部会出现一个搜索框。
这个搜索框可以搜索到这个文章里面的历史文章,点击搜索进入搜索界面。
例如在搜索界面输入“HPV”,之后出现的界面就是本公众号文章中关于HPV的全部文章。
如何搜索最新的微信公众号内容
如何搜索最新的微信公众号内容?微信公众号文章搜索
搜索所有公众号内容
在手机上打开微信,点击右上角的加号,选择【添加好友】,在打开的“添加好友”页面点击搜索框。
在搜索框中搜索关键词,就会出现带有这个关键词的内容。在搜索结果中选择“文章”,微信公众号文章将被过滤掉。搜索结果。
在搜索结果中,您还可以根据不同的条件进行筛选,按照不同的顺序进行排序,从而更快、更准确地找到您需要的内容。
搜索指定公众号文章 查看全部
querylist采集微信公众号文章(
如何搜索微信最新公众号内容?怎样搜索方法/步骤)

很多朋友在查看最新的微信公众号文章时,通常都会使用搜索功能,那么如何搜索最新的微信公众号的内容呢?如何查询微信公众号文章的历史记录?道路数据将为您介绍。

如何搜索最新的微信公众号内容
如何搜索最新的微信公众号内容?
方法/步骤
打开浏览器,进入搜狗搜索首页,点击“更多”进入更多功能页面。
在输入框中输入你要搜索的关键词(这里以“百度体验”为例),点击“搜索”。
进入搜索结果显示页面。点击任意一个文章阅读相关内容。
进入文字页面,可以看到发文的公众号文章。
微信公众号历史文章如何搜索
方法/步骤
首先,找到您要搜索的公众号并输入。进入后,部分公众号下方有对应的文章历史记录,可点击进入。
除此之外,还可以点击右上角的人形logo进入公众号历史后台文章。
进入后台后会看到文章最近几期的内容,不过这些对我们来说还不够,点击下拉找到全部信息,点击进入全部信息界面。
进入所有历史信息的界面,整个界面往下拉,然后顶部会出现一个搜索框。
这个搜索框可以搜索到这个文章里面的历史文章,点击搜索进入搜索界面。
例如在搜索界面输入“HPV”,之后出现的界面就是本公众号文章中关于HPV的全部文章。

如何搜索最新的微信公众号内容
如何搜索最新的微信公众号内容?微信公众号文章搜索
搜索所有公众号内容
在手机上打开微信,点击右上角的加号,选择【添加好友】,在打开的“添加好友”页面点击搜索框。
在搜索框中搜索关键词,就会出现带有这个关键词的内容。在搜索结果中选择“文章”,微信公众号文章将被过滤掉。搜索结果。
在搜索结果中,您还可以根据不同的条件进行筛选,按照不同的顺序进行排序,从而更快、更准确地找到您需要的内容。
搜索指定公众号文章
querylist采集微信公众号文章(Python微信公众号文章文章爬取的示例代码一.思路)
采集交流 • 优采云 发表了文章 • 0 个评论 • 446 次浏览 • 2022-01-13 16:12
Python微信公众号文章爬取示例代码
一.想法
我们通过微信公众平台网页版图文消息中的超链接获取我们需要的界面
从界面中我们可以得到对应的微信公众号和所有对应的微信公众号文章。
二.界面分析
获取微信公众号界面:
范围:
行动=search_biz
开始=0
计数=5
query=公众号
token = 每个账户对应的token值
lang=zh_CN
f=json
阿贾克斯=1
请求方法:
得到
所以在这个界面中,我们只需要获取token,查询的是你需要搜索的公众号,登录后可以通过网页链接获取token。
获取公众号对应的文章接口:
范围:
行动=list_ex
开始=0
计数=5
fakeid=MjM5NDAwMTA2MA==
类型=9
查询=
令牌=557131216
lang=zh_CN
f=json
阿贾克斯=1
请求方法:
得到
在这个接口中,我们需要获取的值是上一步的token和fakeid,而这个fakeid可以在第一个接口中获取。这样我们就可以得到微信公众号文章的数据了。
三.实现
第一步:
首先我们需要通过selenium来模拟登录,然后获取cookie和对应的token
def weChat_login(user, password):
post = {}
browser = webdriver.Chrome()
browser.get('https://mp.weixin.qq.com/')
sleep(3)
browser.delete_all_cookies()
sleep(2)
# 点击切换到账号密码输入
browser.find_element_by_xpath("//a[@class='login__type__container__select-type']").click()
sleep(2)
# 模拟用户点击
input_user = browser.find_element_by_xpath("//input[@name='account']")
input_user.send_keys(user)
input_password = browser.find_element_by_xpath("//input[@name='password']")
input_password.send_keys(password)
sleep(2)
# 点击登录
browser.find_element_by_xpath("//a[@class='btn_login']").click()
sleep(2)
# 微信登录验证
print('请扫描二维码')
sleep(20)
# 刷新当前网页
browser.get('https://mp.weixin.qq.com/')
sleep(5)
# 获取当前网页链接
url = browser.current_url
# 获取当前cookie
cookies = browser.get_cookies()
for item in cookies:
post[item['name']] = item['value']
# 转换为字符串
cookie_str = json.dumps(post)
# 存储到本地
with open('cookie.txt', 'w+', encoding='utf-8') as f:
f.write(cookie_str)
print('cookie保存到本地成功')
# 对当前网页链接进行切片,获取到token
paramList = url.strip().split('?')[1].split('&')
# 定义一个字典存储数据
paramdict = {}
for item in paramList:
paramdict[item.split('=')[0]] = item.split('=')[1]
# 返回token
return paramdict['token']
定义了一个登录方法,其中的参数是登录账号和密码,然后定义了一个字典来存储cookie的值。模拟用户输入对应的账号密码,点击登录,会出现扫码验证,登录微信即可扫码。
刷新当前网页后,获取当前cookie和token并返回。
第2步:
1.请求获取对应的公众号接口,获取我们需要的fakeid
url = 'https://mp.weixin.qq.com'
headers = {
'HOST': 'mp.weixin.qq.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63'
}
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
resp = requests.get(url=url, headers=headers, cookies=cookies)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
params = {
'action': 'search_biz',
'begin': '0',
'count': '5',
'query': '搜索的公众号名称',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)
传入我们获取的token和cookie,然后通过requests.get请求获取微信公众号返回的json数据
lists = search_resp.json().get('list')[0]
通过以上代码可以获取对应的公众号数据
fakeid = lists.get('fakeid')
通过上面的代码,可以得到对应的 fakeid
2.请求访问微信公众号文章接口,获取我们需要的文章数据
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
params_data = {
'action': 'list_ex',
'begin': '0',
'count': '5',
'fakeid': fakeid,
'type': '9',
'query': '',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)
我们传入 fakeid 和 token 然后调用 requests.get 请求接口获取返回的 json 数据。
我们实现了微信公众号文章的爬取。
四.总结
通过爬取微信公众号文章,需要掌握selenium和requests的用法,以及如何获取request接口。但是需要注意的是,我们在循环获取文章的时候,一定要设置延迟时间,否则容易被封号,获取不到返回的数据。
至此,这篇关于Python微信公众号文章爬取示例代码的文章文章就介绍到这里了。更多相关Python微信公众号文章爬取内容,请搜索我们之前的文章或继续浏览下方相关文章,希望大家以后多多支持!
时间:2020-11-27
基于Python采集爬取微信公众号历史数据
鲲之鹏技术人员将在本文中通过模拟微信App的操作,介绍一种采集指定公众号所有历史数据的方法。通过我们的抓包分析,我们发现微信公众号的历史数据是通过HTTP协议加载的,对应的API接口如下图所示,关键参数有四个(__biz.appmsg_token.pass_ticket和饼干)。为了获取这四个参数,我们需要模拟运行App,让它生成这些参数,然后我们抓包获取。对于模拟App操作,我们之前已经介绍过通过Python模拟Android App的方法(详见详情)。
python爬取微信公众号文章的方法
最近在学习Python3网络爬虫(崔庆才写的)的开发实践,刚刚得知他在这里使用代理爬取了公众号文章,但是根据他的代码,还是出现了一些问题。我在这里用过这本书。对本书前面提到的一些内容进行了改进。(作者半年前写的这段代码,腾讯的网站半年前更新了)我直接加下面代码:TIMEOUT = 20 from requests import Request, Session, PreparedRequest import requests from selenium import webdrive
Python如何爬取微信公众号文章及评论(基于Fiddler抓包分析)
背景描述我觉得微信公众号是比较难爬的平台之一,但是经过一番折腾,还是有一点小收获。没用Scrapy(估计爬太快有防爬限制),不过后面会开始整理写一些实战。. 简单介绍一下本次的开发环境:python3请求psycopg2(操作postgres数据库)抓包分析本次实战对公众号的抓包没有限制,但是每次抓包前都要对不同的公众号进行分析。打开Fiddler,在手机上配置相关代理。为了避免过多干扰,这里给Fiddler一个过滤规则,指定微信域名即可:
python selenium爬取微信公众号文章代码详解
参考:selenium webdriver 添加cookies: 需求:想看微信公众号文章的历史,但是每次都找地方不方便。思路:1.使用selenium打开微信公众号历史文章,滚动刷新到底部,获取所有历史文章url。2.遍历 url 并下载到本地。实现1.打开微信客户端,点击A微信公众号->进入公众号->打开历史文章链接(用浏览器打开),通过开发者工具获取cookie
Python爬取指定微信公众号文章
本文示例分享了python爬取微信公众号文章的具体代码,供大家参考。具体内容如下。该方法是依靠 urllib2 库完成的。首先需要安装你的python环境,然后安装urllib2库程序的启动方法(返回值为公众号文章的列表): def openUrl(): print("启动爬虫,打开搜狗搜索微信界面") # 加载页面url = ';s_from=input&query = 被抓取的公众号名称
Python爬取微信公众号文章
本文示例分享python爬取微信公众号文章的具体代码供大家参考,具体内容如下# -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup from requests .exceptions import RequestException import time import random import MySQLdb import threading import socket import math soc
Python爬虫_微信公众号推送信息爬取示例
问题描述 使用搜狗微信搜索抓取指定公众号的最新推送,并将对应网页保存到本地。注意,搜狗微信获取的地址是临时链接,具有时效性。公众号为动态网页(JavaScript渲染),使用requests.get()获取的内容不收录推送消息。这里使用 selenium+PhantomJS 处理代码#!/usr/bin/env python3 from selenium import webdriver from datetime import datetime import bs4, requ
Python使用webdriver爬取微信公众号
本文示例分享了python使用webdriver爬取微信公众号的具体代码,供大家参考。具体内容如下# -*- 编码:utf-8 -*- from selenium import webdriver import time import json import requests import re import random #微信公众号user="" #公众号密码password="" #设置需要爬取的公众号列表 gzlist=['香河微服务
Python抓取微信公众号账号信息的方法
搜狗微信搜索提供了两种关键词搜索,一种是搜索公众号文章的内容,另一种是直接搜索微信公众号。公众号基本信息可通过微信公众号搜索获取。还有最近发布的10个文章,今天就来抢微信公众号的账号信息爬虫吧。首先通过首页进入,可以按类别抓取,通过“查看更多”可以找到页面链接规则: import requests as req import re reTypes = r'id="pc_\d*" uigs=" (pc_\d*)">([\s\S]*?)&
一种使用python itchat包爬取微信好友头像形成矩形头像集的方法
初学者学python,一定要干点有趣的事!让我们从微信开始吧!头像采集示例如下: 可以发朋友圈开始鉴定大赛哈哈~ 废话不多说,直接上代码,我写了很多评论,大家应该都能看懂 import itchat import os import PIL .Image as Image from os import listdir import math import sys print("请进入查询模式:0-显示所有好友头像,但最终矩形头像集的最后一行可能不完整:1-头像集是一个完整的矩形,但朋友可能不完整,即在0模式下被丢弃
微信公众号Java批量获取方法详解
最近需要爬取微信公众号的文章信息。网上搜了一下,发现微信公众号爬取的难点在于公众号文章的链接在PC端打不开,所以用微信自带的浏览器(只能在PC端打开)得到微信客户端补充的参数后的其他平台),给爬虫带来了很大的麻烦。后来看到一个大牛在知乎上用php写的微信公众号爬取程序按照大佬的思路整理成java。改造过程中有很多细节问题,我就分享一下。系统的基本思路是在安卓模拟器上运行微信,模拟器设置代理,通过代理服务器截取微信数据,并将获取的数据发送给自己的程序进行处理。准备环境:node 查看全部
querylist采集微信公众号文章(Python微信公众号文章文章爬取的示例代码一.思路)
Python微信公众号文章爬取示例代码
一.想法
我们通过微信公众平台网页版图文消息中的超链接获取我们需要的界面


从界面中我们可以得到对应的微信公众号和所有对应的微信公众号文章。
二.界面分析
获取微信公众号界面:
范围:
行动=search_biz
开始=0
计数=5
query=公众号
token = 每个账户对应的token值
lang=zh_CN
f=json
阿贾克斯=1
请求方法:
得到
所以在这个界面中,我们只需要获取token,查询的是你需要搜索的公众号,登录后可以通过网页链接获取token。

获取公众号对应的文章接口:
范围:
行动=list_ex
开始=0
计数=5
fakeid=MjM5NDAwMTA2MA==
类型=9
查询=
令牌=557131216
lang=zh_CN
f=json
阿贾克斯=1
请求方法:
得到
在这个接口中,我们需要获取的值是上一步的token和fakeid,而这个fakeid可以在第一个接口中获取。这样我们就可以得到微信公众号文章的数据了。

三.实现
第一步:
首先我们需要通过selenium来模拟登录,然后获取cookie和对应的token
def weChat_login(user, password):
post = {}
browser = webdriver.Chrome()
browser.get('https://mp.weixin.qq.com/')
sleep(3)
browser.delete_all_cookies()
sleep(2)
# 点击切换到账号密码输入
browser.find_element_by_xpath("//a[@class='login__type__container__select-type']").click()
sleep(2)
# 模拟用户点击
input_user = browser.find_element_by_xpath("//input[@name='account']")
input_user.send_keys(user)
input_password = browser.find_element_by_xpath("//input[@name='password']")
input_password.send_keys(password)
sleep(2)
# 点击登录
browser.find_element_by_xpath("//a[@class='btn_login']").click()
sleep(2)
# 微信登录验证
print('请扫描二维码')
sleep(20)
# 刷新当前网页
browser.get('https://mp.weixin.qq.com/')
sleep(5)
# 获取当前网页链接
url = browser.current_url
# 获取当前cookie
cookies = browser.get_cookies()
for item in cookies:
post[item['name']] = item['value']
# 转换为字符串
cookie_str = json.dumps(post)
# 存储到本地
with open('cookie.txt', 'w+', encoding='utf-8') as f:
f.write(cookie_str)
print('cookie保存到本地成功')
# 对当前网页链接进行切片,获取到token
paramList = url.strip().split('?')[1].split('&')
# 定义一个字典存储数据
paramdict = {}
for item in paramList:
paramdict[item.split('=')[0]] = item.split('=')[1]
# 返回token
return paramdict['token']
定义了一个登录方法,其中的参数是登录账号和密码,然后定义了一个字典来存储cookie的值。模拟用户输入对应的账号密码,点击登录,会出现扫码验证,登录微信即可扫码。
刷新当前网页后,获取当前cookie和token并返回。
第2步:
1.请求获取对应的公众号接口,获取我们需要的fakeid
url = 'https://mp.weixin.qq.com'
headers = {
'HOST': 'mp.weixin.qq.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63'
}
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
resp = requests.get(url=url, headers=headers, cookies=cookies)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
params = {
'action': 'search_biz',
'begin': '0',
'count': '5',
'query': '搜索的公众号名称',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)
传入我们获取的token和cookie,然后通过requests.get请求获取微信公众号返回的json数据
lists = search_resp.json().get('list')[0]
通过以上代码可以获取对应的公众号数据
fakeid = lists.get('fakeid')
通过上面的代码,可以得到对应的 fakeid
2.请求访问微信公众号文章接口,获取我们需要的文章数据
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
params_data = {
'action': 'list_ex',
'begin': '0',
'count': '5',
'fakeid': fakeid,
'type': '9',
'query': '',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)
我们传入 fakeid 和 token 然后调用 requests.get 请求接口获取返回的 json 数据。
我们实现了微信公众号文章的爬取。
四.总结
通过爬取微信公众号文章,需要掌握selenium和requests的用法,以及如何获取request接口。但是需要注意的是,我们在循环获取文章的时候,一定要设置延迟时间,否则容易被封号,获取不到返回的数据。
至此,这篇关于Python微信公众号文章爬取示例代码的文章文章就介绍到这里了。更多相关Python微信公众号文章爬取内容,请搜索我们之前的文章或继续浏览下方相关文章,希望大家以后多多支持!
时间:2020-11-27
基于Python采集爬取微信公众号历史数据
鲲之鹏技术人员将在本文中通过模拟微信App的操作,介绍一种采集指定公众号所有历史数据的方法。通过我们的抓包分析,我们发现微信公众号的历史数据是通过HTTP协议加载的,对应的API接口如下图所示,关键参数有四个(__biz.appmsg_token.pass_ticket和饼干)。为了获取这四个参数,我们需要模拟运行App,让它生成这些参数,然后我们抓包获取。对于模拟App操作,我们之前已经介绍过通过Python模拟Android App的方法(详见详情)。
python爬取微信公众号文章的方法
最近在学习Python3网络爬虫(崔庆才写的)的开发实践,刚刚得知他在这里使用代理爬取了公众号文章,但是根据他的代码,还是出现了一些问题。我在这里用过这本书。对本书前面提到的一些内容进行了改进。(作者半年前写的这段代码,腾讯的网站半年前更新了)我直接加下面代码:TIMEOUT = 20 from requests import Request, Session, PreparedRequest import requests from selenium import webdrive
Python如何爬取微信公众号文章及评论(基于Fiddler抓包分析)

背景描述我觉得微信公众号是比较难爬的平台之一,但是经过一番折腾,还是有一点小收获。没用Scrapy(估计爬太快有防爬限制),不过后面会开始整理写一些实战。. 简单介绍一下本次的开发环境:python3请求psycopg2(操作postgres数据库)抓包分析本次实战对公众号的抓包没有限制,但是每次抓包前都要对不同的公众号进行分析。打开Fiddler,在手机上配置相关代理。为了避免过多干扰,这里给Fiddler一个过滤规则,指定微信域名即可:
python selenium爬取微信公众号文章代码详解
参考:selenium webdriver 添加cookies: 需求:想看微信公众号文章的历史,但是每次都找地方不方便。思路:1.使用selenium打开微信公众号历史文章,滚动刷新到底部,获取所有历史文章url。2.遍历 url 并下载到本地。实现1.打开微信客户端,点击A微信公众号->进入公众号->打开历史文章链接(用浏览器打开),通过开发者工具获取cookie
Python爬取指定微信公众号文章
本文示例分享了python爬取微信公众号文章的具体代码,供大家参考。具体内容如下。该方法是依靠 urllib2 库完成的。首先需要安装你的python环境,然后安装urllib2库程序的启动方法(返回值为公众号文章的列表): def openUrl(): print("启动爬虫,打开搜狗搜索微信界面") # 加载页面url = ';s_from=input&query = 被抓取的公众号名称
Python爬取微信公众号文章
本文示例分享python爬取微信公众号文章的具体代码供大家参考,具体内容如下# -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup from requests .exceptions import RequestException import time import random import MySQLdb import threading import socket import math soc
Python爬虫_微信公众号推送信息爬取示例

问题描述 使用搜狗微信搜索抓取指定公众号的最新推送,并将对应网页保存到本地。注意,搜狗微信获取的地址是临时链接,具有时效性。公众号为动态网页(JavaScript渲染),使用requests.get()获取的内容不收录推送消息。这里使用 selenium+PhantomJS 处理代码#!/usr/bin/env python3 from selenium import webdriver from datetime import datetime import bs4, requ
Python使用webdriver爬取微信公众号
本文示例分享了python使用webdriver爬取微信公众号的具体代码,供大家参考。具体内容如下# -*- 编码:utf-8 -*- from selenium import webdriver import time import json import requests import re import random #微信公众号user="" #公众号密码password="" #设置需要爬取的公众号列表 gzlist=['香河微服务
Python抓取微信公众号账号信息的方法
搜狗微信搜索提供了两种关键词搜索,一种是搜索公众号文章的内容,另一种是直接搜索微信公众号。公众号基本信息可通过微信公众号搜索获取。还有最近发布的10个文章,今天就来抢微信公众号的账号信息爬虫吧。首先通过首页进入,可以按类别抓取,通过“查看更多”可以找到页面链接规则: import requests as req import re reTypes = r'id="pc_\d*" uigs=" (pc_\d*)">([\s\S]*?)&
一种使用python itchat包爬取微信好友头像形成矩形头像集的方法
初学者学python,一定要干点有趣的事!让我们从微信开始吧!头像采集示例如下: 可以发朋友圈开始鉴定大赛哈哈~ 废话不多说,直接上代码,我写了很多评论,大家应该都能看懂 import itchat import os import PIL .Image as Image from os import listdir import math import sys print("请进入查询模式:0-显示所有好友头像,但最终矩形头像集的最后一行可能不完整:1-头像集是一个完整的矩形,但朋友可能不完整,即在0模式下被丢弃
微信公众号Java批量获取方法详解

最近需要爬取微信公众号的文章信息。网上搜了一下,发现微信公众号爬取的难点在于公众号文章的链接在PC端打不开,所以用微信自带的浏览器(只能在PC端打开)得到微信客户端补充的参数后的其他平台),给爬虫带来了很大的麻烦。后来看到一个大牛在知乎上用php写的微信公众号爬取程序按照大佬的思路整理成java。改造过程中有很多细节问题,我就分享一下。系统的基本思路是在安卓模拟器上运行微信,模拟器设置代理,通过代理服务器截取微信数据,并将获取的数据发送给自己的程序进行处理。准备环境:node
querylist采集微信公众号文章(微信公众号采集二级目录生成工具是一款第三版巧妙伪原创来袭 )
采集交流 • 优采云 发表了文章 • 0 个评论 • 125 次浏览 • 2022-01-12 08:05
)
微信公众号采集二级目录生成工具第三版聪明伪原创来了】微信公众号采集+聪明伪原创+多cms版,这个软件可以批量伪原创,然后批量伪原创检查,非常值得注意,请先在本地环境测试,本软件不能自动编码。
软件说明
1.本软件的功能:
适合优采云站长,也适合支持站内做站群的人
2.运行过程:
采集微信文章,然后伪原创点击这些文章,然后更新到网站。整个过程是全自动的。无需打开后台,通过数据库发送。因此,需要生成静态页面。
3.与上一版本对比:和之前一样,微信公众号在文章采集和采集之后使用了伪原创。不知道这算不算伪原创,但确实达到了伪原创的效果,
这个新版本伪原创的玩法很巧妙,就是翻译,先中文转英文,再英文转中文。可惜一天翻译量有限,可以自己换IP解决。(其实不适合更新太多,一天发几篇就OK了,一般如果是老网站的话。关键词可以很快排名)
如何使用
不建议新手站长使用,因为这个软件是用来偷懒的,新手最好不要偷懒。而且,重点是怕新手不懂概念,遇到问题也解决不了。然后来找我。我也很无能为力,我也是鸡。简单的问题我不想回答。我不会复杂的。
我不希望大家停止问我,但我希望大家从百度开始,不要再问了。有时候同一个问题可能被问了很多遍,我就会发脾气。我就是这样的人,请不要冒犯。还是希望能和大家一起进步。
查看全部
querylist采集微信公众号文章(微信公众号采集二级目录生成工具是一款第三版巧妙伪原创来袭
)
微信公众号采集二级目录生成工具第三版聪明伪原创来了】微信公众号采集+聪明伪原创+多cms版,这个软件可以批量伪原创,然后批量伪原创检查,非常值得注意,请先在本地环境测试,本软件不能自动编码。
软件说明
1.本软件的功能:
适合优采云站长,也适合支持站内做站群的人
2.运行过程:
采集微信文章,然后伪原创点击这些文章,然后更新到网站。整个过程是全自动的。无需打开后台,通过数据库发送。因此,需要生成静态页面。
3.与上一版本对比:和之前一样,微信公众号在文章采集和采集之后使用了伪原创。不知道这算不算伪原创,但确实达到了伪原创的效果,
这个新版本伪原创的玩法很巧妙,就是翻译,先中文转英文,再英文转中文。可惜一天翻译量有限,可以自己换IP解决。(其实不适合更新太多,一天发几篇就OK了,一般如果是老网站的话。关键词可以很快排名)
如何使用
不建议新手站长使用,因为这个软件是用来偷懒的,新手最好不要偷懒。而且,重点是怕新手不懂概念,遇到问题也解决不了。然后来找我。我也很无能为力,我也是鸡。简单的问题我不想回答。我不会复杂的。
我不希望大家停止问我,但我希望大家从百度开始,不要再问了。有时候同一个问题可能被问了很多遍,我就会发脾气。我就是这样的人,请不要冒犯。还是希望能和大家一起进步。

querylist采集微信公众号文章(糗事百科的几种方法,你都知道吗?!)
采集交流 • 优采云 发表了文章 • 0 个评论 • 97 次浏览 • 2022-01-12 06:05
querylist采集微信公众号文章等信息,也有支持api形式的querylist,比如,糗事百科之前引入了通讯录的关注查询功能,是基于querylist和api进行定制开发的。缺点是,需要使用js实现url分析、分词及文章列表返回。另外,糗事百科的支持发送链接时,文章列表不会变化。(反正糗事百科的querylist的名字就是他们自己起的)[糗事百科querylist](),目前糗事百科还没有引入正则表达式,这个空白是否用正则表达式实现都是未知数。
目前糗事百科支持个人的关注消息以及对应的项目和网站进行分析,对于其他平台的信息还是需要通过爬虫工具爬取,而后对应querylist。
糗事百科的信息分为发布平台、各种类型的公众号文章,还有微信公众号的文章列表信息。
以糗事百科为例,糗事百科是目前国内最大的发布平台,并且存在大量的原创内容,此外还支持api接口,你可以看一下,个人建议api应该更加靠谱一些,更加方便。
糗事都倒闭了,人家做querylist的干嘛去了,然后被查了!目前我了解到的糗事百科做的还不错的除了糗事历史记录还有打开设备,删帖时间等等。
我也是对糗事百科的其他栏目感兴趣,比如糗事玩乐,糗事笑话,还有种子搜索的信息。我是从糗事百科的公众号里看到的,其他没有详细看。
1、糗事密室经常有新怪人互怼的,这是我喜欢的一个玩法,
2、糗事运转博览每日都会发图文消息,
3、糗事集合经常有公司营销信息,
4、糗事校园糗事百科还有糗事校园有自己的校园班级、单位、公司等集中展示区的聚合页
5、关注和赞赏其实来说糗事百科也是一个轻博客式的网站,可以让读者对公司产品等进行赞赏。关注和赞赏的方式也有好几种,比如用户发送消息,你的朋友或者发一条评论,其他用户点赞就行了。不过看了一下并不是所有的用户都有赞赏的权限,官方说是鼓励用户发钱来感谢商家的文章。但是目前看到并没有好玩的活动和送钱这种方式,社区应该有更好的活动形式来进行内容建设和信息交流,比如通过用户进行互动活动之类的。看到新版还加入了时事的功能,如果大家都关注时事的话这个网站还有存在价值吗?。
6、游戏行情这个功能个人还在挖掘中。看了一下页面比较简单,
7、招聘聊天这个功能和招聘行业有关,
8、营销软件行业这个栏目应该不会放很多二维码吧! 查看全部
querylist采集微信公众号文章(糗事百科的几种方法,你都知道吗?!)
querylist采集微信公众号文章等信息,也有支持api形式的querylist,比如,糗事百科之前引入了通讯录的关注查询功能,是基于querylist和api进行定制开发的。缺点是,需要使用js实现url分析、分词及文章列表返回。另外,糗事百科的支持发送链接时,文章列表不会变化。(反正糗事百科的querylist的名字就是他们自己起的)[糗事百科querylist](),目前糗事百科还没有引入正则表达式,这个空白是否用正则表达式实现都是未知数。
目前糗事百科支持个人的关注消息以及对应的项目和网站进行分析,对于其他平台的信息还是需要通过爬虫工具爬取,而后对应querylist。
糗事百科的信息分为发布平台、各种类型的公众号文章,还有微信公众号的文章列表信息。
以糗事百科为例,糗事百科是目前国内最大的发布平台,并且存在大量的原创内容,此外还支持api接口,你可以看一下,个人建议api应该更加靠谱一些,更加方便。
糗事都倒闭了,人家做querylist的干嘛去了,然后被查了!目前我了解到的糗事百科做的还不错的除了糗事历史记录还有打开设备,删帖时间等等。
我也是对糗事百科的其他栏目感兴趣,比如糗事玩乐,糗事笑话,还有种子搜索的信息。我是从糗事百科的公众号里看到的,其他没有详细看。
1、糗事密室经常有新怪人互怼的,这是我喜欢的一个玩法,
2、糗事运转博览每日都会发图文消息,
3、糗事集合经常有公司营销信息,
4、糗事校园糗事百科还有糗事校园有自己的校园班级、单位、公司等集中展示区的聚合页
5、关注和赞赏其实来说糗事百科也是一个轻博客式的网站,可以让读者对公司产品等进行赞赏。关注和赞赏的方式也有好几种,比如用户发送消息,你的朋友或者发一条评论,其他用户点赞就行了。不过看了一下并不是所有的用户都有赞赏的权限,官方说是鼓励用户发钱来感谢商家的文章。但是目前看到并没有好玩的活动和送钱这种方式,社区应该有更好的活动形式来进行内容建设和信息交流,比如通过用户进行互动活动之类的。看到新版还加入了时事的功能,如果大家都关注时事的话这个网站还有存在价值吗?。
6、游戏行情这个功能个人还在挖掘中。看了一下页面比较简单,
7、招聘聊天这个功能和招聘行业有关,
8、营销软件行业这个栏目应该不会放很多二维码吧!
querylist采集微信公众号文章(本文来自:前端开发者《》链接(图))
采集交流 • 优采云 发表了文章 • 0 个评论 • 150 次浏览 • 2022-01-10 11:16
之前自己维护了一个公众号,但是因为个人关系,很久没有更新了。今天来缅怀一下,偶然发现了一个获取微信公众号文章的方法。
之前的获取方式有很多。可以通过搜狗、青博、网页、客户端等方式使用,这个可能不如其他的好,但是操作简单易懂。
所以,首先你需要有一个微信公众平台的账号
微信公众平台:
登录后进入首页,点击新建群发。
选择自创图形:
好像是公众号运营教学
进入编辑页面后,单击超链接
弹出选择框,我们在框中输入对应的公众号名称,就会出现对应的文章列表。
可以打开控制台查看请求的界面,这不奇怪吗
打开响应,也就是我们需要的 文章 链接
确定数据后,我们需要对接口进行分析。
感觉很简单,一个GET请求,携带一些参数。
fakeid 是公众号的唯一 ID,所以如果要直接通过名称获取 文章 的列表,则需要先获取 fakeid。
当我们输入公众号名称时,点击搜索。可以看到触发了搜索界面,返回了fakeid。
这个接口不需要很多参数。
接下来,我们可以使用代码来模拟上述操作。
但是,也有必要使用现有的 cookie 来避免登录。
当前的cookie过期日期,我没有测试过。可能需要不时更新 cookie。
测试代码:
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
这样可以获取最新的10篇文章文章,如果想获取更多历史文章,可以修改data中的“begin”参数,0为第一页,5为第一页第二页,10 是第三页(依此类推)
但如果你想大规模刮:
请为自己安排一个稳定的代理,降低爬虫速度,并准备好多个账号,以减少被封号的可能性。
以上就是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持前端开发者。
» 本文来自:前端开发者 » 《通过微信公众平台获取公众号文章的方法示例_跑到_前端开发者》
» 本文链接: 查看全部
querylist采集微信公众号文章(本文来自:前端开发者《》链接(图))
之前自己维护了一个公众号,但是因为个人关系,很久没有更新了。今天来缅怀一下,偶然发现了一个获取微信公众号文章的方法。
之前的获取方式有很多。可以通过搜狗、青博、网页、客户端等方式使用,这个可能不如其他的好,但是操作简单易懂。
所以,首先你需要有一个微信公众平台的账号
微信公众平台:

登录后进入首页,点击新建群发。

选择自创图形:

好像是公众号运营教学
进入编辑页面后,单击超链接

弹出选择框,我们在框中输入对应的公众号名称,就会出现对应的文章列表。

可以打开控制台查看请求的界面,这不奇怪吗

打开响应,也就是我们需要的 文章 链接

确定数据后,我们需要对接口进行分析。
感觉很简单,一个GET请求,携带一些参数。

fakeid 是公众号的唯一 ID,所以如果要直接通过名称获取 文章 的列表,则需要先获取 fakeid。
当我们输入公众号名称时,点击搜索。可以看到触发了搜索界面,返回了fakeid。

这个接口不需要很多参数。

接下来,我们可以使用代码来模拟上述操作。
但是,也有必要使用现有的 cookie 来避免登录。

当前的cookie过期日期,我没有测试过。可能需要不时更新 cookie。
测试代码:
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
这样可以获取最新的10篇文章文章,如果想获取更多历史文章,可以修改data中的“begin”参数,0为第一页,5为第一页第二页,10 是第三页(依此类推)
但如果你想大规模刮:
请为自己安排一个稳定的代理,降低爬虫速度,并准备好多个账号,以减少被封号的可能性。
以上就是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持前端开发者。
» 本文来自:前端开发者 » 《通过微信公众平台获取公众号文章的方法示例_跑到_前端开发者》
» 本文链接:
querylist采集微信公众号文章(2018年7月20日更新:1.即刻APP(该方法已失效))
采集交流 • 优采云 发表了文章 • 0 个评论 • 144 次浏览 • 2022-01-10 11:16
2018 年 7 月 20 日更新
因为微广场是封闭的,我又写了一篇文章文章,看看这些方法能不能满足你的需求,文章的内容如下:
本文将为您介绍几种订阅微信公众号的绝佳方式。相信总有一款适合你(强烈推荐最后一种方法)。为了衡量这些方法的优缺点,我将使用以下三个公众号进行测试:
1. Instant APP(此方法已过期)
<p>在聚合应用程序中,我认为立即执行是最好的。我从2015年就开始用这个APP了,应该是第一批用户。从一开始只有一些手动筛选的主题,到现在用户可以自定义主题,功能越来越强大。在我之前的 查看全部
querylist采集微信公众号文章(2018年7月20日更新:1.即刻APP(该方法已失效))
2018 年 7 月 20 日更新
因为微广场是封闭的,我又写了一篇文章文章,看看这些方法能不能满足你的需求,文章的内容如下:
本文将为您介绍几种订阅微信公众号的绝佳方式。相信总有一款适合你(强烈推荐最后一种方法)。为了衡量这些方法的优缺点,我将使用以下三个公众号进行测试:
1. Instant APP(此方法已过期)
<p>在聚合应用程序中,我认为立即执行是最好的。我从2015年就开始用这个APP了,应该是第一批用户。从一开始只有一些手动筛选的主题,到现在用户可以自定义主题,功能越来越强大。在我之前的
querylist采集微信公众号文章(微信公众号文章的图片无法直接复制到WordPress中的应用)
采集交流 • 优采云 发表了文章 • 0 个评论 • 138 次浏览 • 2022-01-09 10:09
相信很多微信公众号作者(个人、组织、公司)不仅在微信公众平台上发文,通常文章会在多个平台上推送,比如今日头条、知乎栏目、简书等等,甚至还有自己的网站(官网),但是在多个平台上发布文章是一件非常耗时的工作。
大多数 网站 构建都基于 WordPress,因为该平台非常简单实用,并且有大量插件。因此,我也不例外。当我选择建站系统时,首先选择的是 WordPress。不过我经常写文章发现一个问题,就是每次在公众号写文章,我把文章@文章手动复制到WordPress上,复制文字没什么,但是复制图片会害死我,微信公众号文章的图片不能直接复制到WordPress,会显示为“无法显示。这张图片”,因为微信已对图片实施防盗链措施。
这时候我尝试搜索了这样一个插件,可以通过粘贴公众号文章的链接直接将内容导入WordPress,并将图片下载到本地(媒体库),我搜索到找到了一个叫Little Bee的插件。试了之后,感觉见面晚了。书籍,知乎栏目中的文章,还有多种丰富的可选功能,果断联系作者索要授权码。
使用起来也很简单,只要粘贴链接,就可以同时导入多个文章,也就是批量导入功能。
如果下载了,可以直接在安装插件页面搜索小蜜蜂就可以看到了。 查看全部
querylist采集微信公众号文章(微信公众号文章的图片无法直接复制到WordPress中的应用)
相信很多微信公众号作者(个人、组织、公司)不仅在微信公众平台上发文,通常文章会在多个平台上推送,比如今日头条、知乎栏目、简书等等,甚至还有自己的网站(官网),但是在多个平台上发布文章是一件非常耗时的工作。
大多数 网站 构建都基于 WordPress,因为该平台非常简单实用,并且有大量插件。因此,我也不例外。当我选择建站系统时,首先选择的是 WordPress。不过我经常写文章发现一个问题,就是每次在公众号写文章,我把文章@文章手动复制到WordPress上,复制文字没什么,但是复制图片会害死我,微信公众号文章的图片不能直接复制到WordPress,会显示为“无法显示。这张图片”,因为微信已对图片实施防盗链措施。
这时候我尝试搜索了这样一个插件,可以通过粘贴公众号文章的链接直接将内容导入WordPress,并将图片下载到本地(媒体库),我搜索到找到了一个叫Little Bee的插件。试了之后,感觉见面晚了。书籍,知乎栏目中的文章,还有多种丰富的可选功能,果断联系作者索要授权码。
使用起来也很简单,只要粘贴链接,就可以同时导入多个文章,也就是批量导入功能。
如果下载了,可以直接在安装插件页面搜索小蜜蜂就可以看到了。
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
采集交流 • 优采云 发表了文章 • 0 个评论 • 132 次浏览 • 2022-01-08 14:08
最近需要爬取微信公众号的文章信息。我在网上搜索,发现爬取微信公众号的难点在于公众号文章的链接在PC端打不开,所以需要使用微信自带的浏览器(获取参数微信客户端补充)可以在其他平台打开),给爬虫带来了很大的麻烦。后来在知乎上看到一个大牛用php写的微信公众号爬虫程序,直接按照大佬的思路做成了java。改造过程中遇到了很多细节和问题,就分享给大家。
附上大牛的链接文章:写php或者只需要爬取思路的可以直接看这个。这些想法写得很详细。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------
系统的基本思路是在Android模拟器上运行微信,在模拟器上设置代理,通过代理服务器截取微信数据,将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、安卓模拟器
Nodejs下载地址:我下载的是windows版本的,直接安装就好了。安装后直接运行 C:\Program Files\nodejs\npm.cmd 会自动配置环境。
anyproxy安装:按照上一步安装nodejs后,直接在cmd中运行npm install -g anyproxy即可安装
网上的安卓模拟器就好了,有很多。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------------------
首先安装代理服务器的证书。Anyproxy 默认不解析 https 链接。安装证书后,就可以解析了。在cmd中执行anyproxy --root安装证书,然后在模拟器中下载证书。
然后输入anyproxy -i 命令打开代理服务。(记得添加参数!)
记住这个ip和端口,那么安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用来显示http传输的数据。
点击上方红框中的菜单,会出现一个二维码。用安卓模拟器扫码识别。模拟器(手机)会下载证书并安装。
现在准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器的ip,端口为8001
准备工作到这里基本完成。在模拟器上打开微信,打开一个公众号的文章,就可以从刚刚打开的web界面看到anyproxy抓取的数据:
上图红框是微信文章的链接,点击查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果顶部清晰,您可以向下。
这里我们依靠代理服务来抓取微信数据,但是我们不能抓取一条数据自己操作微信,所以还是手动复制比较好。所以我们需要微信客户端自己跳转到页面。这时可以使用anyproxy拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下的文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫做replaceServerResDataAsync: function(req,res,serverResData,callback)。该方法负责对anyproxy获取的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚。顺着逻辑去理解就好,问题不大。
1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },
这是一个简短的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以向下滚动。向下滚动会触发js事件发送请求获取json数据(下一页的内容)。还有公众号文章的链接,以及文章的阅读和点赞链接(返回json数据)。这些环节的形式是固定的,可以通过逻辑判断加以区分。这里有个问题,如果历史页面需要一路爬取怎么办。我的想法是通过js模拟鼠标向下滑动,从而触发请求提交下一部分列表的加载。或者直接使用anyproxy分析下载请求,直接向微信服务器发出这个请求。但是有一个问题是如何判断没有剩余数据。我正在抓取最新数据。我暂时没有这个要求,但以后可能需要。如果需要,您可以尝试一下。 查看全部
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
最近需要爬取微信公众号的文章信息。我在网上搜索,发现爬取微信公众号的难点在于公众号文章的链接在PC端打不开,所以需要使用微信自带的浏览器(获取参数微信客户端补充)可以在其他平台打开),给爬虫带来了很大的麻烦。后来在知乎上看到一个大牛用php写的微信公众号爬虫程序,直接按照大佬的思路做成了java。改造过程中遇到了很多细节和问题,就分享给大家。
附上大牛的链接文章:写php或者只需要爬取思路的可以直接看这个。这些想法写得很详细。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------
系统的基本思路是在Android模拟器上运行微信,在模拟器上设置代理,通过代理服务器截取微信数据,将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、安卓模拟器
Nodejs下载地址:我下载的是windows版本的,直接安装就好了。安装后直接运行 C:\Program Files\nodejs\npm.cmd 会自动配置环境。
anyproxy安装:按照上一步安装nodejs后,直接在cmd中运行npm install -g anyproxy即可安装
网上的安卓模拟器就好了,有很多。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------------------
首先安装代理服务器的证书。Anyproxy 默认不解析 https 链接。安装证书后,就可以解析了。在cmd中执行anyproxy --root安装证书,然后在模拟器中下载证书。
然后输入anyproxy -i 命令打开代理服务。(记得添加参数!)

记住这个ip和端口,那么安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用来显示http传输的数据。

点击上方红框中的菜单,会出现一个二维码。用安卓模拟器扫码识别。模拟器(手机)会下载证书并安装。
现在准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器的ip,端口为8001

准备工作到这里基本完成。在模拟器上打开微信,打开一个公众号的文章,就可以从刚刚打开的web界面看到anyproxy抓取的数据:

上图红框是微信文章的链接,点击查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果顶部清晰,您可以向下。
这里我们依靠代理服务来抓取微信数据,但是我们不能抓取一条数据自己操作微信,所以还是手动复制比较好。所以我们需要微信客户端自己跳转到页面。这时可以使用anyproxy拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下的文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫做replaceServerResDataAsync: function(req,res,serverResData,callback)。该方法负责对anyproxy获取的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚。顺着逻辑去理解就好,问题不大。

1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },

这是一个简短的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以向下滚动。向下滚动会触发js事件发送请求获取json数据(下一页的内容)。还有公众号文章的链接,以及文章的阅读和点赞链接(返回json数据)。这些环节的形式是固定的,可以通过逻辑判断加以区分。这里有个问题,如果历史页面需要一路爬取怎么办。我的想法是通过js模拟鼠标向下滑动,从而触发请求提交下一部分列表的加载。或者直接使用anyproxy分析下载请求,直接向微信服务器发出这个请求。但是有一个问题是如何判断没有剩余数据。我正在抓取最新数据。我暂时没有这个要求,但以后可能需要。如果需要,您可以尝试一下。
querylist采集微信公众号文章(querylist中实现自动化采集2采集微信公众号文章的实现流程)
采集交流 • 优采云 发表了文章 • 0 个评论 • 123 次浏览 • 2022-01-08 01:02
querylist采集微信公众号文章,在python中实现自动化采集2采集微信公众号文章的实现流程1。获取微信公众号文章列表(list_pass_folds)、文章标题和文章描述采用fullurl函数2采集的数据格式3数据封装加载,检查数据规模4数据清洗分析python的相关工具包的使用:注意,在使用python自己的工具包以前,需要先安装pympi,pipinstallpympiimportpandasaspdimportcollectionsfromsklearn。metricsimportroc_auc_scoreasroc_auc_score#。 查看全部
querylist采集微信公众号文章(querylist中实现自动化采集2采集微信公众号文章的实现流程)
querylist采集微信公众号文章,在python中实现自动化采集2采集微信公众号文章的实现流程1。获取微信公众号文章列表(list_pass_folds)、文章标题和文章描述采用fullurl函数2采集的数据格式3数据封装加载,检查数据规模4数据清洗分析python的相关工具包的使用:注意,在使用python自己的工具包以前,需要先安装pympi,pipinstallpympiimportpandasaspdimportcollectionsfromsklearn。metricsimportroc_auc_scoreasroc_auc_score#。
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
采集交流 • 优采云 发表了文章 • 0 个评论 • 152 次浏览 • 2022-01-06 17:06
最近需要爬取微信公众号的文章信息。上网查了一下,发现微信公众号的难点是公众号文章的链接在PC端打不开。必须使用微信自带的浏览器(获取微信客户端的补充参数,才能在其他平台打开),给爬虫程序带来很大的麻烦。后来在知乎上看到一个大牛用php写的微信公众号爬虫程序,直接按照大牛的思路做了成java。改造过程中遇到了很多细节问题,分享给大家。
附上大牛文章的链接:写php或者只需要爬取思路的可以直接看这个,思路很详细。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------------
该系统的基本思想是在Android模拟器上运行微信,模拟器设置一个代理,通过代理服务器拦截微信数据,并将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、Android模拟器
nodejs下载地址:我下载的是windows版本的,直接安装就可以了。安装完成后,直接运行C:\Program Files\nodejs\npm.cmd 自动配置环境。
Anyproxy安装:上一步安装好nodejs后,在cmd中直接运行npm install -g anyproxy即可安装
网上随便跟着安卓模拟器就行了,很多。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------
首先安装代理服务器的证书。Anyproxy 默认不解析 https 链接。安装证书后即可解决。在 cmd 中执行 anyproxy --root 将安装证书。之后,您必须在模拟器上下载证书。
然后输入anyproxy -i 命令开启代理服务。(记得加参数!)
记住这个ip和端口,然后安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用于显示http传输数据。
点击上方红框中的菜单,会显示一个二维码。使用安卓模拟器扫码识别。模拟器(手机)将下载证书并安装它。
现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器的ip,端口为8001
至此,准备工作基本完成,在模拟器上打开微信,开通公众号文章,从刚刚打开的web界面就可以看到anyproxy抓取到的数据了:
上面红框里是微信文章的链接,点进去查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果一切顺利,你就可以下去了。
这里我们依靠代理服务来抓取微信数据,但不能随便抓取一条数据,自己操作微信。最好手动复制。所以我们需要微信客户端自己跳转到页面。这时候可以使用anyproxy来拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫做 replaceServerResDataAsync: function(req,res,serverResData,callback)。该方法负责对anyproxy获得的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚,按照逻辑来理解就好了,问题不大。
1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },
这里是一个简短的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以关闭。如果被拒绝,则会触发一个js事件,发送获取json数据(下一页内容)的请求。还有公众号文章的链接,以及文章的阅读量和喜欢的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断来区分。这里的问题是,如果所有的历史页面都需要爬取,怎么做。我的想法是模拟鼠标滑过js触发提交加载列表下一部分的请求。或者直接使用anyproxy来分析滑动加载的请求,并将请求直接发送到微信服务器。但是如何判断没有剩余数据一直存在问题。我正在抓取最新数据。我暂时没有这个需求,以后可能需要。有需要的可以试试。 查看全部
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
最近需要爬取微信公众号的文章信息。上网查了一下,发现微信公众号的难点是公众号文章的链接在PC端打不开。必须使用微信自带的浏览器(获取微信客户端的补充参数,才能在其他平台打开),给爬虫程序带来很大的麻烦。后来在知乎上看到一个大牛用php写的微信公众号爬虫程序,直接按照大牛的思路做了成java。改造过程中遇到了很多细节问题,分享给大家。
附上大牛文章的链接:写php或者只需要爬取思路的可以直接看这个,思路很详细。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------------
该系统的基本思想是在Android模拟器上运行微信,模拟器设置一个代理,通过代理服务器拦截微信数据,并将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、Android模拟器
nodejs下载地址:我下载的是windows版本的,直接安装就可以了。安装完成后,直接运行C:\Program Files\nodejs\npm.cmd 自动配置环境。
Anyproxy安装:上一步安装好nodejs后,在cmd中直接运行npm install -g anyproxy即可安装
网上随便跟着安卓模拟器就行了,很多。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------
首先安装代理服务器的证书。Anyproxy 默认不解析 https 链接。安装证书后即可解决。在 cmd 中执行 anyproxy --root 将安装证书。之后,您必须在模拟器上下载证书。
然后输入anyproxy -i 命令开启代理服务。(记得加参数!)

记住这个ip和端口,然后安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用于显示http传输数据。

点击上方红框中的菜单,会显示一个二维码。使用安卓模拟器扫码识别。模拟器(手机)将下载证书并安装它。
现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器的ip,端口为8001

至此,准备工作基本完成,在模拟器上打开微信,开通公众号文章,从刚刚打开的web界面就可以看到anyproxy抓取到的数据了:

上面红框里是微信文章的链接,点进去查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果一切顺利,你就可以下去了。
这里我们依靠代理服务来抓取微信数据,但不能随便抓取一条数据,自己操作微信。最好手动复制。所以我们需要微信客户端自己跳转到页面。这时候可以使用anyproxy来拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫做 replaceServerResDataAsync: function(req,res,serverResData,callback)。该方法负责对anyproxy获得的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚,按照逻辑来理解就好了,问题不大。

1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },

这里是一个简短的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以关闭。如果被拒绝,则会触发一个js事件,发送获取json数据(下一页内容)的请求。还有公众号文章的链接,以及文章的阅读量和喜欢的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断来区分。这里的问题是,如果所有的历史页面都需要爬取,怎么做。我的想法是模拟鼠标滑过js触发提交加载列表下一部分的请求。或者直接使用anyproxy来分析滑动加载的请求,并将请求直接发送到微信服务器。但是如何判断没有剩余数据一直存在问题。我正在抓取最新数据。我暂时没有这个需求,以后可能需要。有需要的可以试试。
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
采集交流 • 优采云 发表了文章 • 0 个评论 • 130 次浏览 • 2022-01-04 06:16
最近需要爬取微信公众号的文章信息。上网查了一下,发现微信公众号的难点是公众号文章的链接在PC端打不开。必须使用微信自带的浏览器(获取微信客户端的补充参数,才能在其他平台打开),给爬虫程序带来很大的麻烦。后来在知乎上看到了一个大牛用php写的微信公众号爬虫程序,他按照大佬的思路直接做了java。改造过程中遇到了很多细节问题,分享给大家。
附上大牛的链接文章:写php或者只需要爬取思路的可以直接看这个。这些想法写得很详细。
----------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------
系统的基本思想是在安卓模拟器上运行微信。模拟器设置代理,通过代理服务器拦截微信数据,并将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、Android模拟器
nodejs下载地址:我下载的是windows版本的,直接下载安装就可以了。安装完成后直接运行C:\Program Files\nodejs\npm.cmd自动配置环境。
anyproxy安装:上一步安装好nodejs后,在cmd中直接运行npm install -g anyproxy就会安装
互联网上只有一个 Android 模拟器,很多。
----------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------------
首先安装代理服务器的证书。 Anyproxy 默认不解析 https 链接。安装证书后即可解决。在 cmd 中执行 anyproxy --root 将安装证书。之后,您必须在模拟器上下载证书。
然后输入anyproxy -i命令开启代理服务。 (记得加参数!)
记住这个ip和端口,然后安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用于展示http传输数据。
点击上方红框中的菜单,会显示一个二维码。使用安卓模拟器扫码识别。模拟器(手机)会下载证书并安装。
现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器ip,端口为8001
准备工作到此基本完成。在模拟器上打开微信,开通公众号文章。您可以从刚打开的网页界面看到 anyproxy 捕获的数据:
上面红框里是微信文章的链接,点进去查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果一切顺利,你就可以下去了。
这里我们依靠代理服务来抓取微信数据,但是我们不能抓取一条数据,只能自己操作微信。最好手动复制。所以我们需要微信客户端自己跳转到页面。这时候可以使用anyproxy来拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫replaceServerResDataAsync:function(req,res,serverResData,callback)。该方法负责对anyproxy获得的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚,按照逻辑来理解就好了,问题不大。
1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },
这里是一个简单的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以关闭。如果被拒绝,则会触发一个js事件,发送获取json数据(下一页内容)的请求。还有公众号文章的链接,以及文章的阅读量和喜欢的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断来区分。这里的问题是,如果所有的历史页面都需要爬取,怎么做。我的想法是模拟鼠标滑过js触发提交加载列表下一部分的请求。或者直接使用anyproxy分析滑动加载请求,直接将请求发送到微信服务器。但是如何判断没有剩余数据一直存在问题。我正在抓取最新数据。我暂时没有这个需求,以后可能需要。有需要的可以试试。 查看全部
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
最近需要爬取微信公众号的文章信息。上网查了一下,发现微信公众号的难点是公众号文章的链接在PC端打不开。必须使用微信自带的浏览器(获取微信客户端的补充参数,才能在其他平台打开),给爬虫程序带来很大的麻烦。后来在知乎上看到了一个大牛用php写的微信公众号爬虫程序,他按照大佬的思路直接做了java。改造过程中遇到了很多细节问题,分享给大家。
附上大牛的链接文章:写php或者只需要爬取思路的可以直接看这个。这些想法写得很详细。
----------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------
系统的基本思想是在安卓模拟器上运行微信。模拟器设置代理,通过代理服务器拦截微信数据,并将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、Android模拟器
nodejs下载地址:我下载的是windows版本的,直接下载安装就可以了。安装完成后直接运行C:\Program Files\nodejs\npm.cmd自动配置环境。
anyproxy安装:上一步安装好nodejs后,在cmd中直接运行npm install -g anyproxy就会安装
互联网上只有一个 Android 模拟器,很多。
----------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------------
首先安装代理服务器的证书。 Anyproxy 默认不解析 https 链接。安装证书后即可解决。在 cmd 中执行 anyproxy --root 将安装证书。之后,您必须在模拟器上下载证书。
然后输入anyproxy -i命令开启代理服务。 (记得加参数!)

记住这个ip和端口,然后安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用于展示http传输数据。

点击上方红框中的菜单,会显示一个二维码。使用安卓模拟器扫码识别。模拟器(手机)会下载证书并安装。
现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器ip,端口为8001

准备工作到此基本完成。在模拟器上打开微信,开通公众号文章。您可以从刚打开的网页界面看到 anyproxy 捕获的数据:

上面红框里是微信文章的链接,点进去查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果一切顺利,你就可以下去了。
这里我们依靠代理服务来抓取微信数据,但是我们不能抓取一条数据,只能自己操作微信。最好手动复制。所以我们需要微信客户端自己跳转到页面。这时候可以使用anyproxy来拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫replaceServerResDataAsync:function(req,res,serverResData,callback)。该方法负责对anyproxy获得的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚,按照逻辑来理解就好了,问题不大。

1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },

这里是一个简单的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以关闭。如果被拒绝,则会触发一个js事件,发送获取json数据(下一页内容)的请求。还有公众号文章的链接,以及文章的阅读量和喜欢的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断来区分。这里的问题是,如果所有的历史页面都需要爬取,怎么做。我的想法是模拟鼠标滑过js触发提交加载列表下一部分的请求。或者直接使用anyproxy分析滑动加载请求,直接将请求发送到微信服务器。但是如何判断没有剩余数据一直存在问题。我正在抓取最新数据。我暂时没有这个需求,以后可能需要。有需要的可以试试。
querylist采集微信公众号文章(rjava采集微信公众号文章的有效性)
采集交流 • 优采云 发表了文章 • 0 个评论 • 190 次浏览 • 2022-01-03 04:01
querylist采集微信公众号文章,大文本、小文本都可以,按词抓取,点击率高,方便。
楼上的没有提及全面!有人提到wordtab:
目前几个平台中,微博爬虫你可以用scrapy,
既然你那么肯定有效,不妨把数据转接一下,非对称加密,或者使用hashify、密码管理。
推荐你看看rjava博客提到的nodejs微信爬虫
wordtab,爬取微信公众号的文章,不限文本类型,
可以使用公众号热文爬虫的spider.py,请看博文,自己改动注释和模板功能,
没有人说wordtab吗?-python
lxml+xpath
大部分都是需要导入数据库查询的,
最适合中文的爬虫网站lxml+xpath
wordtab不错
有人说wordtab?
最大的还是lxml+xpath,htmlfield,关键词,tag,openpyxl如果后端功能都有比较全了,可以考虑beautifulsoup。
wordtab可以抓取javascript各种网页
wordtab最合适了,beautifulsoup框架,然后直接转word,
数据库操作必须有book_field_tag_meta字段,否则爬到的基本都是有机体。 查看全部
querylist采集微信公众号文章(rjava采集微信公众号文章的有效性)
querylist采集微信公众号文章,大文本、小文本都可以,按词抓取,点击率高,方便。
楼上的没有提及全面!有人提到wordtab:
目前几个平台中,微博爬虫你可以用scrapy,
既然你那么肯定有效,不妨把数据转接一下,非对称加密,或者使用hashify、密码管理。
推荐你看看rjava博客提到的nodejs微信爬虫
wordtab,爬取微信公众号的文章,不限文本类型,
可以使用公众号热文爬虫的spider.py,请看博文,自己改动注释和模板功能,
没有人说wordtab吗?-python
lxml+xpath
大部分都是需要导入数据库查询的,
最适合中文的爬虫网站lxml+xpath
wordtab不错
有人说wordtab?
最大的还是lxml+xpath,htmlfield,关键词,tag,openpyxl如果后端功能都有比较全了,可以考虑beautifulsoup。
wordtab可以抓取javascript各种网页
wordtab最合适了,beautifulsoup框架,然后直接转word,
数据库操作必须有book_field_tag_meta字段,否则爬到的基本都是有机体。
querylist采集微信公众号文章( 搜狗微信公众号实操训练 )
采集交流 • 优采云 发表了文章 • 0 个评论 • 123 次浏览 • 2022-01-02 04:12
搜狗微信公众号实操训练
)
爬取公众号文章
项目介绍
公众号是我最喜欢的学习方式之一。我经常关注一些技巧文章进行实践训练。所以打算做一段时间的公众号爬取文章。
这里我们使用selenium库通过搜狗微信网址获取相关文章内容:
搜狗微信网址
页面详情
我们发现有一个登录按钮可以进入页面。如果我们不登录,我们只能查看10页的内容。如果内容很多,10页是不够的。
这里我设置睡眠时间为20秒,微信扫码登录;然后我会进行后续的操作。
driver.find_element_by_id("loginBtn").click()
time.sleep(20) #休眠20秒进行微信扫码登录操作
接下来就是输入我们要搜索的相关内容文章
我使用显示等待。如果超过10秒没有找到对应的内容,则表示不存在。
input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME,'query')))
input.send_keys("python") #模拟输入
driver.find_element_by_xpath("//input[@class='swz']").click()#模拟点击
最后一步是爬取对应的文章。我们在爬行的时候,需要专门去爬行。这里我选择了官方账号名中收录Python这个词的账号。如果找到,就会被抓取并保存。
#爬取页面所有文章
new_list = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
# print(new_list)
for new in new_list:
#获取文章账号
sourse = new.find_elements_by_class_name("account")[0].text
if "python" in sourse:
#获取文章标题
title = new.find_elements_by_xpath("div[2]/h3/a")[0].text
完整代码
<p>from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
import datetime
from selenium.common.exceptions import TimeoutException
import xlwt
class official_accounts:
# #实例化参数,直接传入参数
# def __init__(self,name,deep_num):
# self.name = name
# self.deep_num = deep_num
#登录页面
def login_btn(self,name):
global driver
driver = webdriver.Firefox()
driver.get('https://weixin.sogou.com/')
driver.find_element_by_id("loginBtn").click()
time.sleep(20) #休眠20秒进行微信扫码登录操作
input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME,'query')))
input.send_keys(name)
driver.find_element_by_xpath("//input[@class='swz']").click()
#爬取内容
def get_news(self,name):
global data_total
data = []
time.sleep(1)
new_list = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
# print(new_list)
for new in new_list:
#获取文章账号
sourse = new.find_elements_by_class_name("account")[0].text
if name in sourse:
#获取文章标题
title = new.find_elements_by_xpath("div[2]/h3/a")[0].text
#获取文章发表日期
date = new.find_elements_by_xpath("div[2]/div/span")[0].text
# 文章发表的日期如果较近可能会显示“1天前” “12小时前” “30分钟前”
# 这里可以用`datetime`模块根据时间差求出具体时间
# 然后解析为`YYYY-MM-DD`格式
if '前' in date:
today = datetime.datetime.today()
if '天' in date:
delta = datetime.timedelta(days=int(date[0]))
elif '小时' in date:
delta = datetime.timedelta(hours=int(date.replace('小时前', ' ')))
else:
delta = datetime.timedelta(minutes=int(date.replace('分钟前', ' ')))
date = str((today - delta).strftime('%Y-%m-%d'))
date = datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%Y-%m-%d')
#获取文章简介
content = new.find_elements_by_xpath("div[2]/p")[0].text
#获取链接
url = new.find_elements_by_xpath("div[2]/h3/a")[0].get_attribute('href')
data.append(title)
data.append(date)
data.append(content)
data.append(url)
if data not in data_total:
data_total.append(data)
print(sourse,title,date,content)
print(url)
print('------'*10)
else:
continue
#写入Excel中
def save(self,data_total,name): #将爬取的信息写入Excel文件
# xlwt.Workbook用来创建一个工作表,style_compression=0表示是否被压缩
con = xlwt.Workbook(encoding='utf-8',style_compression=0)
# 添加sheet表格,并允许重复修改
sheet = con.add_sheet("公众号文字爬取信息",cell_overwrite_ok=True)
colunm = ("title","date","content","url") #定义列名
for i in range(0,4):
sheet.write(0,i,colunm[i])
for i in range(0,len(data_total)-1):
d = data_total[i]
for j in range(0,4):
sheet.write(i+1,j,d[j])
con.save( name +".xls")
print("数据保存成功!")
#定义爬取深度,要爬取多少个页面后就停止
def depth(self,name,deep_num):
self.login_btn(name)
global data_total
data_total = []
self.get_news(name)
d = 1 #定义一个爬取深度,爬取多少个页面
while d 查看全部
querylist采集微信公众号文章(
搜狗微信公众号实操训练
)
爬取公众号文章
项目介绍
公众号是我最喜欢的学习方式之一。我经常关注一些技巧文章进行实践训练。所以打算做一段时间的公众号爬取文章。
这里我们使用selenium库通过搜狗微信网址获取相关文章内容:
搜狗微信网址
页面详情
我们发现有一个登录按钮可以进入页面。如果我们不登录,我们只能查看10页的内容。如果内容很多,10页是不够的。

这里我设置睡眠时间为20秒,微信扫码登录;然后我会进行后续的操作。
driver.find_element_by_id("loginBtn").click()
time.sleep(20) #休眠20秒进行微信扫码登录操作

接下来就是输入我们要搜索的相关内容文章
我使用显示等待。如果超过10秒没有找到对应的内容,则表示不存在。
input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME,'query')))
input.send_keys("python") #模拟输入
driver.find_element_by_xpath("//input[@class='swz']").click()#模拟点击

最后一步是爬取对应的文章。我们在爬行的时候,需要专门去爬行。这里我选择了官方账号名中收录Python这个词的账号。如果找到,就会被抓取并保存。
#爬取页面所有文章
new_list = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
# print(new_list)
for new in new_list:
#获取文章账号
sourse = new.find_elements_by_class_name("account")[0].text
if "python" in sourse:
#获取文章标题
title = new.find_elements_by_xpath("div[2]/h3/a")[0].text
完整代码
<p>from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
import datetime
from selenium.common.exceptions import TimeoutException
import xlwt
class official_accounts:
# #实例化参数,直接传入参数
# def __init__(self,name,deep_num):
# self.name = name
# self.deep_num = deep_num
#登录页面
def login_btn(self,name):
global driver
driver = webdriver.Firefox()
driver.get('https://weixin.sogou.com/')
driver.find_element_by_id("loginBtn").click()
time.sleep(20) #休眠20秒进行微信扫码登录操作
input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME,'query')))
input.send_keys(name)
driver.find_element_by_xpath("//input[@class='swz']").click()
#爬取内容
def get_news(self,name):
global data_total
data = []
time.sleep(1)
new_list = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
# print(new_list)
for new in new_list:
#获取文章账号
sourse = new.find_elements_by_class_name("account")[0].text
if name in sourse:
#获取文章标题
title = new.find_elements_by_xpath("div[2]/h3/a")[0].text
#获取文章发表日期
date = new.find_elements_by_xpath("div[2]/div/span")[0].text
# 文章发表的日期如果较近可能会显示“1天前” “12小时前” “30分钟前”
# 这里可以用`datetime`模块根据时间差求出具体时间
# 然后解析为`YYYY-MM-DD`格式
if '前' in date:
today = datetime.datetime.today()
if '天' in date:
delta = datetime.timedelta(days=int(date[0]))
elif '小时' in date:
delta = datetime.timedelta(hours=int(date.replace('小时前', ' ')))
else:
delta = datetime.timedelta(minutes=int(date.replace('分钟前', ' ')))
date = str((today - delta).strftime('%Y-%m-%d'))
date = datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%Y-%m-%d')
#获取文章简介
content = new.find_elements_by_xpath("div[2]/p")[0].text
#获取链接
url = new.find_elements_by_xpath("div[2]/h3/a")[0].get_attribute('href')
data.append(title)
data.append(date)
data.append(content)
data.append(url)
if data not in data_total:
data_total.append(data)
print(sourse,title,date,content)
print(url)
print('------'*10)
else:
continue
#写入Excel中
def save(self,data_total,name): #将爬取的信息写入Excel文件
# xlwt.Workbook用来创建一个工作表,style_compression=0表示是否被压缩
con = xlwt.Workbook(encoding='utf-8',style_compression=0)
# 添加sheet表格,并允许重复修改
sheet = con.add_sheet("公众号文字爬取信息",cell_overwrite_ok=True)
colunm = ("title","date","content","url") #定义列名
for i in range(0,4):
sheet.write(0,i,colunm[i])
for i in range(0,len(data_total)-1):
d = data_total[i]
for j in range(0,4):
sheet.write(i+1,j,d[j])
con.save( name +".xls")
print("数据保存成功!")
#定义爬取深度,要爬取多少个页面后就停止
def depth(self,name,deep_num):
self.login_btn(name)
global data_total
data_total = []
self.get_news(name)
d = 1 #定义一个爬取深度,爬取多少个页面
while d
querylist采集微信公众号文章(,小编觉得挺不错的主要介绍思路,代码部分请自行解决获取)
采集交流 • 优采云 发表了文章 • 0 个评论 • 137 次浏览 • 2022-01-02 02:15
本文文章主要介绍python如何抓取搜狗微信公众号文章永久链接思维分析,小编觉得还不错,现分享给大家,给大家参考。跟着小编一起来看看吧。
本文主要讲解思路,代码部分请自行解决
获取搜狗微信当天信息排名
指定输入关键字,通过scrapy抓取公众号
登录微信公众号链接获取cookie信息
由于微信公众平台模拟登录尚未解决,需要手动登录实时获取cookie信息
固定链接可以在这里转换
代码部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------请输入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信访问频率会过快,导致需要输入验证码
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判断url 是否是需要输入验证码
res = re.search("from", response.url) # 需要验证码验证
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content with open("urli.jpg", "wb") as f:
f.write(url_img) # f.close()
img = input("请输入验证码:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要验证码验证
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//p[1]/a/@href').extract_first()
item["name"] = name
print("第%d条" % i) # 转化永久链接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"] except Exception as f:
print("**********[INFO]:请求失败,登陆失败, 请重新登陆*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"] if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10) # time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最终链接为:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("与所选文章不同放弃")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("与所选公众号不一致放弃")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s) # time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name})
以上是python如何抓取搜狗微信公众号文章永久链接思路解析的详细内容。更多详情请关注其他相关php中文网站文章!
免责声明:本文由原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何问题,请联系我们 查看全部
querylist采集微信公众号文章(,小编觉得挺不错的主要介绍思路,代码部分请自行解决获取)
本文文章主要介绍python如何抓取搜狗微信公众号文章永久链接思维分析,小编觉得还不错,现分享给大家,给大家参考。跟着小编一起来看看吧。
本文主要讲解思路,代码部分请自行解决
获取搜狗微信当天信息排名
指定输入关键字,通过scrapy抓取公众号
登录微信公众号链接获取cookie信息
由于微信公众平台模拟登录尚未解决,需要手动登录实时获取cookie信息




固定链接可以在这里转换
代码部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------请输入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信访问频率会过快,导致需要输入验证码
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判断url 是否是需要输入验证码
res = re.search("from", response.url) # 需要验证码验证
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content with open("urli.jpg", "wb") as f:
f.write(url_img) # f.close()
img = input("请输入验证码:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要验证码验证
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//p[1]/a/@href').extract_first()
item["name"] = name
print("第%d条" % i) # 转化永久链接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"] except Exception as f:
print("**********[INFO]:请求失败,登陆失败, 请重新登陆*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"] if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10) # time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最终链接为:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("与所选文章不同放弃")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("与所选公众号不一致放弃")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s) # time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name})
以上是python如何抓取搜狗微信公众号文章永久链接思路解析的详细内容。更多详情请关注其他相关php中文网站文章!

免责声明:本文由原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何问题,请联系我们
querylist采集微信公众号文章( 微信公众号爬虫关键是获取请求地址,注意:请求是需要cookies参数 )
采集交流 • 优采云 发表了文章 • 0 个评论 • 149 次浏览 • 2022-01-01 21:03
微信公众号爬虫关键是获取请求地址,注意:请求是需要cookies参数
)
微信公众号爬虫的关键是获取请求的地址。这个文章是方法之一。
登录自己的公众号后台,微信官方平台,进入图文消息编辑界面,进入超链接,选择公众号文章,
搜索人民日报等公众号,会弹出最新的文章列表。这时候就可以找到对应的请求了。可以通过公众号文章翻页找到请求的参数规则。
注意:请求需要cookies参数,可以复制浏览器访问的cookies。代码如下:(cookies中的关键参数已经脱敏为“???”)
''' the key is to use cookies'''
import requests
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','referer':'https://mp.weixin.qq.com/cgi-b ... 39%3B}
cookies={'appmsglist_action_3207019504': 'card', ' pgv_info': 'ssid', ' pgv_pvid': '4778161886', ' RK': '1KphnCSeRK', ' ptcz': '4a3ad775ddc10f3d9f50479110d37c6f7d5c7e8b38ebdb1e90207808173ad942', ' rewardsn': '', ' wxtokenkey': '777', ' _ga': 'GA1.2.1040497363.1629278077', ' o_cookie': '???????', ' pac_uid': '1_???????', ' tvfe_boss_uuid': 'a1a981cb70609f6e', ' vversion_name': '8.2.95', ' user_id': 'null', ' session_id': 'null',
' ua_id': 'ZpH4w1C3ipVIqGlHAAAAANiI5kknP2NeaIGodK9Opus', ' wxuin': '32385700599949', ' mm_lang': 'zh_CN', ' ptui_loginuin': '???????', ' verifysession': 'h014382c87bb4d29015296cbadb898e8e19aed8e594f786d35bf732285d003ed4c300f3ad957b8e52bf', ' video_omgid': '', ' uin': 'o0???????', ' iip': '0', ' mmad_session': 'db8fbb73a2b0a4c41bc175f34a6ad7d79d7245bbd1ba1a04ed6f116b38c7c8b6c4a209839bd7378c4da98642d25827cce39f657a4b128eb2c6658eb64dad90d50adf1bdf73a0fae947e3047a489efcc4cd503f920e2c7f38ac8e4728189d5c2711de1c56c245721266e7088080fefde3', ' ts_uid': '8844190317', ' sig': 'h01ac912472130166d03e296461b8fba0d24e1a2bbe362cbae1470395802352c863c771017587fdabdb', ' uuid': '5d8752d7b10e69ca60b82d934f101a8c', ' rand_info': 'CAESIK4WkEF7objSg84LpN/56kispUPwx5XIFkZWGhEmjYpM', ' slave_bizuin': '3207019504', ' data_bizuin': '3226019316', ' bizuin': '3207019504', ' data_ticket': 'DaBODpqknEMzImuPqc7tT2ZR07to0GCNXX9WR2+lfcCOvPl/ZUTGnX5wAkd2yzQn', ' slave_sid': 'eFkzZVJOeXg5aHRIdHFuMlcyaUplT2JBbXVQZk5jYzB1aXM0bENQdFZUMmlwQWFvODVvX0V0MEM4cTdjWGN1NmJsYzFaTXI2YnpQZWNQNHluNjV6N1BMT3B1MWNHYU1kUWVPQU5oYTJ1eTJvb2dpU09oNG5rYk5JMGgyRFV0TnlYUFFMTDRabllhc0RLTXlL', ' slave_user': 'gh_90314c99dc76', ' xid': 'cb00dd5d681ce20868e0ffd778c1863f'}
url='https://mp.weixin.qq.com/cgi-bin/appmsg'
for page in range(0,5):
page=page*5
#fakeid 为公众号账号,此处为人民日报账号;page实现翻页
data={'action': 'list_ex', 'begin': page, 'count': '5', 'fakeid': 'MjM5MjAxNDM4MA==', 'type': '9', 'query': '', 'token': '2101561850', 'lang': 'zh_CN', 'f': 'json', 'ajax': '1'}
res=requests.get(url,headers=headers,params=data,cookies=cookies)
print(res.status_code)
app_msg_list=res.json()['app_msg_list']
# print(app_msg_list)
for message in app_msg_list:
link=message['link']
title=message['title']
print(title,link) 查看全部
querylist采集微信公众号文章(
微信公众号爬虫关键是获取请求地址,注意:请求是需要cookies参数
)

微信公众号爬虫的关键是获取请求的地址。这个文章是方法之一。
登录自己的公众号后台,微信官方平台,进入图文消息编辑界面,进入超链接,选择公众号文章,
搜索人民日报等公众号,会弹出最新的文章列表。这时候就可以找到对应的请求了。可以通过公众号文章翻页找到请求的参数规则。
注意:请求需要cookies参数,可以复制浏览器访问的cookies。代码如下:(cookies中的关键参数已经脱敏为“???”)
''' the key is to use cookies'''
import requests
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','referer':'https://mp.weixin.qq.com/cgi-b ... 39%3B}
cookies={'appmsglist_action_3207019504': 'card', ' pgv_info': 'ssid', ' pgv_pvid': '4778161886', ' RK': '1KphnCSeRK', ' ptcz': '4a3ad775ddc10f3d9f50479110d37c6f7d5c7e8b38ebdb1e90207808173ad942', ' rewardsn': '', ' wxtokenkey': '777', ' _ga': 'GA1.2.1040497363.1629278077', ' o_cookie': '???????', ' pac_uid': '1_???????', ' tvfe_boss_uuid': 'a1a981cb70609f6e', ' vversion_name': '8.2.95', ' user_id': 'null', ' session_id': 'null',
' ua_id': 'ZpH4w1C3ipVIqGlHAAAAANiI5kknP2NeaIGodK9Opus', ' wxuin': '32385700599949', ' mm_lang': 'zh_CN', ' ptui_loginuin': '???????', ' verifysession': 'h014382c87bb4d29015296cbadb898e8e19aed8e594f786d35bf732285d003ed4c300f3ad957b8e52bf', ' video_omgid': '', ' uin': 'o0???????', ' iip': '0', ' mmad_session': 'db8fbb73a2b0a4c41bc175f34a6ad7d79d7245bbd1ba1a04ed6f116b38c7c8b6c4a209839bd7378c4da98642d25827cce39f657a4b128eb2c6658eb64dad90d50adf1bdf73a0fae947e3047a489efcc4cd503f920e2c7f38ac8e4728189d5c2711de1c56c245721266e7088080fefde3', ' ts_uid': '8844190317', ' sig': 'h01ac912472130166d03e296461b8fba0d24e1a2bbe362cbae1470395802352c863c771017587fdabdb', ' uuid': '5d8752d7b10e69ca60b82d934f101a8c', ' rand_info': 'CAESIK4WkEF7objSg84LpN/56kispUPwx5XIFkZWGhEmjYpM', ' slave_bizuin': '3207019504', ' data_bizuin': '3226019316', ' bizuin': '3207019504', ' data_ticket': 'DaBODpqknEMzImuPqc7tT2ZR07to0GCNXX9WR2+lfcCOvPl/ZUTGnX5wAkd2yzQn', ' slave_sid': 'eFkzZVJOeXg5aHRIdHFuMlcyaUplT2JBbXVQZk5jYzB1aXM0bENQdFZUMmlwQWFvODVvX0V0MEM4cTdjWGN1NmJsYzFaTXI2YnpQZWNQNHluNjV6N1BMT3B1MWNHYU1kUWVPQU5oYTJ1eTJvb2dpU09oNG5rYk5JMGgyRFV0TnlYUFFMTDRabllhc0RLTXlL', ' slave_user': 'gh_90314c99dc76', ' xid': 'cb00dd5d681ce20868e0ffd778c1863f'}
url='https://mp.weixin.qq.com/cgi-bin/appmsg'
for page in range(0,5):
page=page*5
#fakeid 为公众号账号,此处为人民日报账号;page实现翻页
data={'action': 'list_ex', 'begin': page, 'count': '5', 'fakeid': 'MjM5MjAxNDM4MA==', 'type': '9', 'query': '', 'token': '2101561850', 'lang': 'zh_CN', 'f': 'json', 'ajax': '1'}
res=requests.get(url,headers=headers,params=data,cookies=cookies)
print(res.status_code)
app_msg_list=res.json()['app_msg_list']
# print(app_msg_list)
for message in app_msg_list:
link=message['link']
title=message['title']
print(title,link)
querylist采集微信公众号文章(一个微信公众号历史消息页面的链接地址和采集方法)
采集交流 • 优采云 发表了文章 • 0 个评论 • 157 次浏览 • 2022-01-01 12:07
我从2014年开始批量做微信公众号内容采集,最初的目的是为了制造一个html5垃圾邮件网站。当时,垃圾站采集到达的微信公众号内容很容易在公众号传播。那个时候分批的采集特别好做,而采集的入口就是公众号的历史新闻页面。这个入口现在还是一样,只是越来越难采集。 采集的方法也更新了很多版本。后来到了2015年,html5垃圾站就不做了。取而代之的是,采集的目标是针对本地新闻资讯公众号,将前端展示做成一个app。于是一个可以自动采集公众号内容的新闻APP就形成了。曾经担心微信技术升级一天后,采集的内容不可用,我的新闻应用会失败。但是随着微信技术的不断升级,采集的方法也得到了升级,这让我越来越有信心。只要公众号历史消息页面存在,就可以批量采集查看内容。所以今天整理了一下,决定把采集这个方法写下来。我的方法来自于很多同事的分享精神,所以我会延续这种精神,分享我的成果。
本文文章会持续更新,保证您看到的内容在您看到时可用。
首先来看一个微信公众号历史消息页面的链接地址:
http://mp.weixin.qq.com/mp/get ... irect
========2017 年 1 月 11 日更新==========
现在根据不同的微信个人账号,会有两个不同的历史消息页地址。以下是另一个历史消息页面的地址。第一种地址的链接在anyproxy中会显示302跳转:
https://mp.weixin.qq.com/mp/pr ... irect
第一个链接地址的页面样式:
第二个链接地址的页面样式:
根据目前的信息,这两种页面格式在不同的微信账号中出现不规则。有的微信账号永远是第一页格式,有的永远是第二页格式。
上面的链接是微信公众号历史新闻页面的真实链接,但是当我们在浏览器中输入这个链接时,会显示:请从微信客户端访问。这是因为链接地址实际上需要几个参数才能正常显示内容。我们来看看一个可以正常显示内容的完整链接是什么样子的:
//第一种链接
http://mp.weixin.qq.com/mp/get ... r%3D1
//第二种
http://mp.weixin.qq.com/mp/pro ... r%3D1
该地址是通过微信客户端打开历史消息页面后使用代理服务器软件获取的。这里有几个参数:
action=;__biz=;uin=;key=;devicetype=;version=;lang=;nettype=;scene=;pass_ticket=;wx_header=;
重要的参数是:__biz;uin=;key=;pass_ticket=;这4个参数。
__biz 是公众号的类似id的参数。每个公众号都有一个微信。目前公众号的biz变动的可能性很小;
剩下的3个参数与用户的id和tokenticket相关。这3个参数的值在微信客户端生成后会自动添加到地址栏中。所以我们认为采集公众号必须通过微信客户端。在之前的微信版本中,这3个参数也可以一次性获取,在有效期内可以使用多个公众号。在当前版本中,每次访问公众号都会更改参数值。
我现在使用的方法只需要关注__biz参数即可。
我的采集系统由以下部分组成:
1、 微信客户端:可以是安装了微信应用的手机,也可以是电脑上的安卓模拟器。在batch采集上测试的ios微信客户端崩溃率高于Android系统。为了降低成本,我使用了Android模拟器。
2、一个微信个人账号:为了采集内容,不仅需要一个微信客户端,还需要一个专用于采集的微信个人账号,因为这个微信账号可以不要做任何其他事情。
3、本地代理服务器系统:目前使用的方法是通过Anyproxy代理服务器将公众账号历史消息页面中文章的列表发送到自己的服务器上。具体安装方法后面会详细介绍。
4、文章列表分析入库系统:本人使用php语言编写,下篇文章将详细介绍如何分析文章列表并建立采集 queue 实现批量采集内容。
步骤
一、 安装模拟器或使用手机安装微信客户端,申请微信个人账号并登录应用。这个就不多介绍了,大家自己做。
二、代理服务器系统安装
目前我使用 Anyproxy、AnyProxy。这个软件的特点是可以获取https链接的内容。 2016年初,微信公众号和微信文章开始使用https链接。而Anyproxy可以通过修改规则配置,在公众号页面插入脚本代码。下面将介绍安装和配置过程。
1、安装 NodeJS
2、在命令行或终端运行npm install -g anyproxy,mac系统需要添加sudo;
3、生成RootCA,https需要这个证书:运行命令sudo anyproxy --root(windows可能不需要sudo);
4、启动anyproxy运行命令:sudo anyproxy -i;参数-i表示解析HTTPS;
5、安装证书,在手机或者安卓模拟器安装证书:
6、 设置代理:安卓模拟器的代理服务器地址为wifi链接的网关。通过dhcp设置为static后就可以看到网关地址了。阅读后不要忘记将其设置为自动。手机中的代理服务器地址是运行anyproxy的电脑的ip地址。代理服务器默认端口为8001;
现在打开微信,点击任意一个公众号历史消息或者文章,就可以看到在终端滚动的响应码。如果没有出现,请检查手机的代理设置是否正确。
现在打开浏览器地址localhost:8002,可以看到anyproxy的web界面。微信点击打开历史消息页面,然后查看浏览器的网页界面,历史消息页面的地址会滚动。
/mp/getmasssendmsg开头的网址是微信历史消息页面。左边的小锁表示这个页面是 https 加密的。现在我们点击这一行;
========2017 年 1 月 11 日更新==========
有些以/mp/getmasssendmsg开头的微信账号会出现302跳转到/mp/profile_ext?action=home开头的地址。所以点击这个地址可以看到内容。
如果右侧出现html文件内容,则表示解密成功。如果没有内容,请检查anyproxy运行方式是否有参数i,是否生成了ca证书,是否在手机上正确安装了证书。
现在我们手机里的所有内容都可以明文通过代理服务器了。接下来我们需要修改一下代理服务器的配置,才能获取公众号的内容。
一、找到配置文件:
配置文件在mac系统中的位置是/usr/local/lib/node_modules/anyproxy/lib/;对于windows系统,不知道还请见谅。应该可以根据类似mac的文件夹地址找到这个目录。
二、修改文件rule_default.js
找到 replaceServerResDataAsync: function(req,res,serverResData,callback) 函数
修改函数内容(请注意详细阅读注释,这里只是介绍原理,理解后根据自己的情况修改内容):
========2017 年 1 月 11 日更新==========
因为有两种页面格式,相同的页面格式总是在不同的微信账号中显示,但是为了兼容两种页面格式,下面的代码会保留两种页面格式的判断。您也可以按照从您自己的页面表单中删除 li
replaceServerResDataAsync: function(req,res,serverResData,callback){
if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
if(serverResData.toString() !== ""){
try {//防止报错退出程序
var reg = /msgList = (.*?);\r\n/;//定义历史消息正则匹配规则
var ret = reg.exec(serverResData.toString());//转换变量为string
HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
var http = require('http');
http.get('http://xxx.com/getWxHis.php', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
})
});
}catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
}
}catch(e){
console.log(e);//错误捕捉
}
callback(serverResData);//直接返回第二页json内容
}
}
}else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
try {
var reg = /var msgList = \'(.*?)\';\r\n/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
var ret = reg.exec(serverResData.toString());//转换变量为string
HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
var http = require('http');
http.get('http://xxx.com/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
})
});
}catch(e){
callback(serverResData);
}
}else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
}
}catch(e){
console.log(e);
}
callback(serverResData);
}else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
try {
HttpPost(serverResData,req.url,"getMsgExt.php");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
}catch(e){
}
callback(serverResData);
}else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
try {
var http = require('http');
http.get('http://xxx.com/getWxPost.php', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);
})
});
}catch(e){
callback(serverResData);
}
}else{
callback(serverResData);
}
},
以上代码是使用anyproxy修改返回页面内容、向页面注入脚本、将页面内容发送到服务器的功能。利用这个原理批量处理采集公众号内容和阅读量。该脚本中自定义了一个函数,详细说明如下:
在 rule_default.js 文件末尾添加以下代码:
function HttpPost(str,url,path) {//将json发送到服务器,str为json内容,url为历史消息页面地址,path是接收程序的路径和文件名
var http = require('http');
var data = {
str: encodeURIComponent(str),
url: encodeURIComponent(url)
};
content = require('querystring').stringify(data);
var options = {
method: "POST",
host: "www.xxx.com",//注意没有http://,这是服务器的域名。
port: 80,
path: path,//接收程序的路径和文件名
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
"Content-Length": content.length
}
};
var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
});
req.write(content);
req.end();
}
以上是规则修改的主要部分。您需要将json内容发送到您自己的服务器,并从服务器获取到下一页的跳转地址。这涉及到四个php文件:getMsgJson.php、getMsgExt.php、getWxHis.php、getWxPost.php
在详细介绍这4个php文件之前,为了提高采集系统性能,降低崩溃率,我们还可以做一些修改:
Android模拟器经常访问一些地址,会导致anyproxy崩溃,找到函数replaceRequestOption:function(req,option),修改函数内容:
replaceRequestOption : function(req,option){
var newOption = option;
if(/google/i.test(newOption.headers.host)){
newOption.hostname = "www.baidu.com";
newOption.port = "80";
}
return newOption;
},
以上是anyproxy的规则文件的修改配置。配置修改完成后,重启anyproxy。在mac系统下,按control+c中断程序,然后输入命令sudo anyproxy -i启动;如果报错,程序可能无法干净退出,端口被占用。这时候输入命令ps -a查看占用的pid,然后输入命令“kill -9 pid”将pid替换为查询到的pid号。杀掉进程后,就可以启动anyproxy了。再次请原谅我不熟悉windows命令。
接下来详细介绍服务器端接收程序的设计原理:
(以下代码不能直接使用,只介绍原理,部分需要根据自己的服务器数据库框架编写)
1、getMsgJson.php:该程序负责接收历史消息的json,解析并存入数据库
<p> 查看全部
querylist采集微信公众号文章(一个微信公众号历史消息页面的链接地址和采集方法)
我从2014年开始批量做微信公众号内容采集,最初的目的是为了制造一个html5垃圾邮件网站。当时,垃圾站采集到达的微信公众号内容很容易在公众号传播。那个时候分批的采集特别好做,而采集的入口就是公众号的历史新闻页面。这个入口现在还是一样,只是越来越难采集。 采集的方法也更新了很多版本。后来到了2015年,html5垃圾站就不做了。取而代之的是,采集的目标是针对本地新闻资讯公众号,将前端展示做成一个app。于是一个可以自动采集公众号内容的新闻APP就形成了。曾经担心微信技术升级一天后,采集的内容不可用,我的新闻应用会失败。但是随着微信技术的不断升级,采集的方法也得到了升级,这让我越来越有信心。只要公众号历史消息页面存在,就可以批量采集查看内容。所以今天整理了一下,决定把采集这个方法写下来。我的方法来自于很多同事的分享精神,所以我会延续这种精神,分享我的成果。
本文文章会持续更新,保证您看到的内容在您看到时可用。
首先来看一个微信公众号历史消息页面的链接地址:
http://mp.weixin.qq.com/mp/get ... irect
========2017 年 1 月 11 日更新==========
现在根据不同的微信个人账号,会有两个不同的历史消息页地址。以下是另一个历史消息页面的地址。第一种地址的链接在anyproxy中会显示302跳转:
https://mp.weixin.qq.com/mp/pr ... irect
第一个链接地址的页面样式:

第二个链接地址的页面样式:

根据目前的信息,这两种页面格式在不同的微信账号中出现不规则。有的微信账号永远是第一页格式,有的永远是第二页格式。
上面的链接是微信公众号历史新闻页面的真实链接,但是当我们在浏览器中输入这个链接时,会显示:请从微信客户端访问。这是因为链接地址实际上需要几个参数才能正常显示内容。我们来看看一个可以正常显示内容的完整链接是什么样子的:
//第一种链接
http://mp.weixin.qq.com/mp/get ... r%3D1
//第二种
http://mp.weixin.qq.com/mp/pro ... r%3D1
该地址是通过微信客户端打开历史消息页面后使用代理服务器软件获取的。这里有几个参数:
action=;__biz=;uin=;key=;devicetype=;version=;lang=;nettype=;scene=;pass_ticket=;wx_header=;
重要的参数是:__biz;uin=;key=;pass_ticket=;这4个参数。
__biz 是公众号的类似id的参数。每个公众号都有一个微信。目前公众号的biz变动的可能性很小;
剩下的3个参数与用户的id和tokenticket相关。这3个参数的值在微信客户端生成后会自动添加到地址栏中。所以我们认为采集公众号必须通过微信客户端。在之前的微信版本中,这3个参数也可以一次性获取,在有效期内可以使用多个公众号。在当前版本中,每次访问公众号都会更改参数值。
我现在使用的方法只需要关注__biz参数即可。
我的采集系统由以下部分组成:
1、 微信客户端:可以是安装了微信应用的手机,也可以是电脑上的安卓模拟器。在batch采集上测试的ios微信客户端崩溃率高于Android系统。为了降低成本,我使用了Android模拟器。

2、一个微信个人账号:为了采集内容,不仅需要一个微信客户端,还需要一个专用于采集的微信个人账号,因为这个微信账号可以不要做任何其他事情。
3、本地代理服务器系统:目前使用的方法是通过Anyproxy代理服务器将公众账号历史消息页面中文章的列表发送到自己的服务器上。具体安装方法后面会详细介绍。
4、文章列表分析入库系统:本人使用php语言编写,下篇文章将详细介绍如何分析文章列表并建立采集 queue 实现批量采集内容。
步骤
一、 安装模拟器或使用手机安装微信客户端,申请微信个人账号并登录应用。这个就不多介绍了,大家自己做。
二、代理服务器系统安装
目前我使用 Anyproxy、AnyProxy。这个软件的特点是可以获取https链接的内容。 2016年初,微信公众号和微信文章开始使用https链接。而Anyproxy可以通过修改规则配置,在公众号页面插入脚本代码。下面将介绍安装和配置过程。
1、安装 NodeJS
2、在命令行或终端运行npm install -g anyproxy,mac系统需要添加sudo;
3、生成RootCA,https需要这个证书:运行命令sudo anyproxy --root(windows可能不需要sudo);
4、启动anyproxy运行命令:sudo anyproxy -i;参数-i表示解析HTTPS;
5、安装证书,在手机或者安卓模拟器安装证书:
6、 设置代理:安卓模拟器的代理服务器地址为wifi链接的网关。通过dhcp设置为static后就可以看到网关地址了。阅读后不要忘记将其设置为自动。手机中的代理服务器地址是运行anyproxy的电脑的ip地址。代理服务器默认端口为8001;

现在打开微信,点击任意一个公众号历史消息或者文章,就可以看到在终端滚动的响应码。如果没有出现,请检查手机的代理设置是否正确。

现在打开浏览器地址localhost:8002,可以看到anyproxy的web界面。微信点击打开历史消息页面,然后查看浏览器的网页界面,历史消息页面的地址会滚动。

/mp/getmasssendmsg开头的网址是微信历史消息页面。左边的小锁表示这个页面是 https 加密的。现在我们点击这一行;
========2017 年 1 月 11 日更新==========
有些以/mp/getmasssendmsg开头的微信账号会出现302跳转到/mp/profile_ext?action=home开头的地址。所以点击这个地址可以看到内容。

如果右侧出现html文件内容,则表示解密成功。如果没有内容,请检查anyproxy运行方式是否有参数i,是否生成了ca证书,是否在手机上正确安装了证书。
现在我们手机里的所有内容都可以明文通过代理服务器了。接下来我们需要修改一下代理服务器的配置,才能获取公众号的内容。
一、找到配置文件:
配置文件在mac系统中的位置是/usr/local/lib/node_modules/anyproxy/lib/;对于windows系统,不知道还请见谅。应该可以根据类似mac的文件夹地址找到这个目录。
二、修改文件rule_default.js
找到 replaceServerResDataAsync: function(req,res,serverResData,callback) 函数
修改函数内容(请注意详细阅读注释,这里只是介绍原理,理解后根据自己的情况修改内容):
========2017 年 1 月 11 日更新==========
因为有两种页面格式,相同的页面格式总是在不同的微信账号中显示,但是为了兼容两种页面格式,下面的代码会保留两种页面格式的判断。您也可以按照从您自己的页面表单中删除 li
replaceServerResDataAsync: function(req,res,serverResData,callback){
if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
if(serverResData.toString() !== ""){
try {//防止报错退出程序
var reg = /msgList = (.*?);\r\n/;//定义历史消息正则匹配规则
var ret = reg.exec(serverResData.toString());//转换变量为string
HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
var http = require('http');
http.get('http://xxx.com/getWxHis.php', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
})
});
}catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
}
}catch(e){
console.log(e);//错误捕捉
}
callback(serverResData);//直接返回第二页json内容
}
}
}else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
try {
var reg = /var msgList = \'(.*?)\';\r\n/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
var ret = reg.exec(serverResData.toString());//转换变量为string
HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
var http = require('http');
http.get('http://xxx.com/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
})
});
}catch(e){
callback(serverResData);
}
}else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
}
}catch(e){
console.log(e);
}
callback(serverResData);
}else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
try {
HttpPost(serverResData,req.url,"getMsgExt.php");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
}catch(e){
}
callback(serverResData);
}else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
try {
var http = require('http');
http.get('http://xxx.com/getWxPost.php', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);
})
});
}catch(e){
callback(serverResData);
}
}else{
callback(serverResData);
}
},
以上代码是使用anyproxy修改返回页面内容、向页面注入脚本、将页面内容发送到服务器的功能。利用这个原理批量处理采集公众号内容和阅读量。该脚本中自定义了一个函数,详细说明如下:
在 rule_default.js 文件末尾添加以下代码:
function HttpPost(str,url,path) {//将json发送到服务器,str为json内容,url为历史消息页面地址,path是接收程序的路径和文件名
var http = require('http');
var data = {
str: encodeURIComponent(str),
url: encodeURIComponent(url)
};
content = require('querystring').stringify(data);
var options = {
method: "POST",
host: "www.xxx.com",//注意没有http://,这是服务器的域名。
port: 80,
path: path,//接收程序的路径和文件名
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
"Content-Length": content.length
}
};
var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
});
req.write(content);
req.end();
}
以上是规则修改的主要部分。您需要将json内容发送到您自己的服务器,并从服务器获取到下一页的跳转地址。这涉及到四个php文件:getMsgJson.php、getMsgExt.php、getWxHis.php、getWxPost.php
在详细介绍这4个php文件之前,为了提高采集系统性能,降低崩溃率,我们还可以做一些修改:
Android模拟器经常访问一些地址,会导致anyproxy崩溃,找到函数replaceRequestOption:function(req,option),修改函数内容:
replaceRequestOption : function(req,option){
var newOption = option;
if(/google/i.test(newOption.headers.host)){
newOption.hostname = "www.baidu.com";
newOption.port = "80";
}
return newOption;
},
以上是anyproxy的规则文件的修改配置。配置修改完成后,重启anyproxy。在mac系统下,按control+c中断程序,然后输入命令sudo anyproxy -i启动;如果报错,程序可能无法干净退出,端口被占用。这时候输入命令ps -a查看占用的pid,然后输入命令“kill -9 pid”将pid替换为查询到的pid号。杀掉进程后,就可以启动anyproxy了。再次请原谅我不熟悉windows命令。
接下来详细介绍服务器端接收程序的设计原理:
(以下代码不能直接使用,只介绍原理,部分需要根据自己的服务器数据库框架编写)
1、getMsgJson.php:该程序负责接收历史消息的json,解析并存入数据库
<p>
querylist采集微信公众号文章(爬取所有关于python的公众号文章,你了解多少? )
采集交流 • 优采云 发表了文章 • 0 个评论 • 149 次浏览 • 2021-12-31 17:22
)
前言
本文中的文字图片过滤网络可用于学习、交流,不具有任何商业用途。如果您有任何问题,请联系我们进行处理。
文章为基础开发环境爬取两个公众号:
1.抓取所有 文章
2、爬取所有关于python的公众号文章
爬取 文章
1、登录公众号后点击图片和文字
2、打开开发者工具
3、点击超链接
加载相关数据时,有一个数据包,包括文章标题、链接、摘要、发布时间等,你也可以选择其他公众号进行爬取,但这需要你有一个微信公众号。
添加cookie
import pprint
import time
import requests
import csv
f = open('青灯公众号文章.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '文章发布时间', '文章地址'])
csv_writer.writeheader()
for page in range(0, 40, 5):
url = f'https://mp.weixin.qq.com/cgi-b ... in%3D{page}&count=5&fakeid=&type=9&query=&token=1252678642&lang=zh_CN&f=json&ajax=1'
headers = {
'cookie': '加cookie',
'referer': 'https://mp.weixin.qq.com/cgi-b ... 39%3B,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
html_data = response.json()
pprint.pprint(response.json())
lis = html_data['app_msg_list']
for li in lis:
title = li['title']
link_url = li['link']
update_time = li['update_time']
timeArray = time.localtime(int(update_time))
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
dit = {
'标题': title,
'文章发布时间': otherStyleTime,
'文章地址': link_url,
}
csv_writer.writerow(dit)
print(dit)
爬取所有关于python的公众号文章
1、搜狗搜索python选择微信
注意:如果不登录,只能抓取前十页数据。登录后可以抓取2W多篇文章文章。
2.直接爬取静态网页的标题、公众号、文章地址、发帖时间。
import time
import requests
import parsel
import csv
f = open('公众号文章.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '公众号', '文章发布时间', '文章地址'])
csv_writer.writeheader()
for page in range(1, 2447):
url = f'https://weixin.sogou.com/weixi ... ge%3D{page}&ie=utf8'
headers = {
'Cookie': '自己的cookie',
'Host': 'weixin.sogou.com',
'Referer': 'https://www.sogou.com/web%3Fqu ... 39%3B,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
selector = parsel.Selector(response.text)
lis = selector.css('.news-list li')
for li in lis:
title_list = li.css('.txt-box h3 a::text').getall()
num = len(title_list)
if num == 1:
title_str = 'python' + title_list[0]
else:
title_str = 'python'.join(title_list)
href = li.css('.txt-box h3 a::attr(href)').get()
article_url = 'https://weixin.sogou.com' + href
name = li.css('.s-p a::text').get()
date = li.css('.s-p::attr(t)').get()
timeArray = time.localtime(int(date))
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
dit = {
'标题': title_str,
'公众号': name,
'文章发布时间': otherStyleTime,
'文章地址': article_url,
}
csv_writer.writerow(dit)
print(title_str, name, otherStyleTime, article_url)
查看全部
querylist采集微信公众号文章(爬取所有关于python的公众号文章,你了解多少?
)
前言
本文中的文字图片过滤网络可用于学习、交流,不具有任何商业用途。如果您有任何问题,请联系我们进行处理。
文章为基础开发环境爬取两个公众号:
1.抓取所有 文章
2、爬取所有关于python的公众号文章
爬取 文章
1、登录公众号后点击图片和文字

2、打开开发者工具

3、点击超链接

加载相关数据时,有一个数据包,包括文章标题、链接、摘要、发布时间等,你也可以选择其他公众号进行爬取,但这需要你有一个微信公众号。
添加cookie
import pprint
import time
import requests
import csv
f = open('青灯公众号文章.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '文章发布时间', '文章地址'])
csv_writer.writeheader()
for page in range(0, 40, 5):
url = f'https://mp.weixin.qq.com/cgi-b ... in%3D{page}&count=5&fakeid=&type=9&query=&token=1252678642&lang=zh_CN&f=json&ajax=1'
headers = {
'cookie': '加cookie',
'referer': 'https://mp.weixin.qq.com/cgi-b ... 39%3B,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
html_data = response.json()
pprint.pprint(response.json())
lis = html_data['app_msg_list']
for li in lis:
title = li['title']
link_url = li['link']
update_time = li['update_time']
timeArray = time.localtime(int(update_time))
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
dit = {
'标题': title,
'文章发布时间': otherStyleTime,
'文章地址': link_url,
}
csv_writer.writerow(dit)
print(dit)
爬取所有关于python的公众号文章
1、搜狗搜索python选择微信

注意:如果不登录,只能抓取前十页数据。登录后可以抓取2W多篇文章文章。
2.直接爬取静态网页的标题、公众号、文章地址、发帖时间。
import time
import requests
import parsel
import csv
f = open('公众号文章.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '公众号', '文章发布时间', '文章地址'])
csv_writer.writeheader()
for page in range(1, 2447):
url = f'https://weixin.sogou.com/weixi ... ge%3D{page}&ie=utf8'
headers = {
'Cookie': '自己的cookie',
'Host': 'weixin.sogou.com',
'Referer': 'https://www.sogou.com/web%3Fqu ... 39%3B,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
selector = parsel.Selector(response.text)
lis = selector.css('.news-list li')
for li in lis:
title_list = li.css('.txt-box h3 a::text').getall()
num = len(title_list)
if num == 1:
title_str = 'python' + title_list[0]
else:
title_str = 'python'.join(title_list)
href = li.css('.txt-box h3 a::attr(href)').get()
article_url = 'https://weixin.sogou.com' + href
name = li.css('.s-p a::text').get()
date = li.css('.s-p::attr(t)').get()
timeArray = time.localtime(int(date))
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
dit = {
'标题': title_str,
'公众号': name,
'文章发布时间': otherStyleTime,
'文章地址': article_url,
}
csv_writer.writerow(dit)
print(title_str, name, otherStyleTime, article_url)

querylist采集微信公众号文章(批量获取公众号推送超链接的原理(图)介绍)
采集交流 • 优采云 发表了文章 • 0 个评论 • 311 次浏览 • 2022-01-17 22:08
一、前言
二、准备
三、正式开始
四、结束语
一、前言
前几天书文问我能不能爬取微信公众号“北京邮教部”的历史动态,分析最多的成绩和科目。之前没做过微信公众号爬虫,所以研究了一下,发现了这个文章。
二、准备三、正式开始(一)批量获取之前公众号推送的url链接1.微信后台插入其他公众号推送超链接的原理公众号
如果要批量抓取微信公众号过去的推送,最大的问题是如何获取这些推送的url链接。因为通常我们点击一个推送时,微信会随机生成一个url链接,而这个随机生成的url与公众号推送的其他url没有任何关联。因此,如果我们要批量抓取公众号的所有推送,需要手动点击每条推送,复制每条推送的url链接。这显然是不现实的。在广泛查阅各种资料后,我学会了如何爬取公众号所有文章this文章的方法。
这种方式的原理是,当我们登录微信公众号后台编辑图文素材时,可以在素材中插入其他公众号的推送链接。这里,微信公众号后台会自动调用相关API,返回公众号推送的所有长链接列表。
我们打开Chrome浏览器的查看模式,选择网络,然后在编辑超链接界面的公众号搜索栏中输入“北京邮政家教部”,搜索并选择公众号,发现一个刷新的网络以“开头” appmsg”开头的内容,这是我们分析的目标。
我们点击“appmsg”开头的内容,解析请求的url:
https://mp.weixin.qq.com/cgi-b ... x%3D1
链接分为三个部分:
request的基本部分?action=list_ex常用于动态网站,实现不同的参数值生成不同的页面或返回不同的结果&begin=0&count=5&fakeid=MjM5NDY3ODI4OA==&type=9&query=&token= 1983840068&lang=zh_CN&f =json&ajax=1 设置各种参数2.获取Cookie和User-Agent
如果使用Python的Requests库直接访问url,是无法正常获取结果的。原因是在使用网页版微信公众号在后台插入超链接时,我们处于登录状态,但是当我们使用python直接访问时,我们并没有处于登录状态。因此,我们需要在访问时手动获取Cookie和User-Agent,并在使用Python的Requests库访问时将它们传递到headers参数中。这里说一下,我把公众号标识符 fakeid 和 token 参数保存在一个 yaml 文件中,方便爬取时加载。
cookie : appmsglist_action_3899……
user_agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64)……
fakeid : MzI4M……
token : "19……
在python代码中加载如下:
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']
}
3.设置url参数
然后我们设置要请求的url链接的参数:
# 请求参数
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"
}
这里,count 是请求返回的信息数,begin 是当前请求的页数。当begin设置为0时,会以json格式返回最近五次推送信息,以此类推。
4.开始爬取
通过一个循环,begin的值每次加1,循环爬取:
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)))
time.sleep(3600)
continue
# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("app_msg_list.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
print(f"第{i}页爬取成功\n")
print("\n".join(info.split(",")))
print("\n\n---------------------------------------------------------------------------------\n")
# 翻页
i += 1
爬了大概50页的时候,遇到如下错误:{'base_resp': {'err_msg': 'freq control', 'ret': 200013}}这是因为微信公众号有流量限制,等一个小时就好了. 我在这里使用以下代码来解决它:
# 微信流量控制
if resp.json()['base_resp']['ret'] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
time.sleep(3600)
continue
对于每条爬取的信息,对其进行解析并将其存储在一个 csv 文件中:
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("python小屋.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
5.完整代码
完整代码如下:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : Spider.py
@Time : 2021/06/04 02:20:24
@Author : YuFanWenShu
@Contact : 1365240381@qq.com
'''
# here put the import lib
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语句
# 也方便重新运行时设置页数
with open("app_msg_list.csv", "w",encoding='utf-8') as file:
file.write("文章标识符aid,标题title,链接url,时间time\n")
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)))
time.sleep(3600)
continue
# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("app_msg_list.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
print(f"第{i}页爬取成功\n")
print("\n".join(info.split(",")))
print("\n\n---------------------------------------------------------------------------------\n")
# 翻页
i += 1
6.爬取结果
最终结果保存在 csv 文件中,一共 565 条推送消息:
(二)对每次推送进行爬取,提取需要的信息1.对每次推送进行遍历和爬取
从 csv 文件中读取每次推送的 url 链接,并使用 Requests 库抓取每次推送的内容:
with open("app_msg_list.csv","r",encoding="utf-8") as f:
data = f.readlines()
n = len(data)
for i in range(n):
mes = data[i].strip("\n").split(",")
if len(mes)!=4:
continue
title,url = mes[1:3]
if i>0:
r = requests.get(eval(url),headers=headers)
if r.status_code == 200:
text = r.text
projects = re_project.finditer(text)
2.提取信息并写入文件
我们需要提取的是每个导师信息的年级和科目。通过观察推送结构,我决定使用正则表达式进行提取。
有的家教订单长时间没有回复,会在多个帖子中重复出现,从而影响我们的统计结果。我决定用数字来识别不同的辅导信息,相同的数字只会计算一次。所以使用下面的正则表达式来匹配:
<p>re_project = re.compile(r">编号(.*?)年级(.*?)科目(.*?)科目(.*?)年级(.*?)编号(.*?)年级(.*?)科目(.*?) 查看全部
querylist采集微信公众号文章(批量获取公众号推送超链接的原理(图)介绍)
一、前言
二、准备
三、正式开始
四、结束语
一、前言
前几天书文问我能不能爬取微信公众号“北京邮教部”的历史动态,分析最多的成绩和科目。之前没做过微信公众号爬虫,所以研究了一下,发现了这个文章。
二、准备三、正式开始(一)批量获取之前公众号推送的url链接1.微信后台插入其他公众号推送超链接的原理公众号
如果要批量抓取微信公众号过去的推送,最大的问题是如何获取这些推送的url链接。因为通常我们点击一个推送时,微信会随机生成一个url链接,而这个随机生成的url与公众号推送的其他url没有任何关联。因此,如果我们要批量抓取公众号的所有推送,需要手动点击每条推送,复制每条推送的url链接。这显然是不现实的。在广泛查阅各种资料后,我学会了如何爬取公众号所有文章this文章的方法。
这种方式的原理是,当我们登录微信公众号后台编辑图文素材时,可以在素材中插入其他公众号的推送链接。这里,微信公众号后台会自动调用相关API,返回公众号推送的所有长链接列表。

我们打开Chrome浏览器的查看模式,选择网络,然后在编辑超链接界面的公众号搜索栏中输入“北京邮政家教部”,搜索并选择公众号,发现一个刷新的网络以“开头” appmsg”开头的内容,这是我们分析的目标。

我们点击“appmsg”开头的内容,解析请求的url:
https://mp.weixin.qq.com/cgi-b ... x%3D1
链接分为三个部分:
request的基本部分?action=list_ex常用于动态网站,实现不同的参数值生成不同的页面或返回不同的结果&begin=0&count=5&fakeid=MjM5NDY3ODI4OA==&type=9&query=&token= 1983840068&lang=zh_CN&f =json&ajax=1 设置各种参数2.获取Cookie和User-Agent
如果使用Python的Requests库直接访问url,是无法正常获取结果的。原因是在使用网页版微信公众号在后台插入超链接时,我们处于登录状态,但是当我们使用python直接访问时,我们并没有处于登录状态。因此,我们需要在访问时手动获取Cookie和User-Agent,并在使用Python的Requests库访问时将它们传递到headers参数中。这里说一下,我把公众号标识符 fakeid 和 token 参数保存在一个 yaml 文件中,方便爬取时加载。
cookie : appmsglist_action_3899……
user_agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64)……
fakeid : MzI4M……
token : "19……
在python代码中加载如下:
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']
}
3.设置url参数
然后我们设置要请求的url链接的参数:
# 请求参数
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"
}
这里,count 是请求返回的信息数,begin 是当前请求的页数。当begin设置为0时,会以json格式返回最近五次推送信息,以此类推。
4.开始爬取
通过一个循环,begin的值每次加1,循环爬取:
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)))
time.sleep(3600)
continue
# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("app_msg_list.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
print(f"第{i}页爬取成功\n")
print("\n".join(info.split(",")))
print("\n\n---------------------------------------------------------------------------------\n")
# 翻页
i += 1
爬了大概50页的时候,遇到如下错误:{'base_resp': {'err_msg': 'freq control', 'ret': 200013}}这是因为微信公众号有流量限制,等一个小时就好了. 我在这里使用以下代码来解决它:
# 微信流量控制
if resp.json()['base_resp']['ret'] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
time.sleep(3600)
continue
对于每条爬取的信息,对其进行解析并将其存储在一个 csv 文件中:
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("python小屋.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
5.完整代码
完整代码如下:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : Spider.py
@Time : 2021/06/04 02:20:24
@Author : YuFanWenShu
@Contact : 1365240381@qq.com
'''
# here put the import lib
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语句
# 也方便重新运行时设置页数
with open("app_msg_list.csv", "w",encoding='utf-8') as file:
file.write("文章标识符aid,标题title,链接url,时间time\n")
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)))
time.sleep(3600)
continue
# 如果返回的内容中为空则结束
if len(resp.json()['app_msg_list']) == 0:
print("all ariticle parsed")
break
msg = resp.json()
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))
with open("app_msg_list.csv", "a",encoding='utf-8') as f:
f.write(info+'\n')
print(f"第{i}页爬取成功\n")
print("\n".join(info.split(",")))
print("\n\n---------------------------------------------------------------------------------\n")
# 翻页
i += 1
6.爬取结果
最终结果保存在 csv 文件中,一共 565 条推送消息:

(二)对每次推送进行爬取,提取需要的信息1.对每次推送进行遍历和爬取
从 csv 文件中读取每次推送的 url 链接,并使用 Requests 库抓取每次推送的内容:
with open("app_msg_list.csv","r",encoding="utf-8") as f:
data = f.readlines()
n = len(data)
for i in range(n):
mes = data[i].strip("\n").split(",")
if len(mes)!=4:
continue
title,url = mes[1:3]
if i>0:
r = requests.get(eval(url),headers=headers)
if r.status_code == 200:
text = r.text
projects = re_project.finditer(text)
2.提取信息并写入文件
我们需要提取的是每个导师信息的年级和科目。通过观察推送结构,我决定使用正则表达式进行提取。

有的家教订单长时间没有回复,会在多个帖子中重复出现,从而影响我们的统计结果。我决定用数字来识别不同的辅导信息,相同的数字只会计算一次。所以使用下面的正则表达式来匹配:
<p>re_project = re.compile(r">编号(.*?)年级(.*?)科目(.*?)科目(.*?)年级(.*?)编号(.*?)年级(.*?)科目(.*?)
querylist采集微信公众号文章(贴个代码4.新建一个py文件获取cookies文件 )
采集交流 • 优采云 发表了文章 • 0 个评论 • 138 次浏览 • 2022-01-17 13:21
)
通过微信公众平台的搜索文章界面,先抓取我们需要的相关文章1.,我们先来看看,正常登录我们的微信公众号,然后使用文章搜索功能,搜索我们需要查找的相关文章。 2.实现思路3.获取cookie,不多说,贴个代码
#!/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)
查看全部
querylist采集微信公众号文章(贴个代码4.新建一个py文件获取cookies文件
)
通过微信公众平台的搜索文章界面,先抓取我们需要的相关文章1.,我们先来看看,正常登录我们的微信公众号,然后使用文章搜索功能,搜索我们需要查找的相关文章。 2.实现思路3.获取cookie,不多说,贴个代码
#!/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)


querylist采集微信公众号文章(文章目录[隐藏]要怎么用公众号制作出图文并茂)
采集交流 • 优采云 发表了文章 • 0 个评论 • 132 次浏览 • 2022-01-16 09:16
文章目录[隐藏]
如何使用公众号创建一个图文并茂、布局精美的公众号文章?这次就一起来了解一下吧~
什么编辑器好用
小编刚接触公众号运营的时候,很长一段时间都是直接在公众号后台编辑打文章。做出来的文章看起来很简单,读数一直很惨淡。
直到有同事推荐,我才开始用编辑器做图文,不过一开始编辑器也是用最常见的第三方网页编辑器排版公众号文章,虽然可以在文章中插入各种小装饰,玩文章的排版技巧。
但是,每当小编将编辑后输入的文章同步到公众号后台时,总能发现有些样式没有同步。不仅如此,在某些地方还存在格式错误的问题。这种情况下,小编只能稍微修改一下,很累。
后来小编碰巧用了一个外挂的微信编辑器,然后才意识到可以在公众号后台一站式完成公众号操作的日常工作,比如找文章和图片,编辑和排版文章等等,排版和发布不用太担心。
下面小编就以我常用的一帆助手编辑器为例,为大家介绍一下如何使用一帆创建公众号文章~
如何使用一板助手创建公众号文章
当我们去一板官网下载一板安装包并在常用浏览器上安装后,可以授权登录公众号后台,在公众号背景。
接下来,我们新建一个图文,然后就可以在图文编辑界面查看一帆提供的编辑增强、样式中心、图文工具箱。
我们在原有公众号后台编辑功能的基础上,结合一帆提供的特殊表达、全文过滤、下划线等编辑增强功能,让我们的排版更加精致,也大大提升了我们的排版文章 效率。
当然,如果你觉得编辑和强化功能还不够,想要更新颖有趣的布局样式,可以在页面左侧的样式中心找到大量实用的布局样式,点击即可将他们添加到公共帐户 文章 !
接下来,我们来看看图文工具箱。有大量工具可以提高公众号的排版效率,比如版权地图中心、导入文章、生成永久链接等。点击完成操作。非常友好!
有兴趣的小伙伴快来一班官网下载这款好用的公众号操作神器吧! 查看全部
querylist采集微信公众号文章(文章目录[隐藏]要怎么用公众号制作出图文并茂)
文章目录[隐藏]
如何使用公众号创建一个图文并茂、布局精美的公众号文章?这次就一起来了解一下吧~
什么编辑器好用
小编刚接触公众号运营的时候,很长一段时间都是直接在公众号后台编辑打文章。做出来的文章看起来很简单,读数一直很惨淡。
直到有同事推荐,我才开始用编辑器做图文,不过一开始编辑器也是用最常见的第三方网页编辑器排版公众号文章,虽然可以在文章中插入各种小装饰,玩文章的排版技巧。
但是,每当小编将编辑后输入的文章同步到公众号后台时,总能发现有些样式没有同步。不仅如此,在某些地方还存在格式错误的问题。这种情况下,小编只能稍微修改一下,很累。
后来小编碰巧用了一个外挂的微信编辑器,然后才意识到可以在公众号后台一站式完成公众号操作的日常工作,比如找文章和图片,编辑和排版文章等等,排版和发布不用太担心。
下面小编就以我常用的一帆助手编辑器为例,为大家介绍一下如何使用一帆创建公众号文章~
如何使用一板助手创建公众号文章
当我们去一板官网下载一板安装包并在常用浏览器上安装后,可以授权登录公众号后台,在公众号背景。
接下来,我们新建一个图文,然后就可以在图文编辑界面查看一帆提供的编辑增强、样式中心、图文工具箱。
我们在原有公众号后台编辑功能的基础上,结合一帆提供的特殊表达、全文过滤、下划线等编辑增强功能,让我们的排版更加精致,也大大提升了我们的排版文章 效率。
当然,如果你觉得编辑和强化功能还不够,想要更新颖有趣的布局样式,可以在页面左侧的样式中心找到大量实用的布局样式,点击即可将他们添加到公共帐户 文章 !
接下来,我们来看看图文工具箱。有大量工具可以提高公众号的排版效率,比如版权地图中心、导入文章、生成永久链接等。点击完成操作。非常友好!
有兴趣的小伙伴快来一班官网下载这款好用的公众号操作神器吧!
querylist采集微信公众号文章( 如何搜索微信最新公众号内容?怎样搜索方法/步骤)
采集交流 • 优采云 发表了文章 • 0 个评论 • 151 次浏览 • 2022-01-16 09:15
如何搜索微信最新公众号内容?怎样搜索方法/步骤)
很多朋友在查看最新的微信公众号文章时,通常都会使用搜索功能,那么如何搜索最新的微信公众号的内容呢?如何查询微信公众号文章的历史记录?道路数据将为您介绍。
如何搜索最新的微信公众号内容
如何搜索最新的微信公众号内容?
方法/步骤
打开浏览器,进入搜狗搜索首页,点击“更多”进入更多功能页面。
在输入框中输入你要搜索的关键词(这里以“百度体验”为例),点击“搜索”。
进入搜索结果显示页面。点击任意一个文章阅读相关内容。
进入文字页面,可以看到发文的公众号文章。
微信公众号历史文章如何搜索
方法/步骤
首先,找到您要搜索的公众号并输入。进入后,部分公众号下方有对应的文章历史记录,可点击进入。
除此之外,还可以点击右上角的人形logo进入公众号历史后台文章。
进入后台后会看到文章最近几期的内容,不过这些对我们来说还不够,点击下拉找到全部信息,点击进入全部信息界面。
进入所有历史信息的界面,整个界面往下拉,然后顶部会出现一个搜索框。
这个搜索框可以搜索到这个文章里面的历史文章,点击搜索进入搜索界面。
例如在搜索界面输入“HPV”,之后出现的界面就是本公众号文章中关于HPV的全部文章。
如何搜索最新的微信公众号内容
如何搜索最新的微信公众号内容?微信公众号文章搜索
搜索所有公众号内容
在手机上打开微信,点击右上角的加号,选择【添加好友】,在打开的“添加好友”页面点击搜索框。
在搜索框中搜索关键词,就会出现带有这个关键词的内容。在搜索结果中选择“文章”,微信公众号文章将被过滤掉。搜索结果。
在搜索结果中,您还可以根据不同的条件进行筛选,按照不同的顺序进行排序,从而更快、更准确地找到您需要的内容。
搜索指定公众号文章 查看全部
querylist采集微信公众号文章(
如何搜索微信最新公众号内容?怎样搜索方法/步骤)

很多朋友在查看最新的微信公众号文章时,通常都会使用搜索功能,那么如何搜索最新的微信公众号的内容呢?如何查询微信公众号文章的历史记录?道路数据将为您介绍。

如何搜索最新的微信公众号内容
如何搜索最新的微信公众号内容?
方法/步骤
打开浏览器,进入搜狗搜索首页,点击“更多”进入更多功能页面。
在输入框中输入你要搜索的关键词(这里以“百度体验”为例),点击“搜索”。
进入搜索结果显示页面。点击任意一个文章阅读相关内容。
进入文字页面,可以看到发文的公众号文章。
微信公众号历史文章如何搜索
方法/步骤
首先,找到您要搜索的公众号并输入。进入后,部分公众号下方有对应的文章历史记录,可点击进入。
除此之外,还可以点击右上角的人形logo进入公众号历史后台文章。
进入后台后会看到文章最近几期的内容,不过这些对我们来说还不够,点击下拉找到全部信息,点击进入全部信息界面。
进入所有历史信息的界面,整个界面往下拉,然后顶部会出现一个搜索框。
这个搜索框可以搜索到这个文章里面的历史文章,点击搜索进入搜索界面。
例如在搜索界面输入“HPV”,之后出现的界面就是本公众号文章中关于HPV的全部文章。

如何搜索最新的微信公众号内容
如何搜索最新的微信公众号内容?微信公众号文章搜索
搜索所有公众号内容
在手机上打开微信,点击右上角的加号,选择【添加好友】,在打开的“添加好友”页面点击搜索框。
在搜索框中搜索关键词,就会出现带有这个关键词的内容。在搜索结果中选择“文章”,微信公众号文章将被过滤掉。搜索结果。
在搜索结果中,您还可以根据不同的条件进行筛选,按照不同的顺序进行排序,从而更快、更准确地找到您需要的内容。
搜索指定公众号文章
querylist采集微信公众号文章(Python微信公众号文章文章爬取的示例代码一.思路)
采集交流 • 优采云 发表了文章 • 0 个评论 • 446 次浏览 • 2022-01-13 16:12
Python微信公众号文章爬取示例代码
一.想法
我们通过微信公众平台网页版图文消息中的超链接获取我们需要的界面
从界面中我们可以得到对应的微信公众号和所有对应的微信公众号文章。
二.界面分析
获取微信公众号界面:
范围:
行动=search_biz
开始=0
计数=5
query=公众号
token = 每个账户对应的token值
lang=zh_CN
f=json
阿贾克斯=1
请求方法:
得到
所以在这个界面中,我们只需要获取token,查询的是你需要搜索的公众号,登录后可以通过网页链接获取token。
获取公众号对应的文章接口:
范围:
行动=list_ex
开始=0
计数=5
fakeid=MjM5NDAwMTA2MA==
类型=9
查询=
令牌=557131216
lang=zh_CN
f=json
阿贾克斯=1
请求方法:
得到
在这个接口中,我们需要获取的值是上一步的token和fakeid,而这个fakeid可以在第一个接口中获取。这样我们就可以得到微信公众号文章的数据了。
三.实现
第一步:
首先我们需要通过selenium来模拟登录,然后获取cookie和对应的token
def weChat_login(user, password):
post = {}
browser = webdriver.Chrome()
browser.get('https://mp.weixin.qq.com/')
sleep(3)
browser.delete_all_cookies()
sleep(2)
# 点击切换到账号密码输入
browser.find_element_by_xpath("//a[@class='login__type__container__select-type']").click()
sleep(2)
# 模拟用户点击
input_user = browser.find_element_by_xpath("//input[@name='account']")
input_user.send_keys(user)
input_password = browser.find_element_by_xpath("//input[@name='password']")
input_password.send_keys(password)
sleep(2)
# 点击登录
browser.find_element_by_xpath("//a[@class='btn_login']").click()
sleep(2)
# 微信登录验证
print('请扫描二维码')
sleep(20)
# 刷新当前网页
browser.get('https://mp.weixin.qq.com/')
sleep(5)
# 获取当前网页链接
url = browser.current_url
# 获取当前cookie
cookies = browser.get_cookies()
for item in cookies:
post[item['name']] = item['value']
# 转换为字符串
cookie_str = json.dumps(post)
# 存储到本地
with open('cookie.txt', 'w+', encoding='utf-8') as f:
f.write(cookie_str)
print('cookie保存到本地成功')
# 对当前网页链接进行切片,获取到token
paramList = url.strip().split('?')[1].split('&')
# 定义一个字典存储数据
paramdict = {}
for item in paramList:
paramdict[item.split('=')[0]] = item.split('=')[1]
# 返回token
return paramdict['token']
定义了一个登录方法,其中的参数是登录账号和密码,然后定义了一个字典来存储cookie的值。模拟用户输入对应的账号密码,点击登录,会出现扫码验证,登录微信即可扫码。
刷新当前网页后,获取当前cookie和token并返回。
第2步:
1.请求获取对应的公众号接口,获取我们需要的fakeid
url = 'https://mp.weixin.qq.com'
headers = {
'HOST': 'mp.weixin.qq.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63'
}
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
resp = requests.get(url=url, headers=headers, cookies=cookies)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
params = {
'action': 'search_biz',
'begin': '0',
'count': '5',
'query': '搜索的公众号名称',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)
传入我们获取的token和cookie,然后通过requests.get请求获取微信公众号返回的json数据
lists = search_resp.json().get('list')[0]
通过以上代码可以获取对应的公众号数据
fakeid = lists.get('fakeid')
通过上面的代码,可以得到对应的 fakeid
2.请求访问微信公众号文章接口,获取我们需要的文章数据
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
params_data = {
'action': 'list_ex',
'begin': '0',
'count': '5',
'fakeid': fakeid,
'type': '9',
'query': '',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)
我们传入 fakeid 和 token 然后调用 requests.get 请求接口获取返回的 json 数据。
我们实现了微信公众号文章的爬取。
四.总结
通过爬取微信公众号文章,需要掌握selenium和requests的用法,以及如何获取request接口。但是需要注意的是,我们在循环获取文章的时候,一定要设置延迟时间,否则容易被封号,获取不到返回的数据。
至此,这篇关于Python微信公众号文章爬取示例代码的文章文章就介绍到这里了。更多相关Python微信公众号文章爬取内容,请搜索我们之前的文章或继续浏览下方相关文章,希望大家以后多多支持!
时间:2020-11-27
基于Python采集爬取微信公众号历史数据
鲲之鹏技术人员将在本文中通过模拟微信App的操作,介绍一种采集指定公众号所有历史数据的方法。通过我们的抓包分析,我们发现微信公众号的历史数据是通过HTTP协议加载的,对应的API接口如下图所示,关键参数有四个(__biz.appmsg_token.pass_ticket和饼干)。为了获取这四个参数,我们需要模拟运行App,让它生成这些参数,然后我们抓包获取。对于模拟App操作,我们之前已经介绍过通过Python模拟Android App的方法(详见详情)。
python爬取微信公众号文章的方法
最近在学习Python3网络爬虫(崔庆才写的)的开发实践,刚刚得知他在这里使用代理爬取了公众号文章,但是根据他的代码,还是出现了一些问题。我在这里用过这本书。对本书前面提到的一些内容进行了改进。(作者半年前写的这段代码,腾讯的网站半年前更新了)我直接加下面代码:TIMEOUT = 20 from requests import Request, Session, PreparedRequest import requests from selenium import webdrive
Python如何爬取微信公众号文章及评论(基于Fiddler抓包分析)
背景描述我觉得微信公众号是比较难爬的平台之一,但是经过一番折腾,还是有一点小收获。没用Scrapy(估计爬太快有防爬限制),不过后面会开始整理写一些实战。. 简单介绍一下本次的开发环境:python3请求psycopg2(操作postgres数据库)抓包分析本次实战对公众号的抓包没有限制,但是每次抓包前都要对不同的公众号进行分析。打开Fiddler,在手机上配置相关代理。为了避免过多干扰,这里给Fiddler一个过滤规则,指定微信域名即可:
python selenium爬取微信公众号文章代码详解
参考:selenium webdriver 添加cookies: 需求:想看微信公众号文章的历史,但是每次都找地方不方便。思路:1.使用selenium打开微信公众号历史文章,滚动刷新到底部,获取所有历史文章url。2.遍历 url 并下载到本地。实现1.打开微信客户端,点击A微信公众号->进入公众号->打开历史文章链接(用浏览器打开),通过开发者工具获取cookie
Python爬取指定微信公众号文章
本文示例分享了python爬取微信公众号文章的具体代码,供大家参考。具体内容如下。该方法是依靠 urllib2 库完成的。首先需要安装你的python环境,然后安装urllib2库程序的启动方法(返回值为公众号文章的列表): def openUrl(): print("启动爬虫,打开搜狗搜索微信界面") # 加载页面url = ';s_from=input&query = 被抓取的公众号名称
Python爬取微信公众号文章
本文示例分享python爬取微信公众号文章的具体代码供大家参考,具体内容如下# -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup from requests .exceptions import RequestException import time import random import MySQLdb import threading import socket import math soc
Python爬虫_微信公众号推送信息爬取示例
问题描述 使用搜狗微信搜索抓取指定公众号的最新推送,并将对应网页保存到本地。注意,搜狗微信获取的地址是临时链接,具有时效性。公众号为动态网页(JavaScript渲染),使用requests.get()获取的内容不收录推送消息。这里使用 selenium+PhantomJS 处理代码#!/usr/bin/env python3 from selenium import webdriver from datetime import datetime import bs4, requ
Python使用webdriver爬取微信公众号
本文示例分享了python使用webdriver爬取微信公众号的具体代码,供大家参考。具体内容如下# -*- 编码:utf-8 -*- from selenium import webdriver import time import json import requests import re import random #微信公众号user="" #公众号密码password="" #设置需要爬取的公众号列表 gzlist=['香河微服务
Python抓取微信公众号账号信息的方法
搜狗微信搜索提供了两种关键词搜索,一种是搜索公众号文章的内容,另一种是直接搜索微信公众号。公众号基本信息可通过微信公众号搜索获取。还有最近发布的10个文章,今天就来抢微信公众号的账号信息爬虫吧。首先通过首页进入,可以按类别抓取,通过“查看更多”可以找到页面链接规则: import requests as req import re reTypes = r'id="pc_\d*" uigs=" (pc_\d*)">([\s\S]*?)&
一种使用python itchat包爬取微信好友头像形成矩形头像集的方法
初学者学python,一定要干点有趣的事!让我们从微信开始吧!头像采集示例如下: 可以发朋友圈开始鉴定大赛哈哈~ 废话不多说,直接上代码,我写了很多评论,大家应该都能看懂 import itchat import os import PIL .Image as Image from os import listdir import math import sys print("请进入查询模式:0-显示所有好友头像,但最终矩形头像集的最后一行可能不完整:1-头像集是一个完整的矩形,但朋友可能不完整,即在0模式下被丢弃
微信公众号Java批量获取方法详解
最近需要爬取微信公众号的文章信息。网上搜了一下,发现微信公众号爬取的难点在于公众号文章的链接在PC端打不开,所以用微信自带的浏览器(只能在PC端打开)得到微信客户端补充的参数后的其他平台),给爬虫带来了很大的麻烦。后来看到一个大牛在知乎上用php写的微信公众号爬取程序按照大佬的思路整理成java。改造过程中有很多细节问题,我就分享一下。系统的基本思路是在安卓模拟器上运行微信,模拟器设置代理,通过代理服务器截取微信数据,并将获取的数据发送给自己的程序进行处理。准备环境:node 查看全部
querylist采集微信公众号文章(Python微信公众号文章文章爬取的示例代码一.思路)
Python微信公众号文章爬取示例代码
一.想法
我们通过微信公众平台网页版图文消息中的超链接获取我们需要的界面


从界面中我们可以得到对应的微信公众号和所有对应的微信公众号文章。
二.界面分析
获取微信公众号界面:
范围:
行动=search_biz
开始=0
计数=5
query=公众号
token = 每个账户对应的token值
lang=zh_CN
f=json
阿贾克斯=1
请求方法:
得到
所以在这个界面中,我们只需要获取token,查询的是你需要搜索的公众号,登录后可以通过网页链接获取token。

获取公众号对应的文章接口:
范围:
行动=list_ex
开始=0
计数=5
fakeid=MjM5NDAwMTA2MA==
类型=9
查询=
令牌=557131216
lang=zh_CN
f=json
阿贾克斯=1
请求方法:
得到
在这个接口中,我们需要获取的值是上一步的token和fakeid,而这个fakeid可以在第一个接口中获取。这样我们就可以得到微信公众号文章的数据了。

三.实现
第一步:
首先我们需要通过selenium来模拟登录,然后获取cookie和对应的token
def weChat_login(user, password):
post = {}
browser = webdriver.Chrome()
browser.get('https://mp.weixin.qq.com/')
sleep(3)
browser.delete_all_cookies()
sleep(2)
# 点击切换到账号密码输入
browser.find_element_by_xpath("//a[@class='login__type__container__select-type']").click()
sleep(2)
# 模拟用户点击
input_user = browser.find_element_by_xpath("//input[@name='account']")
input_user.send_keys(user)
input_password = browser.find_element_by_xpath("//input[@name='password']")
input_password.send_keys(password)
sleep(2)
# 点击登录
browser.find_element_by_xpath("//a[@class='btn_login']").click()
sleep(2)
# 微信登录验证
print('请扫描二维码')
sleep(20)
# 刷新当前网页
browser.get('https://mp.weixin.qq.com/')
sleep(5)
# 获取当前网页链接
url = browser.current_url
# 获取当前cookie
cookies = browser.get_cookies()
for item in cookies:
post[item['name']] = item['value']
# 转换为字符串
cookie_str = json.dumps(post)
# 存储到本地
with open('cookie.txt', 'w+', encoding='utf-8') as f:
f.write(cookie_str)
print('cookie保存到本地成功')
# 对当前网页链接进行切片,获取到token
paramList = url.strip().split('?')[1].split('&')
# 定义一个字典存储数据
paramdict = {}
for item in paramList:
paramdict[item.split('=')[0]] = item.split('=')[1]
# 返回token
return paramdict['token']
定义了一个登录方法,其中的参数是登录账号和密码,然后定义了一个字典来存储cookie的值。模拟用户输入对应的账号密码,点击登录,会出现扫码验证,登录微信即可扫码。
刷新当前网页后,获取当前cookie和token并返回。
第2步:
1.请求获取对应的公众号接口,获取我们需要的fakeid
url = 'https://mp.weixin.qq.com'
headers = {
'HOST': 'mp.weixin.qq.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63'
}
with open('cookie.txt', 'r', encoding='utf-8') as f:
cookie = f.read()
cookies = json.loads(cookie)
resp = requests.get(url=url, headers=headers, cookies=cookies)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
params = {
'action': 'search_biz',
'begin': '0',
'count': '5',
'query': '搜索的公众号名称',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)
传入我们获取的token和cookie,然后通过requests.get请求获取微信公众号返回的json数据
lists = search_resp.json().get('list')[0]
通过以上代码可以获取对应的公众号数据
fakeid = lists.get('fakeid')
通过上面的代码,可以得到对应的 fakeid
2.请求访问微信公众号文章接口,获取我们需要的文章数据
appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
params_data = {
'action': 'list_ex',
'begin': '0',
'count': '5',
'fakeid': fakeid,
'type': '9',
'query': '',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)
我们传入 fakeid 和 token 然后调用 requests.get 请求接口获取返回的 json 数据。
我们实现了微信公众号文章的爬取。
四.总结
通过爬取微信公众号文章,需要掌握selenium和requests的用法,以及如何获取request接口。但是需要注意的是,我们在循环获取文章的时候,一定要设置延迟时间,否则容易被封号,获取不到返回的数据。
至此,这篇关于Python微信公众号文章爬取示例代码的文章文章就介绍到这里了。更多相关Python微信公众号文章爬取内容,请搜索我们之前的文章或继续浏览下方相关文章,希望大家以后多多支持!
时间:2020-11-27
基于Python采集爬取微信公众号历史数据
鲲之鹏技术人员将在本文中通过模拟微信App的操作,介绍一种采集指定公众号所有历史数据的方法。通过我们的抓包分析,我们发现微信公众号的历史数据是通过HTTP协议加载的,对应的API接口如下图所示,关键参数有四个(__biz.appmsg_token.pass_ticket和饼干)。为了获取这四个参数,我们需要模拟运行App,让它生成这些参数,然后我们抓包获取。对于模拟App操作,我们之前已经介绍过通过Python模拟Android App的方法(详见详情)。
python爬取微信公众号文章的方法
最近在学习Python3网络爬虫(崔庆才写的)的开发实践,刚刚得知他在这里使用代理爬取了公众号文章,但是根据他的代码,还是出现了一些问题。我在这里用过这本书。对本书前面提到的一些内容进行了改进。(作者半年前写的这段代码,腾讯的网站半年前更新了)我直接加下面代码:TIMEOUT = 20 from requests import Request, Session, PreparedRequest import requests from selenium import webdrive
Python如何爬取微信公众号文章及评论(基于Fiddler抓包分析)

背景描述我觉得微信公众号是比较难爬的平台之一,但是经过一番折腾,还是有一点小收获。没用Scrapy(估计爬太快有防爬限制),不过后面会开始整理写一些实战。. 简单介绍一下本次的开发环境:python3请求psycopg2(操作postgres数据库)抓包分析本次实战对公众号的抓包没有限制,但是每次抓包前都要对不同的公众号进行分析。打开Fiddler,在手机上配置相关代理。为了避免过多干扰,这里给Fiddler一个过滤规则,指定微信域名即可:
python selenium爬取微信公众号文章代码详解
参考:selenium webdriver 添加cookies: 需求:想看微信公众号文章的历史,但是每次都找地方不方便。思路:1.使用selenium打开微信公众号历史文章,滚动刷新到底部,获取所有历史文章url。2.遍历 url 并下载到本地。实现1.打开微信客户端,点击A微信公众号->进入公众号->打开历史文章链接(用浏览器打开),通过开发者工具获取cookie
Python爬取指定微信公众号文章
本文示例分享了python爬取微信公众号文章的具体代码,供大家参考。具体内容如下。该方法是依靠 urllib2 库完成的。首先需要安装你的python环境,然后安装urllib2库程序的启动方法(返回值为公众号文章的列表): def openUrl(): print("启动爬虫,打开搜狗搜索微信界面") # 加载页面url = ';s_from=input&query = 被抓取的公众号名称
Python爬取微信公众号文章
本文示例分享python爬取微信公众号文章的具体代码供大家参考,具体内容如下# -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup from requests .exceptions import RequestException import time import random import MySQLdb import threading import socket import math soc
Python爬虫_微信公众号推送信息爬取示例

问题描述 使用搜狗微信搜索抓取指定公众号的最新推送,并将对应网页保存到本地。注意,搜狗微信获取的地址是临时链接,具有时效性。公众号为动态网页(JavaScript渲染),使用requests.get()获取的内容不收录推送消息。这里使用 selenium+PhantomJS 处理代码#!/usr/bin/env python3 from selenium import webdriver from datetime import datetime import bs4, requ
Python使用webdriver爬取微信公众号
本文示例分享了python使用webdriver爬取微信公众号的具体代码,供大家参考。具体内容如下# -*- 编码:utf-8 -*- from selenium import webdriver import time import json import requests import re import random #微信公众号user="" #公众号密码password="" #设置需要爬取的公众号列表 gzlist=['香河微服务
Python抓取微信公众号账号信息的方法
搜狗微信搜索提供了两种关键词搜索,一种是搜索公众号文章的内容,另一种是直接搜索微信公众号。公众号基本信息可通过微信公众号搜索获取。还有最近发布的10个文章,今天就来抢微信公众号的账号信息爬虫吧。首先通过首页进入,可以按类别抓取,通过“查看更多”可以找到页面链接规则: import requests as req import re reTypes = r'id="pc_\d*" uigs=" (pc_\d*)">([\s\S]*?)&
一种使用python itchat包爬取微信好友头像形成矩形头像集的方法
初学者学python,一定要干点有趣的事!让我们从微信开始吧!头像采集示例如下: 可以发朋友圈开始鉴定大赛哈哈~ 废话不多说,直接上代码,我写了很多评论,大家应该都能看懂 import itchat import os import PIL .Image as Image from os import listdir import math import sys print("请进入查询模式:0-显示所有好友头像,但最终矩形头像集的最后一行可能不完整:1-头像集是一个完整的矩形,但朋友可能不完整,即在0模式下被丢弃
微信公众号Java批量获取方法详解

最近需要爬取微信公众号的文章信息。网上搜了一下,发现微信公众号爬取的难点在于公众号文章的链接在PC端打不开,所以用微信自带的浏览器(只能在PC端打开)得到微信客户端补充的参数后的其他平台),给爬虫带来了很大的麻烦。后来看到一个大牛在知乎上用php写的微信公众号爬取程序按照大佬的思路整理成java。改造过程中有很多细节问题,我就分享一下。系统的基本思路是在安卓模拟器上运行微信,模拟器设置代理,通过代理服务器截取微信数据,并将获取的数据发送给自己的程序进行处理。准备环境:node
querylist采集微信公众号文章(微信公众号采集二级目录生成工具是一款第三版巧妙伪原创来袭 )
采集交流 • 优采云 发表了文章 • 0 个评论 • 125 次浏览 • 2022-01-12 08:05
)
微信公众号采集二级目录生成工具第三版聪明伪原创来了】微信公众号采集+聪明伪原创+多cms版,这个软件可以批量伪原创,然后批量伪原创检查,非常值得注意,请先在本地环境测试,本软件不能自动编码。
软件说明
1.本软件的功能:
适合优采云站长,也适合支持站内做站群的人
2.运行过程:
采集微信文章,然后伪原创点击这些文章,然后更新到网站。整个过程是全自动的。无需打开后台,通过数据库发送。因此,需要生成静态页面。
3.与上一版本对比:和之前一样,微信公众号在文章采集和采集之后使用了伪原创。不知道这算不算伪原创,但确实达到了伪原创的效果,
这个新版本伪原创的玩法很巧妙,就是翻译,先中文转英文,再英文转中文。可惜一天翻译量有限,可以自己换IP解决。(其实不适合更新太多,一天发几篇就OK了,一般如果是老网站的话。关键词可以很快排名)
如何使用
不建议新手站长使用,因为这个软件是用来偷懒的,新手最好不要偷懒。而且,重点是怕新手不懂概念,遇到问题也解决不了。然后来找我。我也很无能为力,我也是鸡。简单的问题我不想回答。我不会复杂的。
我不希望大家停止问我,但我希望大家从百度开始,不要再问了。有时候同一个问题可能被问了很多遍,我就会发脾气。我就是这样的人,请不要冒犯。还是希望能和大家一起进步。
查看全部
querylist采集微信公众号文章(微信公众号采集二级目录生成工具是一款第三版巧妙伪原创来袭
)
微信公众号采集二级目录生成工具第三版聪明伪原创来了】微信公众号采集+聪明伪原创+多cms版,这个软件可以批量伪原创,然后批量伪原创检查,非常值得注意,请先在本地环境测试,本软件不能自动编码。
软件说明
1.本软件的功能:
适合优采云站长,也适合支持站内做站群的人
2.运行过程:
采集微信文章,然后伪原创点击这些文章,然后更新到网站。整个过程是全自动的。无需打开后台,通过数据库发送。因此,需要生成静态页面。
3.与上一版本对比:和之前一样,微信公众号在文章采集和采集之后使用了伪原创。不知道这算不算伪原创,但确实达到了伪原创的效果,
这个新版本伪原创的玩法很巧妙,就是翻译,先中文转英文,再英文转中文。可惜一天翻译量有限,可以自己换IP解决。(其实不适合更新太多,一天发几篇就OK了,一般如果是老网站的话。关键词可以很快排名)
如何使用
不建议新手站长使用,因为这个软件是用来偷懒的,新手最好不要偷懒。而且,重点是怕新手不懂概念,遇到问题也解决不了。然后来找我。我也很无能为力,我也是鸡。简单的问题我不想回答。我不会复杂的。
我不希望大家停止问我,但我希望大家从百度开始,不要再问了。有时候同一个问题可能被问了很多遍,我就会发脾气。我就是这样的人,请不要冒犯。还是希望能和大家一起进步。

querylist采集微信公众号文章(糗事百科的几种方法,你都知道吗?!)
采集交流 • 优采云 发表了文章 • 0 个评论 • 97 次浏览 • 2022-01-12 06:05
querylist采集微信公众号文章等信息,也有支持api形式的querylist,比如,糗事百科之前引入了通讯录的关注查询功能,是基于querylist和api进行定制开发的。缺点是,需要使用js实现url分析、分词及文章列表返回。另外,糗事百科的支持发送链接时,文章列表不会变化。(反正糗事百科的querylist的名字就是他们自己起的)[糗事百科querylist](),目前糗事百科还没有引入正则表达式,这个空白是否用正则表达式实现都是未知数。
目前糗事百科支持个人的关注消息以及对应的项目和网站进行分析,对于其他平台的信息还是需要通过爬虫工具爬取,而后对应querylist。
糗事百科的信息分为发布平台、各种类型的公众号文章,还有微信公众号的文章列表信息。
以糗事百科为例,糗事百科是目前国内最大的发布平台,并且存在大量的原创内容,此外还支持api接口,你可以看一下,个人建议api应该更加靠谱一些,更加方便。
糗事都倒闭了,人家做querylist的干嘛去了,然后被查了!目前我了解到的糗事百科做的还不错的除了糗事历史记录还有打开设备,删帖时间等等。
我也是对糗事百科的其他栏目感兴趣,比如糗事玩乐,糗事笑话,还有种子搜索的信息。我是从糗事百科的公众号里看到的,其他没有详细看。
1、糗事密室经常有新怪人互怼的,这是我喜欢的一个玩法,
2、糗事运转博览每日都会发图文消息,
3、糗事集合经常有公司营销信息,
4、糗事校园糗事百科还有糗事校园有自己的校园班级、单位、公司等集中展示区的聚合页
5、关注和赞赏其实来说糗事百科也是一个轻博客式的网站,可以让读者对公司产品等进行赞赏。关注和赞赏的方式也有好几种,比如用户发送消息,你的朋友或者发一条评论,其他用户点赞就行了。不过看了一下并不是所有的用户都有赞赏的权限,官方说是鼓励用户发钱来感谢商家的文章。但是目前看到并没有好玩的活动和送钱这种方式,社区应该有更好的活动形式来进行内容建设和信息交流,比如通过用户进行互动活动之类的。看到新版还加入了时事的功能,如果大家都关注时事的话这个网站还有存在价值吗?。
6、游戏行情这个功能个人还在挖掘中。看了一下页面比较简单,
7、招聘聊天这个功能和招聘行业有关,
8、营销软件行业这个栏目应该不会放很多二维码吧! 查看全部
querylist采集微信公众号文章(糗事百科的几种方法,你都知道吗?!)
querylist采集微信公众号文章等信息,也有支持api形式的querylist,比如,糗事百科之前引入了通讯录的关注查询功能,是基于querylist和api进行定制开发的。缺点是,需要使用js实现url分析、分词及文章列表返回。另外,糗事百科的支持发送链接时,文章列表不会变化。(反正糗事百科的querylist的名字就是他们自己起的)[糗事百科querylist](),目前糗事百科还没有引入正则表达式,这个空白是否用正则表达式实现都是未知数。
目前糗事百科支持个人的关注消息以及对应的项目和网站进行分析,对于其他平台的信息还是需要通过爬虫工具爬取,而后对应querylist。
糗事百科的信息分为发布平台、各种类型的公众号文章,还有微信公众号的文章列表信息。
以糗事百科为例,糗事百科是目前国内最大的发布平台,并且存在大量的原创内容,此外还支持api接口,你可以看一下,个人建议api应该更加靠谱一些,更加方便。
糗事都倒闭了,人家做querylist的干嘛去了,然后被查了!目前我了解到的糗事百科做的还不错的除了糗事历史记录还有打开设备,删帖时间等等。
我也是对糗事百科的其他栏目感兴趣,比如糗事玩乐,糗事笑话,还有种子搜索的信息。我是从糗事百科的公众号里看到的,其他没有详细看。
1、糗事密室经常有新怪人互怼的,这是我喜欢的一个玩法,
2、糗事运转博览每日都会发图文消息,
3、糗事集合经常有公司营销信息,
4、糗事校园糗事百科还有糗事校园有自己的校园班级、单位、公司等集中展示区的聚合页
5、关注和赞赏其实来说糗事百科也是一个轻博客式的网站,可以让读者对公司产品等进行赞赏。关注和赞赏的方式也有好几种,比如用户发送消息,你的朋友或者发一条评论,其他用户点赞就行了。不过看了一下并不是所有的用户都有赞赏的权限,官方说是鼓励用户发钱来感谢商家的文章。但是目前看到并没有好玩的活动和送钱这种方式,社区应该有更好的活动形式来进行内容建设和信息交流,比如通过用户进行互动活动之类的。看到新版还加入了时事的功能,如果大家都关注时事的话这个网站还有存在价值吗?。
6、游戏行情这个功能个人还在挖掘中。看了一下页面比较简单,
7、招聘聊天这个功能和招聘行业有关,
8、营销软件行业这个栏目应该不会放很多二维码吧!
querylist采集微信公众号文章(本文来自:前端开发者《》链接(图))
采集交流 • 优采云 发表了文章 • 0 个评论 • 150 次浏览 • 2022-01-10 11:16
之前自己维护了一个公众号,但是因为个人关系,很久没有更新了。今天来缅怀一下,偶然发现了一个获取微信公众号文章的方法。
之前的获取方式有很多。可以通过搜狗、青博、网页、客户端等方式使用,这个可能不如其他的好,但是操作简单易懂。
所以,首先你需要有一个微信公众平台的账号
微信公众平台:
登录后进入首页,点击新建群发。
选择自创图形:
好像是公众号运营教学
进入编辑页面后,单击超链接
弹出选择框,我们在框中输入对应的公众号名称,就会出现对应的文章列表。
可以打开控制台查看请求的界面,这不奇怪吗
打开响应,也就是我们需要的 文章 链接
确定数据后,我们需要对接口进行分析。
感觉很简单,一个GET请求,携带一些参数。
fakeid 是公众号的唯一 ID,所以如果要直接通过名称获取 文章 的列表,则需要先获取 fakeid。
当我们输入公众号名称时,点击搜索。可以看到触发了搜索界面,返回了fakeid。
这个接口不需要很多参数。
接下来,我们可以使用代码来模拟上述操作。
但是,也有必要使用现有的 cookie 来避免登录。
当前的cookie过期日期,我没有测试过。可能需要不时更新 cookie。
测试代码:
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
这样可以获取最新的10篇文章文章,如果想获取更多历史文章,可以修改data中的“begin”参数,0为第一页,5为第一页第二页,10 是第三页(依此类推)
但如果你想大规模刮:
请为自己安排一个稳定的代理,降低爬虫速度,并准备好多个账号,以减少被封号的可能性。
以上就是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持前端开发者。
» 本文来自:前端开发者 » 《通过微信公众平台获取公众号文章的方法示例_跑到_前端开发者》
» 本文链接: 查看全部
querylist采集微信公众号文章(本文来自:前端开发者《》链接(图))
之前自己维护了一个公众号,但是因为个人关系,很久没有更新了。今天来缅怀一下,偶然发现了一个获取微信公众号文章的方法。
之前的获取方式有很多。可以通过搜狗、青博、网页、客户端等方式使用,这个可能不如其他的好,但是操作简单易懂。
所以,首先你需要有一个微信公众平台的账号
微信公众平台:

登录后进入首页,点击新建群发。

选择自创图形:

好像是公众号运营教学
进入编辑页面后,单击超链接

弹出选择框,我们在框中输入对应的公众号名称,就会出现对应的文章列表。

可以打开控制台查看请求的界面,这不奇怪吗

打开响应,也就是我们需要的 文章 链接

确定数据后,我们需要对接口进行分析。
感觉很简单,一个GET请求,携带一些参数。

fakeid 是公众号的唯一 ID,所以如果要直接通过名称获取 文章 的列表,则需要先获取 fakeid。
当我们输入公众号名称时,点击搜索。可以看到触发了搜索界面,返回了fakeid。

这个接口不需要很多参数。

接下来,我们可以使用代码来模拟上述操作。
但是,也有必要使用现有的 cookie 来避免登录。

当前的cookie过期日期,我没有测试过。可能需要不时更新 cookie。
测试代码:
import requests
import json
Cookie = '请换上自己的Cookie,获取方法:直接复制下来'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公众号名字:可自定义
token = '你的token' # 获取方法:如上述 直接复制下来
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
这样可以获取最新的10篇文章文章,如果想获取更多历史文章,可以修改data中的“begin”参数,0为第一页,5为第一页第二页,10 是第三页(依此类推)
但如果你想大规模刮:
请为自己安排一个稳定的代理,降低爬虫速度,并准备好多个账号,以减少被封号的可能性。
以上就是本文的全部内容。希望对大家的学习有所帮助,也希望大家多多支持前端开发者。
» 本文来自:前端开发者 » 《通过微信公众平台获取公众号文章的方法示例_跑到_前端开发者》
» 本文链接:
querylist采集微信公众号文章(2018年7月20日更新:1.即刻APP(该方法已失效))
采集交流 • 优采云 发表了文章 • 0 个评论 • 144 次浏览 • 2022-01-10 11:16
2018 年 7 月 20 日更新
因为微广场是封闭的,我又写了一篇文章文章,看看这些方法能不能满足你的需求,文章的内容如下:
本文将为您介绍几种订阅微信公众号的绝佳方式。相信总有一款适合你(强烈推荐最后一种方法)。为了衡量这些方法的优缺点,我将使用以下三个公众号进行测试:
1. Instant APP(此方法已过期)
<p>在聚合应用程序中,我认为立即执行是最好的。我从2015年就开始用这个APP了,应该是第一批用户。从一开始只有一些手动筛选的主题,到现在用户可以自定义主题,功能越来越强大。在我之前的 查看全部
querylist采集微信公众号文章(2018年7月20日更新:1.即刻APP(该方法已失效))
2018 年 7 月 20 日更新
因为微广场是封闭的,我又写了一篇文章文章,看看这些方法能不能满足你的需求,文章的内容如下:
本文将为您介绍几种订阅微信公众号的绝佳方式。相信总有一款适合你(强烈推荐最后一种方法)。为了衡量这些方法的优缺点,我将使用以下三个公众号进行测试:
1. Instant APP(此方法已过期)
<p>在聚合应用程序中,我认为立即执行是最好的。我从2015年就开始用这个APP了,应该是第一批用户。从一开始只有一些手动筛选的主题,到现在用户可以自定义主题,功能越来越强大。在我之前的
querylist采集微信公众号文章(微信公众号文章的图片无法直接复制到WordPress中的应用)
采集交流 • 优采云 发表了文章 • 0 个评论 • 138 次浏览 • 2022-01-09 10:09
相信很多微信公众号作者(个人、组织、公司)不仅在微信公众平台上发文,通常文章会在多个平台上推送,比如今日头条、知乎栏目、简书等等,甚至还有自己的网站(官网),但是在多个平台上发布文章是一件非常耗时的工作。
大多数 网站 构建都基于 WordPress,因为该平台非常简单实用,并且有大量插件。因此,我也不例外。当我选择建站系统时,首先选择的是 WordPress。不过我经常写文章发现一个问题,就是每次在公众号写文章,我把文章@文章手动复制到WordPress上,复制文字没什么,但是复制图片会害死我,微信公众号文章的图片不能直接复制到WordPress,会显示为“无法显示。这张图片”,因为微信已对图片实施防盗链措施。
这时候我尝试搜索了这样一个插件,可以通过粘贴公众号文章的链接直接将内容导入WordPress,并将图片下载到本地(媒体库),我搜索到找到了一个叫Little Bee的插件。试了之后,感觉见面晚了。书籍,知乎栏目中的文章,还有多种丰富的可选功能,果断联系作者索要授权码。
使用起来也很简单,只要粘贴链接,就可以同时导入多个文章,也就是批量导入功能。
如果下载了,可以直接在安装插件页面搜索小蜜蜂就可以看到了。 查看全部
querylist采集微信公众号文章(微信公众号文章的图片无法直接复制到WordPress中的应用)
相信很多微信公众号作者(个人、组织、公司)不仅在微信公众平台上发文,通常文章会在多个平台上推送,比如今日头条、知乎栏目、简书等等,甚至还有自己的网站(官网),但是在多个平台上发布文章是一件非常耗时的工作。
大多数 网站 构建都基于 WordPress,因为该平台非常简单实用,并且有大量插件。因此,我也不例外。当我选择建站系统时,首先选择的是 WordPress。不过我经常写文章发现一个问题,就是每次在公众号写文章,我把文章@文章手动复制到WordPress上,复制文字没什么,但是复制图片会害死我,微信公众号文章的图片不能直接复制到WordPress,会显示为“无法显示。这张图片”,因为微信已对图片实施防盗链措施。
这时候我尝试搜索了这样一个插件,可以通过粘贴公众号文章的链接直接将内容导入WordPress,并将图片下载到本地(媒体库),我搜索到找到了一个叫Little Bee的插件。试了之后,感觉见面晚了。书籍,知乎栏目中的文章,还有多种丰富的可选功能,果断联系作者索要授权码。
使用起来也很简单,只要粘贴链接,就可以同时导入多个文章,也就是批量导入功能。
如果下载了,可以直接在安装插件页面搜索小蜜蜂就可以看到了。
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
采集交流 • 优采云 发表了文章 • 0 个评论 • 132 次浏览 • 2022-01-08 14:08
最近需要爬取微信公众号的文章信息。我在网上搜索,发现爬取微信公众号的难点在于公众号文章的链接在PC端打不开,所以需要使用微信自带的浏览器(获取参数微信客户端补充)可以在其他平台打开),给爬虫带来了很大的麻烦。后来在知乎上看到一个大牛用php写的微信公众号爬虫程序,直接按照大佬的思路做成了java。改造过程中遇到了很多细节和问题,就分享给大家。
附上大牛的链接文章:写php或者只需要爬取思路的可以直接看这个。这些想法写得很详细。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------
系统的基本思路是在Android模拟器上运行微信,在模拟器上设置代理,通过代理服务器截取微信数据,将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、安卓模拟器
Nodejs下载地址:我下载的是windows版本的,直接安装就好了。安装后直接运行 C:\Program Files\nodejs\npm.cmd 会自动配置环境。
anyproxy安装:按照上一步安装nodejs后,直接在cmd中运行npm install -g anyproxy即可安装
网上的安卓模拟器就好了,有很多。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------------------
首先安装代理服务器的证书。Anyproxy 默认不解析 https 链接。安装证书后,就可以解析了。在cmd中执行anyproxy --root安装证书,然后在模拟器中下载证书。
然后输入anyproxy -i 命令打开代理服务。(记得添加参数!)
记住这个ip和端口,那么安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用来显示http传输的数据。
点击上方红框中的菜单,会出现一个二维码。用安卓模拟器扫码识别。模拟器(手机)会下载证书并安装。
现在准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器的ip,端口为8001
准备工作到这里基本完成。在模拟器上打开微信,打开一个公众号的文章,就可以从刚刚打开的web界面看到anyproxy抓取的数据:
上图红框是微信文章的链接,点击查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果顶部清晰,您可以向下。
这里我们依靠代理服务来抓取微信数据,但是我们不能抓取一条数据自己操作微信,所以还是手动复制比较好。所以我们需要微信客户端自己跳转到页面。这时可以使用anyproxy拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下的文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫做replaceServerResDataAsync: function(req,res,serverResData,callback)。该方法负责对anyproxy获取的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚。顺着逻辑去理解就好,问题不大。
1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },
这是一个简短的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以向下滚动。向下滚动会触发js事件发送请求获取json数据(下一页的内容)。还有公众号文章的链接,以及文章的阅读和点赞链接(返回json数据)。这些环节的形式是固定的,可以通过逻辑判断加以区分。这里有个问题,如果历史页面需要一路爬取怎么办。我的想法是通过js模拟鼠标向下滑动,从而触发请求提交下一部分列表的加载。或者直接使用anyproxy分析下载请求,直接向微信服务器发出这个请求。但是有一个问题是如何判断没有剩余数据。我正在抓取最新数据。我暂时没有这个要求,但以后可能需要。如果需要,您可以尝试一下。 查看全部
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
最近需要爬取微信公众号的文章信息。我在网上搜索,发现爬取微信公众号的难点在于公众号文章的链接在PC端打不开,所以需要使用微信自带的浏览器(获取参数微信客户端补充)可以在其他平台打开),给爬虫带来了很大的麻烦。后来在知乎上看到一个大牛用php写的微信公众号爬虫程序,直接按照大佬的思路做成了java。改造过程中遇到了很多细节和问题,就分享给大家。
附上大牛的链接文章:写php或者只需要爬取思路的可以直接看这个。这些想法写得很详细。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------
系统的基本思路是在Android模拟器上运行微信,在模拟器上设置代理,通过代理服务器截取微信数据,将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、安卓模拟器
Nodejs下载地址:我下载的是windows版本的,直接安装就好了。安装后直接运行 C:\Program Files\nodejs\npm.cmd 会自动配置环境。
anyproxy安装:按照上一步安装nodejs后,直接在cmd中运行npm install -g anyproxy即可安装
网上的安卓模拟器就好了,有很多。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------------------
首先安装代理服务器的证书。Anyproxy 默认不解析 https 链接。安装证书后,就可以解析了。在cmd中执行anyproxy --root安装证书,然后在模拟器中下载证书。
然后输入anyproxy -i 命令打开代理服务。(记得添加参数!)

记住这个ip和端口,那么安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用来显示http传输的数据。

点击上方红框中的菜单,会出现一个二维码。用安卓模拟器扫码识别。模拟器(手机)会下载证书并安装。
现在准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器的ip,端口为8001

准备工作到这里基本完成。在模拟器上打开微信,打开一个公众号的文章,就可以从刚刚打开的web界面看到anyproxy抓取的数据:

上图红框是微信文章的链接,点击查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果顶部清晰,您可以向下。
这里我们依靠代理服务来抓取微信数据,但是我们不能抓取一条数据自己操作微信,所以还是手动复制比较好。所以我们需要微信客户端自己跳转到页面。这时可以使用anyproxy拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下的文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫做replaceServerResDataAsync: function(req,res,serverResData,callback)。该方法负责对anyproxy获取的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚。顺着逻辑去理解就好,问题不大。

1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },

这是一个简短的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以向下滚动。向下滚动会触发js事件发送请求获取json数据(下一页的内容)。还有公众号文章的链接,以及文章的阅读和点赞链接(返回json数据)。这些环节的形式是固定的,可以通过逻辑判断加以区分。这里有个问题,如果历史页面需要一路爬取怎么办。我的想法是通过js模拟鼠标向下滑动,从而触发请求提交下一部分列表的加载。或者直接使用anyproxy分析下载请求,直接向微信服务器发出这个请求。但是有一个问题是如何判断没有剩余数据。我正在抓取最新数据。我暂时没有这个要求,但以后可能需要。如果需要,您可以尝试一下。
querylist采集微信公众号文章(querylist中实现自动化采集2采集微信公众号文章的实现流程)
采集交流 • 优采云 发表了文章 • 0 个评论 • 123 次浏览 • 2022-01-08 01:02
querylist采集微信公众号文章,在python中实现自动化采集2采集微信公众号文章的实现流程1。获取微信公众号文章列表(list_pass_folds)、文章标题和文章描述采用fullurl函数2采集的数据格式3数据封装加载,检查数据规模4数据清洗分析python的相关工具包的使用:注意,在使用python自己的工具包以前,需要先安装pympi,pipinstallpympiimportpandasaspdimportcollectionsfromsklearn。metricsimportroc_auc_scoreasroc_auc_score#。 查看全部
querylist采集微信公众号文章(querylist中实现自动化采集2采集微信公众号文章的实现流程)
querylist采集微信公众号文章,在python中实现自动化采集2采集微信公众号文章的实现流程1。获取微信公众号文章列表(list_pass_folds)、文章标题和文章描述采用fullurl函数2采集的数据格式3数据封装加载,检查数据规模4数据清洗分析python的相关工具包的使用:注意,在使用python自己的工具包以前,需要先安装pympi,pipinstallpympiimportpandasaspdimportcollectionsfromsklearn。metricsimportroc_auc_scoreasroc_auc_score#。
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
采集交流 • 优采云 发表了文章 • 0 个评论 • 152 次浏览 • 2022-01-06 17:06
最近需要爬取微信公众号的文章信息。上网查了一下,发现微信公众号的难点是公众号文章的链接在PC端打不开。必须使用微信自带的浏览器(获取微信客户端的补充参数,才能在其他平台打开),给爬虫程序带来很大的麻烦。后来在知乎上看到一个大牛用php写的微信公众号爬虫程序,直接按照大牛的思路做了成java。改造过程中遇到了很多细节问题,分享给大家。
附上大牛文章的链接:写php或者只需要爬取思路的可以直接看这个,思路很详细。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------------
该系统的基本思想是在Android模拟器上运行微信,模拟器设置一个代理,通过代理服务器拦截微信数据,并将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、Android模拟器
nodejs下载地址:我下载的是windows版本的,直接安装就可以了。安装完成后,直接运行C:\Program Files\nodejs\npm.cmd 自动配置环境。
Anyproxy安装:上一步安装好nodejs后,在cmd中直接运行npm install -g anyproxy即可安装
网上随便跟着安卓模拟器就行了,很多。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------
首先安装代理服务器的证书。Anyproxy 默认不解析 https 链接。安装证书后即可解决。在 cmd 中执行 anyproxy --root 将安装证书。之后,您必须在模拟器上下载证书。
然后输入anyproxy -i 命令开启代理服务。(记得加参数!)
记住这个ip和端口,然后安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用于显示http传输数据。
点击上方红框中的菜单,会显示一个二维码。使用安卓模拟器扫码识别。模拟器(手机)将下载证书并安装它。
现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器的ip,端口为8001
至此,准备工作基本完成,在模拟器上打开微信,开通公众号文章,从刚刚打开的web界面就可以看到anyproxy抓取到的数据了:
上面红框里是微信文章的链接,点进去查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果一切顺利,你就可以下去了。
这里我们依靠代理服务来抓取微信数据,但不能随便抓取一条数据,自己操作微信。最好手动复制。所以我们需要微信客户端自己跳转到页面。这时候可以使用anyproxy来拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫做 replaceServerResDataAsync: function(req,res,serverResData,callback)。该方法负责对anyproxy获得的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚,按照逻辑来理解就好了,问题不大。
1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },
这里是一个简短的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以关闭。如果被拒绝,则会触发一个js事件,发送获取json数据(下一页内容)的请求。还有公众号文章的链接,以及文章的阅读量和喜欢的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断来区分。这里的问题是,如果所有的历史页面都需要爬取,怎么做。我的想法是模拟鼠标滑过js触发提交加载列表下一部分的请求。或者直接使用anyproxy来分析滑动加载的请求,并将请求直接发送到微信服务器。但是如何判断没有剩余数据一直存在问题。我正在抓取最新数据。我暂时没有这个需求,以后可能需要。有需要的可以试试。 查看全部
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
最近需要爬取微信公众号的文章信息。上网查了一下,发现微信公众号的难点是公众号文章的链接在PC端打不开。必须使用微信自带的浏览器(获取微信客户端的补充参数,才能在其他平台打开),给爬虫程序带来很大的麻烦。后来在知乎上看到一个大牛用php写的微信公众号爬虫程序,直接按照大牛的思路做了成java。改造过程中遇到了很多细节问题,分享给大家。
附上大牛文章的链接:写php或者只需要爬取思路的可以直接看这个,思路很详细。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------------
该系统的基本思想是在Android模拟器上运行微信,模拟器设置一个代理,通过代理服务器拦截微信数据,并将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、Android模拟器
nodejs下载地址:我下载的是windows版本的,直接安装就可以了。安装完成后,直接运行C:\Program Files\nodejs\npm.cmd 自动配置环境。
Anyproxy安装:上一步安装好nodejs后,在cmd中直接运行npm install -g anyproxy即可安装
网上随便跟着安卓模拟器就行了,很多。
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------
首先安装代理服务器的证书。Anyproxy 默认不解析 https 链接。安装证书后即可解决。在 cmd 中执行 anyproxy --root 将安装证书。之后,您必须在模拟器上下载证书。
然后输入anyproxy -i 命令开启代理服务。(记得加参数!)

记住这个ip和端口,然后安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用于显示http传输数据。

点击上方红框中的菜单,会显示一个二维码。使用安卓模拟器扫码识别。模拟器(手机)将下载证书并安装它。
现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器的ip,端口为8001

至此,准备工作基本完成,在模拟器上打开微信,开通公众号文章,从刚刚打开的web界面就可以看到anyproxy抓取到的数据了:

上面红框里是微信文章的链接,点进去查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果一切顺利,你就可以下去了。
这里我们依靠代理服务来抓取微信数据,但不能随便抓取一条数据,自己操作微信。最好手动复制。所以我们需要微信客户端自己跳转到页面。这时候可以使用anyproxy来拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫做 replaceServerResDataAsync: function(req,res,serverResData,callback)。该方法负责对anyproxy获得的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚,按照逻辑来理解就好了,问题不大。

1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },

这里是一个简短的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以关闭。如果被拒绝,则会触发一个js事件,发送获取json数据(下一页内容)的请求。还有公众号文章的链接,以及文章的阅读量和喜欢的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断来区分。这里的问题是,如果所有的历史页面都需要爬取,怎么做。我的想法是模拟鼠标滑过js触发提交加载列表下一部分的请求。或者直接使用anyproxy来分析滑动加载的请求,并将请求直接发送到微信服务器。但是如何判断没有剩余数据一直存在问题。我正在抓取最新数据。我暂时没有这个需求,以后可能需要。有需要的可以试试。
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
采集交流 • 优采云 发表了文章 • 0 个评论 • 130 次浏览 • 2022-01-04 06:16
最近需要爬取微信公众号的文章信息。上网查了一下,发现微信公众号的难点是公众号文章的链接在PC端打不开。必须使用微信自带的浏览器(获取微信客户端的补充参数,才能在其他平台打开),给爬虫程序带来很大的麻烦。后来在知乎上看到了一个大牛用php写的微信公众号爬虫程序,他按照大佬的思路直接做了java。改造过程中遇到了很多细节问题,分享给大家。
附上大牛的链接文章:写php或者只需要爬取思路的可以直接看这个。这些想法写得很详细。
----------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------
系统的基本思想是在安卓模拟器上运行微信。模拟器设置代理,通过代理服务器拦截微信数据,并将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、Android模拟器
nodejs下载地址:我下载的是windows版本的,直接下载安装就可以了。安装完成后直接运行C:\Program Files\nodejs\npm.cmd自动配置环境。
anyproxy安装:上一步安装好nodejs后,在cmd中直接运行npm install -g anyproxy就会安装
互联网上只有一个 Android 模拟器,很多。
----------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------------
首先安装代理服务器的证书。 Anyproxy 默认不解析 https 链接。安装证书后即可解决。在 cmd 中执行 anyproxy --root 将安装证书。之后,您必须在模拟器上下载证书。
然后输入anyproxy -i命令开启代理服务。 (记得加参数!)
记住这个ip和端口,然后安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用于展示http传输数据。
点击上方红框中的菜单,会显示一个二维码。使用安卓模拟器扫码识别。模拟器(手机)会下载证书并安装。
现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器ip,端口为8001
准备工作到此基本完成。在模拟器上打开微信,开通公众号文章。您可以从刚打开的网页界面看到 anyproxy 捕获的数据:
上面红框里是微信文章的链接,点进去查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果一切顺利,你就可以下去了。
这里我们依靠代理服务来抓取微信数据,但是我们不能抓取一条数据,只能自己操作微信。最好手动复制。所以我们需要微信客户端自己跳转到页面。这时候可以使用anyproxy来拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫replaceServerResDataAsync:function(req,res,serverResData,callback)。该方法负责对anyproxy获得的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚,按照逻辑来理解就好了,问题不大。
1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },
这里是一个简单的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以关闭。如果被拒绝,则会触发一个js事件,发送获取json数据(下一页内容)的请求。还有公众号文章的链接,以及文章的阅读量和喜欢的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断来区分。这里的问题是,如果所有的历史页面都需要爬取,怎么做。我的想法是模拟鼠标滑过js触发提交加载列表下一部分的请求。或者直接使用anyproxy分析滑动加载请求,直接将请求发送到微信服务器。但是如何判断没有剩余数据一直存在问题。我正在抓取最新数据。我暂时没有这个需求,以后可能需要。有需要的可以试试。 查看全部
querylist采集微信公众号文章(爬取大牛用微信公众号爬取程序的难点及解决办法)
最近需要爬取微信公众号的文章信息。上网查了一下,发现微信公众号的难点是公众号文章的链接在PC端打不开。必须使用微信自带的浏览器(获取微信客户端的补充参数,才能在其他平台打开),给爬虫程序带来很大的麻烦。后来在知乎上看到了一个大牛用php写的微信公众号爬虫程序,他按照大佬的思路直接做了java。改造过程中遇到了很多细节问题,分享给大家。
附上大牛的链接文章:写php或者只需要爬取思路的可以直接看这个。这些想法写得很详细。
----------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------
系统的基本思想是在安卓模拟器上运行微信。模拟器设置代理,通过代理服务器拦截微信数据,并将获取到的数据发送给自己的程序进行处理。
需要准备的环境:nodejs、anyproxy代理、Android模拟器
nodejs下载地址:我下载的是windows版本的,直接下载安装就可以了。安装完成后直接运行C:\Program Files\nodejs\npm.cmd自动配置环境。
anyproxy安装:上一步安装好nodejs后,在cmd中直接运行npm install -g anyproxy就会安装
互联网上只有一个 Android 模拟器,很多。
----------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------------
首先安装代理服务器的证书。 Anyproxy 默认不解析 https 链接。安装证书后即可解决。在 cmd 中执行 anyproxy --root 将安装证书。之后,您必须在模拟器上下载证书。
然后输入anyproxy -i命令开启代理服务。 (记得加参数!)

记住这个ip和端口,然后安卓模拟器的代理就会用到这个。现在用浏览器打开网页::8002/ 这是anyproxy的网页界面,用于展示http传输数据。

点击上方红框中的菜单,会显示一个二维码。使用安卓模拟器扫码识别。模拟器(手机)会下载证书并安装。
现在我们准备为模拟器设置代理,代理模式设置为手动,代理ip为运行anyproxy的机器ip,端口为8001

准备工作到此基本完成。在模拟器上打开微信,开通公众号文章。您可以从刚打开的网页界面看到 anyproxy 捕获的数据:

上面红框里是微信文章的链接,点进去查看具体数据。如果响应正文中没有任何内容,则可能是证书安装有问题。
如果一切顺利,你就可以下去了。
这里我们依靠代理服务来抓取微信数据,但是我们不能抓取一条数据,只能自己操作微信。最好手动复制。所以我们需要微信客户端自己跳转到页面。这时候可以使用anyproxy来拦截微信服务器返回的数据,将页面跳转代码注入其中,然后将处理后的数据返回给模拟器,实现微信客户端的自动跳转。
在anyproxy中打开一个名为rule_default.js的js文件,windows下文件为:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
文件中有一个方法叫replaceServerResDataAsync:function(req,res,serverResData,callback)。该方法负责对anyproxy获得的数据进行各种操作。开头应该只有 callback(serverResData) ;该语句的意思是直接将服务器响应数据返回给客户端。直接把这条语句删掉,换成下面大牛写的代码。这里的代码我没有做任何改动,里面的注释也解释的很清楚,按照逻辑来理解就好了,问题不大。

1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
3 //console.log("开始第一种页面爬取");
4 if(serverResData.toString() !== ""){
5 6 try {//防止报错退出程序
7 var reg = /msgList = (.*?);/;//定义历史消息正则匹配规则
8 var ret = reg.exec(serverResData.toString());//转换变量为string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
14 })
15 });
16 }catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
17 //console.log("开始第一种页面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
22 }
23 }catch(e){
24 console.log(e);//错误捕捉
25 }
26 callback(serverResData);//直接返回第二页json内容
27 }
28 }
29 //console.log("开始第一种页面爬取 结束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
33 var ret = reg.exec(serverResData.toString());//转换变量为string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },

这里是一个简单的解释。微信公众号历史新闻页面的链接有两种形式:一种以/mp/getmasssendmsg开头,另一种以/mp/profile_ext开头。历史页面可以关闭。如果被拒绝,则会触发一个js事件,发送获取json数据(下一页内容)的请求。还有公众号文章的链接,以及文章的阅读量和喜欢的链接(返回json数据)。这些链接的形式是固定的,可以通过逻辑判断来区分。这里的问题是,如果所有的历史页面都需要爬取,怎么做。我的想法是模拟鼠标滑过js触发提交加载列表下一部分的请求。或者直接使用anyproxy分析滑动加载请求,直接将请求发送到微信服务器。但是如何判断没有剩余数据一直存在问题。我正在抓取最新数据。我暂时没有这个需求,以后可能需要。有需要的可以试试。
querylist采集微信公众号文章(rjava采集微信公众号文章的有效性)
采集交流 • 优采云 发表了文章 • 0 个评论 • 190 次浏览 • 2022-01-03 04:01
querylist采集微信公众号文章,大文本、小文本都可以,按词抓取,点击率高,方便。
楼上的没有提及全面!有人提到wordtab:
目前几个平台中,微博爬虫你可以用scrapy,
既然你那么肯定有效,不妨把数据转接一下,非对称加密,或者使用hashify、密码管理。
推荐你看看rjava博客提到的nodejs微信爬虫
wordtab,爬取微信公众号的文章,不限文本类型,
可以使用公众号热文爬虫的spider.py,请看博文,自己改动注释和模板功能,
没有人说wordtab吗?-python
lxml+xpath
大部分都是需要导入数据库查询的,
最适合中文的爬虫网站lxml+xpath
wordtab不错
有人说wordtab?
最大的还是lxml+xpath,htmlfield,关键词,tag,openpyxl如果后端功能都有比较全了,可以考虑beautifulsoup。
wordtab可以抓取javascript各种网页
wordtab最合适了,beautifulsoup框架,然后直接转word,
数据库操作必须有book_field_tag_meta字段,否则爬到的基本都是有机体。 查看全部
querylist采集微信公众号文章(rjava采集微信公众号文章的有效性)
querylist采集微信公众号文章,大文本、小文本都可以,按词抓取,点击率高,方便。
楼上的没有提及全面!有人提到wordtab:
目前几个平台中,微博爬虫你可以用scrapy,
既然你那么肯定有效,不妨把数据转接一下,非对称加密,或者使用hashify、密码管理。
推荐你看看rjava博客提到的nodejs微信爬虫
wordtab,爬取微信公众号的文章,不限文本类型,
可以使用公众号热文爬虫的spider.py,请看博文,自己改动注释和模板功能,
没有人说wordtab吗?-python
lxml+xpath
大部分都是需要导入数据库查询的,
最适合中文的爬虫网站lxml+xpath
wordtab不错
有人说wordtab?
最大的还是lxml+xpath,htmlfield,关键词,tag,openpyxl如果后端功能都有比较全了,可以考虑beautifulsoup。
wordtab可以抓取javascript各种网页
wordtab最合适了,beautifulsoup框架,然后直接转word,
数据库操作必须有book_field_tag_meta字段,否则爬到的基本都是有机体。
querylist采集微信公众号文章( 搜狗微信公众号实操训练 )
采集交流 • 优采云 发表了文章 • 0 个评论 • 123 次浏览 • 2022-01-02 04:12
搜狗微信公众号实操训练
)
爬取公众号文章
项目介绍
公众号是我最喜欢的学习方式之一。我经常关注一些技巧文章进行实践训练。所以打算做一段时间的公众号爬取文章。
这里我们使用selenium库通过搜狗微信网址获取相关文章内容:
搜狗微信网址
页面详情
我们发现有一个登录按钮可以进入页面。如果我们不登录,我们只能查看10页的内容。如果内容很多,10页是不够的。
这里我设置睡眠时间为20秒,微信扫码登录;然后我会进行后续的操作。
driver.find_element_by_id("loginBtn").click()
time.sleep(20) #休眠20秒进行微信扫码登录操作
接下来就是输入我们要搜索的相关内容文章
我使用显示等待。如果超过10秒没有找到对应的内容,则表示不存在。
input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME,'query')))
input.send_keys("python") #模拟输入
driver.find_element_by_xpath("//input[@class='swz']").click()#模拟点击
最后一步是爬取对应的文章。我们在爬行的时候,需要专门去爬行。这里我选择了官方账号名中收录Python这个词的账号。如果找到,就会被抓取并保存。
#爬取页面所有文章
new_list = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
# print(new_list)
for new in new_list:
#获取文章账号
sourse = new.find_elements_by_class_name("account")[0].text
if "python" in sourse:
#获取文章标题
title = new.find_elements_by_xpath("div[2]/h3/a")[0].text
完整代码
<p>from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
import datetime
from selenium.common.exceptions import TimeoutException
import xlwt
class official_accounts:
# #实例化参数,直接传入参数
# def __init__(self,name,deep_num):
# self.name = name
# self.deep_num = deep_num
#登录页面
def login_btn(self,name):
global driver
driver = webdriver.Firefox()
driver.get('https://weixin.sogou.com/')
driver.find_element_by_id("loginBtn").click()
time.sleep(20) #休眠20秒进行微信扫码登录操作
input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME,'query')))
input.send_keys(name)
driver.find_element_by_xpath("//input[@class='swz']").click()
#爬取内容
def get_news(self,name):
global data_total
data = []
time.sleep(1)
new_list = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
# print(new_list)
for new in new_list:
#获取文章账号
sourse = new.find_elements_by_class_name("account")[0].text
if name in sourse:
#获取文章标题
title = new.find_elements_by_xpath("div[2]/h3/a")[0].text
#获取文章发表日期
date = new.find_elements_by_xpath("div[2]/div/span")[0].text
# 文章发表的日期如果较近可能会显示“1天前” “12小时前” “30分钟前”
# 这里可以用`datetime`模块根据时间差求出具体时间
# 然后解析为`YYYY-MM-DD`格式
if '前' in date:
today = datetime.datetime.today()
if '天' in date:
delta = datetime.timedelta(days=int(date[0]))
elif '小时' in date:
delta = datetime.timedelta(hours=int(date.replace('小时前', ' ')))
else:
delta = datetime.timedelta(minutes=int(date.replace('分钟前', ' ')))
date = str((today - delta).strftime('%Y-%m-%d'))
date = datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%Y-%m-%d')
#获取文章简介
content = new.find_elements_by_xpath("div[2]/p")[0].text
#获取链接
url = new.find_elements_by_xpath("div[2]/h3/a")[0].get_attribute('href')
data.append(title)
data.append(date)
data.append(content)
data.append(url)
if data not in data_total:
data_total.append(data)
print(sourse,title,date,content)
print(url)
print('------'*10)
else:
continue
#写入Excel中
def save(self,data_total,name): #将爬取的信息写入Excel文件
# xlwt.Workbook用来创建一个工作表,style_compression=0表示是否被压缩
con = xlwt.Workbook(encoding='utf-8',style_compression=0)
# 添加sheet表格,并允许重复修改
sheet = con.add_sheet("公众号文字爬取信息",cell_overwrite_ok=True)
colunm = ("title","date","content","url") #定义列名
for i in range(0,4):
sheet.write(0,i,colunm[i])
for i in range(0,len(data_total)-1):
d = data_total[i]
for j in range(0,4):
sheet.write(i+1,j,d[j])
con.save( name +".xls")
print("数据保存成功!")
#定义爬取深度,要爬取多少个页面后就停止
def depth(self,name,deep_num):
self.login_btn(name)
global data_total
data_total = []
self.get_news(name)
d = 1 #定义一个爬取深度,爬取多少个页面
while d 查看全部
querylist采集微信公众号文章(
搜狗微信公众号实操训练
)
爬取公众号文章
项目介绍
公众号是我最喜欢的学习方式之一。我经常关注一些技巧文章进行实践训练。所以打算做一段时间的公众号爬取文章。
这里我们使用selenium库通过搜狗微信网址获取相关文章内容:
搜狗微信网址
页面详情
我们发现有一个登录按钮可以进入页面。如果我们不登录,我们只能查看10页的内容。如果内容很多,10页是不够的。

这里我设置睡眠时间为20秒,微信扫码登录;然后我会进行后续的操作。
driver.find_element_by_id("loginBtn").click()
time.sleep(20) #休眠20秒进行微信扫码登录操作

接下来就是输入我们要搜索的相关内容文章
我使用显示等待。如果超过10秒没有找到对应的内容,则表示不存在。
input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME,'query')))
input.send_keys("python") #模拟输入
driver.find_element_by_xpath("//input[@class='swz']").click()#模拟点击

最后一步是爬取对应的文章。我们在爬行的时候,需要专门去爬行。这里我选择了官方账号名中收录Python这个词的账号。如果找到,就会被抓取并保存。
#爬取页面所有文章
new_list = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
# print(new_list)
for new in new_list:
#获取文章账号
sourse = new.find_elements_by_class_name("account")[0].text
if "python" in sourse:
#获取文章标题
title = new.find_elements_by_xpath("div[2]/h3/a")[0].text
完整代码
<p>from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
import datetime
from selenium.common.exceptions import TimeoutException
import xlwt
class official_accounts:
# #实例化参数,直接传入参数
# def __init__(self,name,deep_num):
# self.name = name
# self.deep_num = deep_num
#登录页面
def login_btn(self,name):
global driver
driver = webdriver.Firefox()
driver.get('https://weixin.sogou.com/')
driver.find_element_by_id("loginBtn").click()
time.sleep(20) #休眠20秒进行微信扫码登录操作
input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME,'query')))
input.send_keys(name)
driver.find_element_by_xpath("//input[@class='swz']").click()
#爬取内容
def get_news(self,name):
global data_total
data = []
time.sleep(1)
new_list = driver.find_elements_by_xpath("//li[contains(@id,'sogou_vr_11002601_box')]")
# print(new_list)
for new in new_list:
#获取文章账号
sourse = new.find_elements_by_class_name("account")[0].text
if name in sourse:
#获取文章标题
title = new.find_elements_by_xpath("div[2]/h3/a")[0].text
#获取文章发表日期
date = new.find_elements_by_xpath("div[2]/div/span")[0].text
# 文章发表的日期如果较近可能会显示“1天前” “12小时前” “30分钟前”
# 这里可以用`datetime`模块根据时间差求出具体时间
# 然后解析为`YYYY-MM-DD`格式
if '前' in date:
today = datetime.datetime.today()
if '天' in date:
delta = datetime.timedelta(days=int(date[0]))
elif '小时' in date:
delta = datetime.timedelta(hours=int(date.replace('小时前', ' ')))
else:
delta = datetime.timedelta(minutes=int(date.replace('分钟前', ' ')))
date = str((today - delta).strftime('%Y-%m-%d'))
date = datetime.datetime.strptime(date, '%Y-%m-%d').strftime('%Y-%m-%d')
#获取文章简介
content = new.find_elements_by_xpath("div[2]/p")[0].text
#获取链接
url = new.find_elements_by_xpath("div[2]/h3/a")[0].get_attribute('href')
data.append(title)
data.append(date)
data.append(content)
data.append(url)
if data not in data_total:
data_total.append(data)
print(sourse,title,date,content)
print(url)
print('------'*10)
else:
continue
#写入Excel中
def save(self,data_total,name): #将爬取的信息写入Excel文件
# xlwt.Workbook用来创建一个工作表,style_compression=0表示是否被压缩
con = xlwt.Workbook(encoding='utf-8',style_compression=0)
# 添加sheet表格,并允许重复修改
sheet = con.add_sheet("公众号文字爬取信息",cell_overwrite_ok=True)
colunm = ("title","date","content","url") #定义列名
for i in range(0,4):
sheet.write(0,i,colunm[i])
for i in range(0,len(data_total)-1):
d = data_total[i]
for j in range(0,4):
sheet.write(i+1,j,d[j])
con.save( name +".xls")
print("数据保存成功!")
#定义爬取深度,要爬取多少个页面后就停止
def depth(self,name,deep_num):
self.login_btn(name)
global data_total
data_total = []
self.get_news(name)
d = 1 #定义一个爬取深度,爬取多少个页面
while d
querylist采集微信公众号文章(,小编觉得挺不错的主要介绍思路,代码部分请自行解决获取)
采集交流 • 优采云 发表了文章 • 0 个评论 • 137 次浏览 • 2022-01-02 02:15
本文文章主要介绍python如何抓取搜狗微信公众号文章永久链接思维分析,小编觉得还不错,现分享给大家,给大家参考。跟着小编一起来看看吧。
本文主要讲解思路,代码部分请自行解决
获取搜狗微信当天信息排名
指定输入关键字,通过scrapy抓取公众号
登录微信公众号链接获取cookie信息
由于微信公众平台模拟登录尚未解决,需要手动登录实时获取cookie信息
固定链接可以在这里转换
代码部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------请输入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信访问频率会过快,导致需要输入验证码
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判断url 是否是需要输入验证码
res = re.search("from", response.url) # 需要验证码验证
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content with open("urli.jpg", "wb") as f:
f.write(url_img) # f.close()
img = input("请输入验证码:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要验证码验证
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//p[1]/a/@href').extract_first()
item["name"] = name
print("第%d条" % i) # 转化永久链接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"] except Exception as f:
print("**********[INFO]:请求失败,登陆失败, 请重新登陆*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"] if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10) # time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最终链接为:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("与所选文章不同放弃")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("与所选公众号不一致放弃")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s) # time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name})
以上是python如何抓取搜狗微信公众号文章永久链接思路解析的详细内容。更多详情请关注其他相关php中文网站文章!
免责声明:本文由原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何问题,请联系我们 查看全部
querylist采集微信公众号文章(,小编觉得挺不错的主要介绍思路,代码部分请自行解决获取)
本文文章主要介绍python如何抓取搜狗微信公众号文章永久链接思维分析,小编觉得还不错,现分享给大家,给大家参考。跟着小编一起来看看吧。
本文主要讲解思路,代码部分请自行解决
获取搜狗微信当天信息排名
指定输入关键字,通过scrapy抓取公众号
登录微信公众号链接获取cookie信息
由于微信公众平台模拟登录尚未解决,需要手动登录实时获取cookie信息




固定链接可以在这里转换
代码部分
def parse(self, response):
item = SougouItem()
item["title"] = response.xpath('//title/text()').extract_first()
print("**"*5, item["title"],"**"*5)
name = input("----------请输入需要搜索的信息:")
print(name)
url = "http://weixin.sogou.com/weixin ... ot%3B
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name":name})
搜狗微信访问频率会过快,导致需要输入验证码
def parse_two(self, response):
print(response.url)
name = response.meta["name"]
resp = response.xpath('//ul[@class="news-list"]/li')
s = 1
# 判断url 是否是需要输入验证码
res = re.search("from", response.url) # 需要验证码验证
if res:
print(response.url)
img = response.xpath('//img/@src').extract()
print(img)
url_img = "http://weixin.sogou.com/antispider/"+ img[1]
print(url_img)
url_img = requests.get(url_img).content with open("urli.jpg", "wb") as f:
f.write(url_img) # f.close()
img = input("请输入验证码:")
print(img)
url = response.url
r = re.search(r"from=(.*)",url).group(1)
print(r)
postData = {"c":img,"r":r,"v":"5"}
url = "http://weixin.sogou.com/antispider/thank.php"
yield scrapy.FormRequest(url=url, formdata=postData, callback=self.parse_two,meta={"name":name})
# 不需要验证码验证
else:
for res, i in zip(resp, range(1, 10)):
item = SougouItem()
item["url"] = res.xpath('.//p[1]/a/@href').extract_first()
item["name"] = name
print("第%d条" % i) # 转化永久链接
headers = {"Host": "mp.weixin.qq.com",
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "noticeLoginFlag=1; pgv_pvi=5269297152; pt2gguin=o1349184918; RK=ph4smy/QWu; ptcz=f3eb6ede5db921d0ada7f1713e6d1ca516d200fec57d602e677245490fcb7f1e; pgv_pvid=1033302674; o_cookie=1349184918; pac_uid=1_1349184918; ua_id=4nooSvHNkTOjpIpgAAAAAFX9OSNcLApfsluzwfClLW8=; mm_lang=zh_CN; noticeLoginFlag=1; remember_acct=Liangkai318; rewardsn=; wxtokenkey=777; pgv_si=s1944231936; uuid=700c40c965347f0925a8e8fdcc1e003e; ticket=023fc8861356b01527983c2c4765ef80903bf3d7; ticket_id=gh_6923d82780e4; cert=L_cE4aRdaZeDnzao3xEbMkcP3Kwuejoi; data_bizuin=3075391054; bizuin=3208078327; data_ticket=XrzOnrV9Odc80hJLtk8vFjTLI1vd7kfKJ9u+DzvaeeHxZkMXbv9kcWk/Pmqx/9g7; slave_sid=SWRKNmFyZ1NkM002Rk9NR0RRVGY5VFdMd1lXSkExWGtPcWJaREkzQ1BESEcyQkNLVlQ3YnB4OFNoNmtRZzdFdGpnVGlHak9LMjJ5eXBNVEgxZDlZb1BZMnlfN1hKdnJsV0NKallsQW91Zjk5Y3prVjlQRDNGYUdGUWNFNEd6eTRYT1FSOEQxT0MwR01Ja0Vo; slave_user=gh_6923d82780e4; xid=7b2245140217dbb3c5c0a552d46b9664; openid2ticket_oTr5Ot_B4nrDSj14zUxlXg8yrzws=D/B6//xK73BoO+mKE2EAjdcgIXNPw/b5PEDTDWM6t+4="}
respon = requests.get(url=item["url"]).content
gongzhongh = etree.HTML(respon).xpath('//a[@id="post-user"]/text()')[0]
# times = etree.HTML(respon).xpath('//*[@id="post-date"]/text()')[0]
title_one = etree.HTML(respon).xpath('//*[@id="activity-name"]/text()')[0].split()[0]
print(gongzhongh, title_one)
item["tit"] = title_one
item["gongzhongh"] = gongzhongh
# item["times"] = times
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + gongzhongh + "&begin=0&count=5"
# wenzhang_url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
resp = requests.get(url=url, headers=headers).content
print(resp)
faskeids = json.loads(resp.decode("utf-8"))
try:
list_fask = faskeids["list"] except Exception as f:
print("**********[INFO]:请求失败,登陆失败, 请重新登陆*************")
return
for fask in list_fask:
fakeid = fask["fakeid"]
nickname = fask["nickname"] if nickname == item["gongzhongh"]:
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + fakeid + "&type=9"
# url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] + "&fakeid=MzA5MzMxMDk3OQ%3D%3D&type=9"
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B + item["tit"] +"&fakeid=" + fakeid +"&type=9"
resp = requests.get(url=url, headers=headers).content
app = json.loads(resp.decode("utf-8"))["app_msg_list"]
item["aid"] = app["aid"]
item["appmsgid"] = app["appmsgid"]
item["cover"] = app["cover"]
item["digest"] = app["digest"]
item["url_link"] = app["link"]
item["tit"] = app["title"]
print(item)
time.sleep(10) # time.sleep(5)
# dict_wengzhang = json.loads(resp.decode("utf-8"))
# app_msg_list = dict_wengzhang["app_msg_list"]
# print(len(app_msg_list))
# for app in app_msg_list:
# print(app)
# title = app["title"]
# if title == item["tit"]:
# item["url_link"] = app["link"]
# updata_time = app["update_time"]
# item["times"] = time.strftime("%Y-%m-%d %H:%M:%S", updata_time)
# print("最终链接为:", item["url_link"])
# yield item
# else:
# print(app["title"], item["tit"])
# print("与所选文章不同放弃")
# # item["tit"] = app["title"]
# # item["url_link"] = app["link"]
# # yield item
# else:
# print(nickname, item["gongzhongh"])
# print("与所选公众号不一致放弃")
# time.sleep(100)
# yield item
if response.xpath('//a[@class="np"]'):
s += 1
url = "http://weixin.sogou.com/weixin ... 2Bstr(s) # time.sleep(3)
yield scrapy.Request(url=url, callback=self.parse_two, meta={"name": name})
以上是python如何抓取搜狗微信公众号文章永久链接思路解析的详细内容。更多详情请关注其他相关php中文网站文章!

免责声明:本文由原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何问题,请联系我们
querylist采集微信公众号文章( 微信公众号爬虫关键是获取请求地址,注意:请求是需要cookies参数 )
采集交流 • 优采云 发表了文章 • 0 个评论 • 149 次浏览 • 2022-01-01 21:03
微信公众号爬虫关键是获取请求地址,注意:请求是需要cookies参数
)
微信公众号爬虫的关键是获取请求的地址。这个文章是方法之一。
登录自己的公众号后台,微信官方平台,进入图文消息编辑界面,进入超链接,选择公众号文章,
搜索人民日报等公众号,会弹出最新的文章列表。这时候就可以找到对应的请求了。可以通过公众号文章翻页找到请求的参数规则。
注意:请求需要cookies参数,可以复制浏览器访问的cookies。代码如下:(cookies中的关键参数已经脱敏为“???”)
''' the key is to use cookies'''
import requests
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','referer':'https://mp.weixin.qq.com/cgi-b ... 39%3B}
cookies={'appmsglist_action_3207019504': 'card', ' pgv_info': 'ssid', ' pgv_pvid': '4778161886', ' RK': '1KphnCSeRK', ' ptcz': '4a3ad775ddc10f3d9f50479110d37c6f7d5c7e8b38ebdb1e90207808173ad942', ' rewardsn': '', ' wxtokenkey': '777', ' _ga': 'GA1.2.1040497363.1629278077', ' o_cookie': '???????', ' pac_uid': '1_???????', ' tvfe_boss_uuid': 'a1a981cb70609f6e', ' vversion_name': '8.2.95', ' user_id': 'null', ' session_id': 'null',
' ua_id': 'ZpH4w1C3ipVIqGlHAAAAANiI5kknP2NeaIGodK9Opus', ' wxuin': '32385700599949', ' mm_lang': 'zh_CN', ' ptui_loginuin': '???????', ' verifysession': 'h014382c87bb4d29015296cbadb898e8e19aed8e594f786d35bf732285d003ed4c300f3ad957b8e52bf', ' video_omgid': '', ' uin': 'o0???????', ' iip': '0', ' mmad_session': 'db8fbb73a2b0a4c41bc175f34a6ad7d79d7245bbd1ba1a04ed6f116b38c7c8b6c4a209839bd7378c4da98642d25827cce39f657a4b128eb2c6658eb64dad90d50adf1bdf73a0fae947e3047a489efcc4cd503f920e2c7f38ac8e4728189d5c2711de1c56c245721266e7088080fefde3', ' ts_uid': '8844190317', ' sig': 'h01ac912472130166d03e296461b8fba0d24e1a2bbe362cbae1470395802352c863c771017587fdabdb', ' uuid': '5d8752d7b10e69ca60b82d934f101a8c', ' rand_info': 'CAESIK4WkEF7objSg84LpN/56kispUPwx5XIFkZWGhEmjYpM', ' slave_bizuin': '3207019504', ' data_bizuin': '3226019316', ' bizuin': '3207019504', ' data_ticket': 'DaBODpqknEMzImuPqc7tT2ZR07to0GCNXX9WR2+lfcCOvPl/ZUTGnX5wAkd2yzQn', ' slave_sid': 'eFkzZVJOeXg5aHRIdHFuMlcyaUplT2JBbXVQZk5jYzB1aXM0bENQdFZUMmlwQWFvODVvX0V0MEM4cTdjWGN1NmJsYzFaTXI2YnpQZWNQNHluNjV6N1BMT3B1MWNHYU1kUWVPQU5oYTJ1eTJvb2dpU09oNG5rYk5JMGgyRFV0TnlYUFFMTDRabllhc0RLTXlL', ' slave_user': 'gh_90314c99dc76', ' xid': 'cb00dd5d681ce20868e0ffd778c1863f'}
url='https://mp.weixin.qq.com/cgi-bin/appmsg'
for page in range(0,5):
page=page*5
#fakeid 为公众号账号,此处为人民日报账号;page实现翻页
data={'action': 'list_ex', 'begin': page, 'count': '5', 'fakeid': 'MjM5MjAxNDM4MA==', 'type': '9', 'query': '', 'token': '2101561850', 'lang': 'zh_CN', 'f': 'json', 'ajax': '1'}
res=requests.get(url,headers=headers,params=data,cookies=cookies)
print(res.status_code)
app_msg_list=res.json()['app_msg_list']
# print(app_msg_list)
for message in app_msg_list:
link=message['link']
title=message['title']
print(title,link) 查看全部
querylist采集微信公众号文章(
微信公众号爬虫关键是获取请求地址,注意:请求是需要cookies参数
)

微信公众号爬虫的关键是获取请求的地址。这个文章是方法之一。
登录自己的公众号后台,微信官方平台,进入图文消息编辑界面,进入超链接,选择公众号文章,
搜索人民日报等公众号,会弹出最新的文章列表。这时候就可以找到对应的请求了。可以通过公众号文章翻页找到请求的参数规则。
注意:请求需要cookies参数,可以复制浏览器访问的cookies。代码如下:(cookies中的关键参数已经脱敏为“???”)
''' the key is to use cookies'''
import requests
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','referer':'https://mp.weixin.qq.com/cgi-b ... 39%3B}
cookies={'appmsglist_action_3207019504': 'card', ' pgv_info': 'ssid', ' pgv_pvid': '4778161886', ' RK': '1KphnCSeRK', ' ptcz': '4a3ad775ddc10f3d9f50479110d37c6f7d5c7e8b38ebdb1e90207808173ad942', ' rewardsn': '', ' wxtokenkey': '777', ' _ga': 'GA1.2.1040497363.1629278077', ' o_cookie': '???????', ' pac_uid': '1_???????', ' tvfe_boss_uuid': 'a1a981cb70609f6e', ' vversion_name': '8.2.95', ' user_id': 'null', ' session_id': 'null',
' ua_id': 'ZpH4w1C3ipVIqGlHAAAAANiI5kknP2NeaIGodK9Opus', ' wxuin': '32385700599949', ' mm_lang': 'zh_CN', ' ptui_loginuin': '???????', ' verifysession': 'h014382c87bb4d29015296cbadb898e8e19aed8e594f786d35bf732285d003ed4c300f3ad957b8e52bf', ' video_omgid': '', ' uin': 'o0???????', ' iip': '0', ' mmad_session': 'db8fbb73a2b0a4c41bc175f34a6ad7d79d7245bbd1ba1a04ed6f116b38c7c8b6c4a209839bd7378c4da98642d25827cce39f657a4b128eb2c6658eb64dad90d50adf1bdf73a0fae947e3047a489efcc4cd503f920e2c7f38ac8e4728189d5c2711de1c56c245721266e7088080fefde3', ' ts_uid': '8844190317', ' sig': 'h01ac912472130166d03e296461b8fba0d24e1a2bbe362cbae1470395802352c863c771017587fdabdb', ' uuid': '5d8752d7b10e69ca60b82d934f101a8c', ' rand_info': 'CAESIK4WkEF7objSg84LpN/56kispUPwx5XIFkZWGhEmjYpM', ' slave_bizuin': '3207019504', ' data_bizuin': '3226019316', ' bizuin': '3207019504', ' data_ticket': 'DaBODpqknEMzImuPqc7tT2ZR07to0GCNXX9WR2+lfcCOvPl/ZUTGnX5wAkd2yzQn', ' slave_sid': 'eFkzZVJOeXg5aHRIdHFuMlcyaUplT2JBbXVQZk5jYzB1aXM0bENQdFZUMmlwQWFvODVvX0V0MEM4cTdjWGN1NmJsYzFaTXI2YnpQZWNQNHluNjV6N1BMT3B1MWNHYU1kUWVPQU5oYTJ1eTJvb2dpU09oNG5rYk5JMGgyRFV0TnlYUFFMTDRabllhc0RLTXlL', ' slave_user': 'gh_90314c99dc76', ' xid': 'cb00dd5d681ce20868e0ffd778c1863f'}
url='https://mp.weixin.qq.com/cgi-bin/appmsg'
for page in range(0,5):
page=page*5
#fakeid 为公众号账号,此处为人民日报账号;page实现翻页
data={'action': 'list_ex', 'begin': page, 'count': '5', 'fakeid': 'MjM5MjAxNDM4MA==', 'type': '9', 'query': '', 'token': '2101561850', 'lang': 'zh_CN', 'f': 'json', 'ajax': '1'}
res=requests.get(url,headers=headers,params=data,cookies=cookies)
print(res.status_code)
app_msg_list=res.json()['app_msg_list']
# print(app_msg_list)
for message in app_msg_list:
link=message['link']
title=message['title']
print(title,link)
querylist采集微信公众号文章(一个微信公众号历史消息页面的链接地址和采集方法)
采集交流 • 优采云 发表了文章 • 0 个评论 • 157 次浏览 • 2022-01-01 12:07
我从2014年开始批量做微信公众号内容采集,最初的目的是为了制造一个html5垃圾邮件网站。当时,垃圾站采集到达的微信公众号内容很容易在公众号传播。那个时候分批的采集特别好做,而采集的入口就是公众号的历史新闻页面。这个入口现在还是一样,只是越来越难采集。 采集的方法也更新了很多版本。后来到了2015年,html5垃圾站就不做了。取而代之的是,采集的目标是针对本地新闻资讯公众号,将前端展示做成一个app。于是一个可以自动采集公众号内容的新闻APP就形成了。曾经担心微信技术升级一天后,采集的内容不可用,我的新闻应用会失败。但是随着微信技术的不断升级,采集的方法也得到了升级,这让我越来越有信心。只要公众号历史消息页面存在,就可以批量采集查看内容。所以今天整理了一下,决定把采集这个方法写下来。我的方法来自于很多同事的分享精神,所以我会延续这种精神,分享我的成果。
本文文章会持续更新,保证您看到的内容在您看到时可用。
首先来看一个微信公众号历史消息页面的链接地址:
http://mp.weixin.qq.com/mp/get ... irect
========2017 年 1 月 11 日更新==========
现在根据不同的微信个人账号,会有两个不同的历史消息页地址。以下是另一个历史消息页面的地址。第一种地址的链接在anyproxy中会显示302跳转:
https://mp.weixin.qq.com/mp/pr ... irect
第一个链接地址的页面样式:
第二个链接地址的页面样式:
根据目前的信息,这两种页面格式在不同的微信账号中出现不规则。有的微信账号永远是第一页格式,有的永远是第二页格式。
上面的链接是微信公众号历史新闻页面的真实链接,但是当我们在浏览器中输入这个链接时,会显示:请从微信客户端访问。这是因为链接地址实际上需要几个参数才能正常显示内容。我们来看看一个可以正常显示内容的完整链接是什么样子的:
//第一种链接
http://mp.weixin.qq.com/mp/get ... r%3D1
//第二种
http://mp.weixin.qq.com/mp/pro ... r%3D1
该地址是通过微信客户端打开历史消息页面后使用代理服务器软件获取的。这里有几个参数:
action=;__biz=;uin=;key=;devicetype=;version=;lang=;nettype=;scene=;pass_ticket=;wx_header=;
重要的参数是:__biz;uin=;key=;pass_ticket=;这4个参数。
__biz 是公众号的类似id的参数。每个公众号都有一个微信。目前公众号的biz变动的可能性很小;
剩下的3个参数与用户的id和tokenticket相关。这3个参数的值在微信客户端生成后会自动添加到地址栏中。所以我们认为采集公众号必须通过微信客户端。在之前的微信版本中,这3个参数也可以一次性获取,在有效期内可以使用多个公众号。在当前版本中,每次访问公众号都会更改参数值。
我现在使用的方法只需要关注__biz参数即可。
我的采集系统由以下部分组成:
1、 微信客户端:可以是安装了微信应用的手机,也可以是电脑上的安卓模拟器。在batch采集上测试的ios微信客户端崩溃率高于Android系统。为了降低成本,我使用了Android模拟器。
2、一个微信个人账号:为了采集内容,不仅需要一个微信客户端,还需要一个专用于采集的微信个人账号,因为这个微信账号可以不要做任何其他事情。
3、本地代理服务器系统:目前使用的方法是通过Anyproxy代理服务器将公众账号历史消息页面中文章的列表发送到自己的服务器上。具体安装方法后面会详细介绍。
4、文章列表分析入库系统:本人使用php语言编写,下篇文章将详细介绍如何分析文章列表并建立采集 queue 实现批量采集内容。
步骤
一、 安装模拟器或使用手机安装微信客户端,申请微信个人账号并登录应用。这个就不多介绍了,大家自己做。
二、代理服务器系统安装
目前我使用 Anyproxy、AnyProxy。这个软件的特点是可以获取https链接的内容。 2016年初,微信公众号和微信文章开始使用https链接。而Anyproxy可以通过修改规则配置,在公众号页面插入脚本代码。下面将介绍安装和配置过程。
1、安装 NodeJS
2、在命令行或终端运行npm install -g anyproxy,mac系统需要添加sudo;
3、生成RootCA,https需要这个证书:运行命令sudo anyproxy --root(windows可能不需要sudo);
4、启动anyproxy运行命令:sudo anyproxy -i;参数-i表示解析HTTPS;
5、安装证书,在手机或者安卓模拟器安装证书:
6、 设置代理:安卓模拟器的代理服务器地址为wifi链接的网关。通过dhcp设置为static后就可以看到网关地址了。阅读后不要忘记将其设置为自动。手机中的代理服务器地址是运行anyproxy的电脑的ip地址。代理服务器默认端口为8001;
现在打开微信,点击任意一个公众号历史消息或者文章,就可以看到在终端滚动的响应码。如果没有出现,请检查手机的代理设置是否正确。
现在打开浏览器地址localhost:8002,可以看到anyproxy的web界面。微信点击打开历史消息页面,然后查看浏览器的网页界面,历史消息页面的地址会滚动。
/mp/getmasssendmsg开头的网址是微信历史消息页面。左边的小锁表示这个页面是 https 加密的。现在我们点击这一行;
========2017 年 1 月 11 日更新==========
有些以/mp/getmasssendmsg开头的微信账号会出现302跳转到/mp/profile_ext?action=home开头的地址。所以点击这个地址可以看到内容。
如果右侧出现html文件内容,则表示解密成功。如果没有内容,请检查anyproxy运行方式是否有参数i,是否生成了ca证书,是否在手机上正确安装了证书。
现在我们手机里的所有内容都可以明文通过代理服务器了。接下来我们需要修改一下代理服务器的配置,才能获取公众号的内容。
一、找到配置文件:
配置文件在mac系统中的位置是/usr/local/lib/node_modules/anyproxy/lib/;对于windows系统,不知道还请见谅。应该可以根据类似mac的文件夹地址找到这个目录。
二、修改文件rule_default.js
找到 replaceServerResDataAsync: function(req,res,serverResData,callback) 函数
修改函数内容(请注意详细阅读注释,这里只是介绍原理,理解后根据自己的情况修改内容):
========2017 年 1 月 11 日更新==========
因为有两种页面格式,相同的页面格式总是在不同的微信账号中显示,但是为了兼容两种页面格式,下面的代码会保留两种页面格式的判断。您也可以按照从您自己的页面表单中删除 li
replaceServerResDataAsync: function(req,res,serverResData,callback){
if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
if(serverResData.toString() !== ""){
try {//防止报错退出程序
var reg = /msgList = (.*?);\r\n/;//定义历史消息正则匹配规则
var ret = reg.exec(serverResData.toString());//转换变量为string
HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
var http = require('http');
http.get('http://xxx.com/getWxHis.php', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
})
});
}catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
}
}catch(e){
console.log(e);//错误捕捉
}
callback(serverResData);//直接返回第二页json内容
}
}
}else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
try {
var reg = /var msgList = \'(.*?)\';\r\n/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
var ret = reg.exec(serverResData.toString());//转换变量为string
HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
var http = require('http');
http.get('http://xxx.com/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
})
});
}catch(e){
callback(serverResData);
}
}else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
}
}catch(e){
console.log(e);
}
callback(serverResData);
}else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
try {
HttpPost(serverResData,req.url,"getMsgExt.php");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
}catch(e){
}
callback(serverResData);
}else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
try {
var http = require('http');
http.get('http://xxx.com/getWxPost.php', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);
})
});
}catch(e){
callback(serverResData);
}
}else{
callback(serverResData);
}
},
以上代码是使用anyproxy修改返回页面内容、向页面注入脚本、将页面内容发送到服务器的功能。利用这个原理批量处理采集公众号内容和阅读量。该脚本中自定义了一个函数,详细说明如下:
在 rule_default.js 文件末尾添加以下代码:
function HttpPost(str,url,path) {//将json发送到服务器,str为json内容,url为历史消息页面地址,path是接收程序的路径和文件名
var http = require('http');
var data = {
str: encodeURIComponent(str),
url: encodeURIComponent(url)
};
content = require('querystring').stringify(data);
var options = {
method: "POST",
host: "www.xxx.com",//注意没有http://,这是服务器的域名。
port: 80,
path: path,//接收程序的路径和文件名
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
"Content-Length": content.length
}
};
var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
});
req.write(content);
req.end();
}
以上是规则修改的主要部分。您需要将json内容发送到您自己的服务器,并从服务器获取到下一页的跳转地址。这涉及到四个php文件:getMsgJson.php、getMsgExt.php、getWxHis.php、getWxPost.php
在详细介绍这4个php文件之前,为了提高采集系统性能,降低崩溃率,我们还可以做一些修改:
Android模拟器经常访问一些地址,会导致anyproxy崩溃,找到函数replaceRequestOption:function(req,option),修改函数内容:
replaceRequestOption : function(req,option){
var newOption = option;
if(/google/i.test(newOption.headers.host)){
newOption.hostname = "www.baidu.com";
newOption.port = "80";
}
return newOption;
},
以上是anyproxy的规则文件的修改配置。配置修改完成后,重启anyproxy。在mac系统下,按control+c中断程序,然后输入命令sudo anyproxy -i启动;如果报错,程序可能无法干净退出,端口被占用。这时候输入命令ps -a查看占用的pid,然后输入命令“kill -9 pid”将pid替换为查询到的pid号。杀掉进程后,就可以启动anyproxy了。再次请原谅我不熟悉windows命令。
接下来详细介绍服务器端接收程序的设计原理:
(以下代码不能直接使用,只介绍原理,部分需要根据自己的服务器数据库框架编写)
1、getMsgJson.php:该程序负责接收历史消息的json,解析并存入数据库
<p> 查看全部
querylist采集微信公众号文章(一个微信公众号历史消息页面的链接地址和采集方法)
我从2014年开始批量做微信公众号内容采集,最初的目的是为了制造一个html5垃圾邮件网站。当时,垃圾站采集到达的微信公众号内容很容易在公众号传播。那个时候分批的采集特别好做,而采集的入口就是公众号的历史新闻页面。这个入口现在还是一样,只是越来越难采集。 采集的方法也更新了很多版本。后来到了2015年,html5垃圾站就不做了。取而代之的是,采集的目标是针对本地新闻资讯公众号,将前端展示做成一个app。于是一个可以自动采集公众号内容的新闻APP就形成了。曾经担心微信技术升级一天后,采集的内容不可用,我的新闻应用会失败。但是随着微信技术的不断升级,采集的方法也得到了升级,这让我越来越有信心。只要公众号历史消息页面存在,就可以批量采集查看内容。所以今天整理了一下,决定把采集这个方法写下来。我的方法来自于很多同事的分享精神,所以我会延续这种精神,分享我的成果。
本文文章会持续更新,保证您看到的内容在您看到时可用。
首先来看一个微信公众号历史消息页面的链接地址:
http://mp.weixin.qq.com/mp/get ... irect
========2017 年 1 月 11 日更新==========
现在根据不同的微信个人账号,会有两个不同的历史消息页地址。以下是另一个历史消息页面的地址。第一种地址的链接在anyproxy中会显示302跳转:
https://mp.weixin.qq.com/mp/pr ... irect
第一个链接地址的页面样式:

第二个链接地址的页面样式:

根据目前的信息,这两种页面格式在不同的微信账号中出现不规则。有的微信账号永远是第一页格式,有的永远是第二页格式。
上面的链接是微信公众号历史新闻页面的真实链接,但是当我们在浏览器中输入这个链接时,会显示:请从微信客户端访问。这是因为链接地址实际上需要几个参数才能正常显示内容。我们来看看一个可以正常显示内容的完整链接是什么样子的:
//第一种链接
http://mp.weixin.qq.com/mp/get ... r%3D1
//第二种
http://mp.weixin.qq.com/mp/pro ... r%3D1
该地址是通过微信客户端打开历史消息页面后使用代理服务器软件获取的。这里有几个参数:
action=;__biz=;uin=;key=;devicetype=;version=;lang=;nettype=;scene=;pass_ticket=;wx_header=;
重要的参数是:__biz;uin=;key=;pass_ticket=;这4个参数。
__biz 是公众号的类似id的参数。每个公众号都有一个微信。目前公众号的biz变动的可能性很小;
剩下的3个参数与用户的id和tokenticket相关。这3个参数的值在微信客户端生成后会自动添加到地址栏中。所以我们认为采集公众号必须通过微信客户端。在之前的微信版本中,这3个参数也可以一次性获取,在有效期内可以使用多个公众号。在当前版本中,每次访问公众号都会更改参数值。
我现在使用的方法只需要关注__biz参数即可。
我的采集系统由以下部分组成:
1、 微信客户端:可以是安装了微信应用的手机,也可以是电脑上的安卓模拟器。在batch采集上测试的ios微信客户端崩溃率高于Android系统。为了降低成本,我使用了Android模拟器。

2、一个微信个人账号:为了采集内容,不仅需要一个微信客户端,还需要一个专用于采集的微信个人账号,因为这个微信账号可以不要做任何其他事情。
3、本地代理服务器系统:目前使用的方法是通过Anyproxy代理服务器将公众账号历史消息页面中文章的列表发送到自己的服务器上。具体安装方法后面会详细介绍。
4、文章列表分析入库系统:本人使用php语言编写,下篇文章将详细介绍如何分析文章列表并建立采集 queue 实现批量采集内容。
步骤
一、 安装模拟器或使用手机安装微信客户端,申请微信个人账号并登录应用。这个就不多介绍了,大家自己做。
二、代理服务器系统安装
目前我使用 Anyproxy、AnyProxy。这个软件的特点是可以获取https链接的内容。 2016年初,微信公众号和微信文章开始使用https链接。而Anyproxy可以通过修改规则配置,在公众号页面插入脚本代码。下面将介绍安装和配置过程。
1、安装 NodeJS
2、在命令行或终端运行npm install -g anyproxy,mac系统需要添加sudo;
3、生成RootCA,https需要这个证书:运行命令sudo anyproxy --root(windows可能不需要sudo);
4、启动anyproxy运行命令:sudo anyproxy -i;参数-i表示解析HTTPS;
5、安装证书,在手机或者安卓模拟器安装证书:
6、 设置代理:安卓模拟器的代理服务器地址为wifi链接的网关。通过dhcp设置为static后就可以看到网关地址了。阅读后不要忘记将其设置为自动。手机中的代理服务器地址是运行anyproxy的电脑的ip地址。代理服务器默认端口为8001;

现在打开微信,点击任意一个公众号历史消息或者文章,就可以看到在终端滚动的响应码。如果没有出现,请检查手机的代理设置是否正确。

现在打开浏览器地址localhost:8002,可以看到anyproxy的web界面。微信点击打开历史消息页面,然后查看浏览器的网页界面,历史消息页面的地址会滚动。

/mp/getmasssendmsg开头的网址是微信历史消息页面。左边的小锁表示这个页面是 https 加密的。现在我们点击这一行;
========2017 年 1 月 11 日更新==========
有些以/mp/getmasssendmsg开头的微信账号会出现302跳转到/mp/profile_ext?action=home开头的地址。所以点击这个地址可以看到内容。

如果右侧出现html文件内容,则表示解密成功。如果没有内容,请检查anyproxy运行方式是否有参数i,是否生成了ca证书,是否在手机上正确安装了证书。
现在我们手机里的所有内容都可以明文通过代理服务器了。接下来我们需要修改一下代理服务器的配置,才能获取公众号的内容。
一、找到配置文件:
配置文件在mac系统中的位置是/usr/local/lib/node_modules/anyproxy/lib/;对于windows系统,不知道还请见谅。应该可以根据类似mac的文件夹地址找到这个目录。
二、修改文件rule_default.js
找到 replaceServerResDataAsync: function(req,res,serverResData,callback) 函数
修改函数内容(请注意详细阅读注释,这里只是介绍原理,理解后根据自己的情况修改内容):
========2017 年 1 月 11 日更新==========
因为有两种页面格式,相同的页面格式总是在不同的微信账号中显示,但是为了兼容两种页面格式,下面的代码会保留两种页面格式的判断。您也可以按照从您自己的页面表单中删除 li
replaceServerResDataAsync: function(req,res,serverResData,callback){
if(/mp\/getmasssendmsg/i.test(req.url)){//当链接地址为公众号历史消息页面时(第一种页面形式)
if(serverResData.toString() !== ""){
try {//防止报错退出程序
var reg = /msgList = (.*?);\r\n/;//定义历史消息正则匹配规则
var ret = reg.exec(serverResData.toString());//转换变量为string
HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
var http = require('http');
http.get('http://xxx.com/getWxHis.php', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
})
});
}catch(e){//如果上面的正则没有匹配到,那么这个页面内容可能是公众号历史消息页面向下翻动的第二页,因为历史消息第一页是html格式的,第二页就是json格式的。
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
}
}catch(e){
console.log(e);//错误捕捉
}
callback(serverResData);//直接返回第二页json内容
}
}
}else if(/mp\/profile_ext\?action=home/i.test(req.url)){//当链接地址为公众号历史消息页面时(第二种页面形式)
try {
var reg = /var msgList = \'(.*?)\';\r\n/;//定义历史消息正则匹配规则(和第一种页面形式的正则不同)
var ret = reg.exec(serverResData.toString());//转换变量为string
HttpPost(ret[1],req.url,"getMsgJson.php");//这个函数是后文定义的,将匹配到的历史消息json发送到自己的服务器
var http = require('http');
http.get('http://xxx.com/getWxHis', function(res) {//这个地址是自己服务器上的一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxHis.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);//将返回的代码插入到历史消息页面中,并返回显示出来
})
});
}catch(e){
callback(serverResData);
}
}else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二种页面表现形式的向下翻页后的json
try {
var json = JSON.parse(serverResData.toString());
if (json.general_msg_list != []) {
HttpPost(json.general_msg_list,req.url,"getMsgJson.php");//这个函数和上面的一样是后文定义的,将第二页历史消息的json发送到自己的服务器
}
}catch(e){
console.log(e);
}
callback(serverResData);
}else if(/mp\/getappmsgext/i.test(req.url)){//当链接地址为公众号文章阅读量和点赞量时
try {
HttpPost(serverResData,req.url,"getMsgExt.php");//函数是后文定义的,功能是将文章阅读量点赞量的json发送到服务器
}catch(e){
}
callback(serverResData);
}else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//当链接地址为公众号文章时(rumor这个地址是公众号文章被辟谣了)
try {
var http = require('http');
http.get('http://xxx.com/getWxPost.php', function(res) {//这个地址是自己服务器上的另一个程序,目的是为了获取到下一个链接地址,将地址放在一个js脚本中,将页面自动跳转到下一页。后文将介绍getWxPost.php的原理。
res.on('data', function(chunk){
callback(chunk+serverResData);
})
});
}catch(e){
callback(serverResData);
}
}else{
callback(serverResData);
}
},
以上代码是使用anyproxy修改返回页面内容、向页面注入脚本、将页面内容发送到服务器的功能。利用这个原理批量处理采集公众号内容和阅读量。该脚本中自定义了一个函数,详细说明如下:
在 rule_default.js 文件末尾添加以下代码:
function HttpPost(str,url,path) {//将json发送到服务器,str为json内容,url为历史消息页面地址,path是接收程序的路径和文件名
var http = require('http');
var data = {
str: encodeURIComponent(str),
url: encodeURIComponent(url)
};
content = require('querystring').stringify(data);
var options = {
method: "POST",
host: "www.xxx.com",//注意没有http://,这是服务器的域名。
port: 80,
path: path,//接收程序的路径和文件名
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
"Content-Length": content.length
}
};
var req = http.request(options, function (res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
});
req.write(content);
req.end();
}
以上是规则修改的主要部分。您需要将json内容发送到您自己的服务器,并从服务器获取到下一页的跳转地址。这涉及到四个php文件:getMsgJson.php、getMsgExt.php、getWxHis.php、getWxPost.php
在详细介绍这4个php文件之前,为了提高采集系统性能,降低崩溃率,我们还可以做一些修改:
Android模拟器经常访问一些地址,会导致anyproxy崩溃,找到函数replaceRequestOption:function(req,option),修改函数内容:
replaceRequestOption : function(req,option){
var newOption = option;
if(/google/i.test(newOption.headers.host)){
newOption.hostname = "www.baidu.com";
newOption.port = "80";
}
return newOption;
},
以上是anyproxy的规则文件的修改配置。配置修改完成后,重启anyproxy。在mac系统下,按control+c中断程序,然后输入命令sudo anyproxy -i启动;如果报错,程序可能无法干净退出,端口被占用。这时候输入命令ps -a查看占用的pid,然后输入命令“kill -9 pid”将pid替换为查询到的pid号。杀掉进程后,就可以启动anyproxy了。再次请原谅我不熟悉windows命令。
接下来详细介绍服务器端接收程序的设计原理:
(以下代码不能直接使用,只介绍原理,部分需要根据自己的服务器数据库框架编写)
1、getMsgJson.php:该程序负责接收历史消息的json,解析并存入数据库
<p>
querylist采集微信公众号文章(爬取所有关于python的公众号文章,你了解多少? )
采集交流 • 优采云 发表了文章 • 0 个评论 • 149 次浏览 • 2021-12-31 17:22
)
前言
本文中的文字图片过滤网络可用于学习、交流,不具有任何商业用途。如果您有任何问题,请联系我们进行处理。
文章为基础开发环境爬取两个公众号:
1.抓取所有 文章
2、爬取所有关于python的公众号文章
爬取 文章
1、登录公众号后点击图片和文字
2、打开开发者工具
3、点击超链接
加载相关数据时,有一个数据包,包括文章标题、链接、摘要、发布时间等,你也可以选择其他公众号进行爬取,但这需要你有一个微信公众号。
添加cookie
import pprint
import time
import requests
import csv
f = open('青灯公众号文章.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '文章发布时间', '文章地址'])
csv_writer.writeheader()
for page in range(0, 40, 5):
url = f'https://mp.weixin.qq.com/cgi-b ... in%3D{page}&count=5&fakeid=&type=9&query=&token=1252678642&lang=zh_CN&f=json&ajax=1'
headers = {
'cookie': '加cookie',
'referer': 'https://mp.weixin.qq.com/cgi-b ... 39%3B,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
html_data = response.json()
pprint.pprint(response.json())
lis = html_data['app_msg_list']
for li in lis:
title = li['title']
link_url = li['link']
update_time = li['update_time']
timeArray = time.localtime(int(update_time))
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
dit = {
'标题': title,
'文章发布时间': otherStyleTime,
'文章地址': link_url,
}
csv_writer.writerow(dit)
print(dit)
爬取所有关于python的公众号文章
1、搜狗搜索python选择微信
注意:如果不登录,只能抓取前十页数据。登录后可以抓取2W多篇文章文章。
2.直接爬取静态网页的标题、公众号、文章地址、发帖时间。
import time
import requests
import parsel
import csv
f = open('公众号文章.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '公众号', '文章发布时间', '文章地址'])
csv_writer.writeheader()
for page in range(1, 2447):
url = f'https://weixin.sogou.com/weixi ... ge%3D{page}&ie=utf8'
headers = {
'Cookie': '自己的cookie',
'Host': 'weixin.sogou.com',
'Referer': 'https://www.sogou.com/web%3Fqu ... 39%3B,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
selector = parsel.Selector(response.text)
lis = selector.css('.news-list li')
for li in lis:
title_list = li.css('.txt-box h3 a::text').getall()
num = len(title_list)
if num == 1:
title_str = 'python' + title_list[0]
else:
title_str = 'python'.join(title_list)
href = li.css('.txt-box h3 a::attr(href)').get()
article_url = 'https://weixin.sogou.com' + href
name = li.css('.s-p a::text').get()
date = li.css('.s-p::attr(t)').get()
timeArray = time.localtime(int(date))
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
dit = {
'标题': title_str,
'公众号': name,
'文章发布时间': otherStyleTime,
'文章地址': article_url,
}
csv_writer.writerow(dit)
print(title_str, name, otherStyleTime, article_url)
查看全部
querylist采集微信公众号文章(爬取所有关于python的公众号文章,你了解多少?
)
前言
本文中的文字图片过滤网络可用于学习、交流,不具有任何商业用途。如果您有任何问题,请联系我们进行处理。
文章为基础开发环境爬取两个公众号:
1.抓取所有 文章
2、爬取所有关于python的公众号文章
爬取 文章
1、登录公众号后点击图片和文字

2、打开开发者工具

3、点击超链接

加载相关数据时,有一个数据包,包括文章标题、链接、摘要、发布时间等,你也可以选择其他公众号进行爬取,但这需要你有一个微信公众号。
添加cookie
import pprint
import time
import requests
import csv
f = open('青灯公众号文章.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '文章发布时间', '文章地址'])
csv_writer.writeheader()
for page in range(0, 40, 5):
url = f'https://mp.weixin.qq.com/cgi-b ... in%3D{page}&count=5&fakeid=&type=9&query=&token=1252678642&lang=zh_CN&f=json&ajax=1'
headers = {
'cookie': '加cookie',
'referer': 'https://mp.weixin.qq.com/cgi-b ... 39%3B,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
html_data = response.json()
pprint.pprint(response.json())
lis = html_data['app_msg_list']
for li in lis:
title = li['title']
link_url = li['link']
update_time = li['update_time']
timeArray = time.localtime(int(update_time))
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
dit = {
'标题': title,
'文章发布时间': otherStyleTime,
'文章地址': link_url,
}
csv_writer.writerow(dit)
print(dit)
爬取所有关于python的公众号文章
1、搜狗搜索python选择微信

注意:如果不登录,只能抓取前十页数据。登录后可以抓取2W多篇文章文章。
2.直接爬取静态网页的标题、公众号、文章地址、发帖时间。
import time
import requests
import parsel
import csv
f = open('公众号文章.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['标题', '公众号', '文章发布时间', '文章地址'])
csv_writer.writeheader()
for page in range(1, 2447):
url = f'https://weixin.sogou.com/weixi ... ge%3D{page}&ie=utf8'
headers = {
'Cookie': '自己的cookie',
'Host': 'weixin.sogou.com',
'Referer': 'https://www.sogou.com/web%3Fqu ... 39%3B,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
selector = parsel.Selector(response.text)
lis = selector.css('.news-list li')
for li in lis:
title_list = li.css('.txt-box h3 a::text').getall()
num = len(title_list)
if num == 1:
title_str = 'python' + title_list[0]
else:
title_str = 'python'.join(title_list)
href = li.css('.txt-box h3 a::attr(href)').get()
article_url = 'https://weixin.sogou.com' + href
name = li.css('.s-p a::text').get()
date = li.css('.s-p::attr(t)').get()
timeArray = time.localtime(int(date))
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
dit = {
'标题': title_str,
'公众号': name,
'文章发布时间': otherStyleTime,
'文章地址': article_url,
}
csv_writer.writerow(dit)
print(title_str, name, otherStyleTime, article_url)
