微信文章采集软件(微信公众号爬虫动态获取selenium有一个官网的方法 )

优采云 发布时间: 2021-10-28 16:02

  微信文章采集软件(微信公众号爬虫动态获取selenium有一个官网的方法

)

  实现这个功能主要使用selenium、mitmproxy和微信文章。Selenium可以通过脚本模拟浏览器访问,mitmproxy配合微信文章获取文章信息。

  参考文章:

  Python爬取微信公众号文章(含文章内容和图片)

  记一次微信公众号爬虫体验(微信文章阅读喜欢获取)

  微信公众号文章全自动采集(使用mitmproxy抓包,然后使用pywinauto实现自动点击)微信app_msg动态获取

  硒

  Selenium 有官网,建议通过官网教程上手。入门主要有两步(我用的是python),一是安装python包,二是下载浏览器的驱动文件,设置环境变量。

  中间件

  mitmproxy也有官网,在官网文档的Getting Started里有写。它默认侦听本地端口 8080。通过这个代理,我们可以获取网络传输中的数据包。要使用它,我们需要设置代理。因为后面需要监控微信客户端的数据包的发送和接收,所以我直接设置了系统的代理。

  可以直接在windows桌面的搜索栏中搜索“代理”,可以找到“代理服务器设置”,然后如图所示手动设置代理。

  

  具体实施过程

  具体步骤分为两步:

  文章 获取链接

  按照上面第一篇参考文章的方法获取文章的链接。值得一提的是,只要有微信和邮箱,就可以注册订阅号。订阅号绑定到这个邮箱后,就不能再绑定其他东西了,比如小程序。一开始我的微信邮箱绑定了一个小程序,然后我用微信登录的时候就只有小程序的选项了。这时候你只需要再创建一个邮箱,然后注册一个订阅账号即可。

  公众号管理界面可能与上面文章中提到的有所不同,但实际上并没有太大变化。只需新建图文消息,即可进入链接文章界面引用的公众号。

  

  使用两个文件 login.py 和 get_article_link.py 来获取所有 文章 链接。首先使用login.py获取cookies,然后使用get_articleInfo.py获取文章链接。使用的时候发现这个网页也有反爬虫机制。发生错误后,它将等待几个小时才能继续。

  和参考文章的区别是我用的是Edge浏览器,然后在获取文章链接的同时得到了文章的发布时间。具体参数需要参考原文。

  # -!- coding: utf-8 -!-

# login.py 用于保存微信帐号登录信息

# 以下代码中的微信登录帐号密码需要修改

from selenium import webdriver

import time

import json

driver = webdriver.Edge()

driver.get("https://mp.weixin.qq.com/") # 微信公众平台网址

driver.find_element_by_link_text("使用帐号登录").click() # 切换到用帐号密码登录

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

driver.find_element_by_name("account").send_keys("帐号") # 自己的微信公众号

time.sleep(2)

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

driver.find_element_by_name("password").send_keys("密码") # 自己的微信公众号密码

driver.find_element_by_class_name("icon_checkbox").click()

time.sleep(2)

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

time.sleep(15)

#此时会弹出扫码页面,需要微信扫码

cookies = driver.get_cookies() # 获取登录后的cookies

print(cookies)

cookie = {}

for items in cookies:

cookie[items.get("name")] = items.get("value")

# 将cookies写入到本地文件,供以后程序访问公众号时携带作为身份识别用

with open('cookies.txt', "w") as file:

# 写入转成字符串的字典

file.write(json.dumps(cookie))

  # -*- coding:utf-8 -*-

# get_article_link.py

# 参考第一篇文章链接,需要对一些参数进行修改

# 在参考文章的基础上,增加了文章发布时间的条目

import requests

import json

import re

import time

with open("cookies.txt", "r") as file:

cookie = file.read()

cookies = json.loads(cookie)

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

response = requests.get(url, cookies=cookies)

print(response.url)

token = re.findall(r'token=(\d+)', str(response.url))[0] # 从url中获取token

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50", # 需要根据需求修改

"Referer": "https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=77&createType=0&token="+token+"&lang=zh_CN", # 需要根据需求修改

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

}

with open('article_link.txt', "w", encoding='utf-8') as file:

for j in range(1, 53, 1): # 循环次数根据实际情况进行设置

begin = (j-1)*5

requestUrl = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin="+str(begin)+"&count=5&fakeid=MzU4MjY2OTY2NQ==&type=9&query=&token="+token+"&lang=zh_CN&f=json&ajax=1"

search_response = requests.get(requestUrl, cookies=cookies, headers=headers)

re_text = search_response.json()

list = re_text.get("app_msg_list")

for i in list:

timestr = i["create_time"]

timeArray = time.localtime(int(timestr))

otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray) # 文章发布时间

file.write(i["aid"]+""+i["title"]+""+i["link"] + "" + otherStyleTime + "\n")

print(i["aid"]+""+i["title"]+""+i["link"] + "" + otherStyleTime)

time.sleep(20)

  得到的文本文件可以导入Excel制作表格。选择从Excel中的文本导入数据,并将分隔符设置为“”。导入的时候遇到一个小问题,有的地方不识别这个分割符。我将文本文件中的所有组件编号都替换为这个“”“”“”,然后用Excel导入就没有问题了。

  获取文章信息

  获取文章信息参考第二、三篇文章。如果想获取微信公众号文章的阅读量、点赞等信息,在浏览器中打开微信公众号文章是没有用的。只有通过微信打开才能获得这些信息。所以在第三篇文章中,原作者做了一个脚本来自动控制微信,点击文件传输助手中的文章链接,生成一个带有cookie和appmsg_token的包。但是如果文章的数量比较少的话,其实可以手动点一下。经测试,每次获取的cookie和appmsg_token至少可以获取100条文章信息。

  # -*- coding:utf-8 -*-

# write_cookies.py

import urllib

import sys

from mitmproxy import ctx

from mitmproxy import io, http

# command: mitmdump -s write_cookies.py -w dat mp.weixin.qq.com/mp/getappmsgext

class WriterCookie:

"""

mitmproxy的*敏*感*词*脚本,写入cookie和url到文件

"""

def __init__(self,outfile: str) -> None:

self.f = open(outfile, "w")

def response(self, flow: http.HTTPFlow) -> None:

"""

完整的response响应

:param flow: flow实例,

"""

# 获取url

url = urllib.parse.unquote(flow.request.url)

# 将url和cookie写入文件

if "mp.weixin.qq.com/mp/getappmsgext" in url:

self.f.write(url + '\n')

self.f.write(str(flow.request.cookies))

self.f.close()

# 退出

exit()

# 第四个命令中的参数

addons = [WriterCookie(sys.argv[4])]

  write_cookies.py是mitmproxy的监控脚本,从下面的命令可以看出。当它侦听请求包“/mp/getappmsgext”时,它保存请求包的内容。这种请求是微信每次打开公众号文章时发送的请求包。

  "mitmdump -s {}/write_cookies.py -w {} mp.weixin.qq.com/mp/getappmsgext".format('./cookie.txt')

  # -*- coding:utf-8 -*-

# get_Info.py

import re

import os

import threading

from wechatarticles import ArticlesInfo

import time

class ReadCookie(object):

"""

启动write_cookie.py 和 解析cookie文件,

"""

def __init__(self,outfile):

self.outfile = outfile

print(self.outfile)

def parse_cookie(self):

"""

解析cookie

:return: appmsg_token, biz, cookie_str·

"""

with open(self.outfile) as f:

data = f.read()

appmsg_token_string = re.findall("appmsg_token.+?&", data)[0].split('=')[1]

cookies = re.findall(r"\['(.*?)'\]", data)

Wechat_cookies = {}

for cookie in cookies:

cookie = cookie.split("', '")

Wechat_cookies[cookie[0]] = cookie[1]

return appmsg_token_string,Wechat_cookies

def write_cookie(self):

"""

启动 write_cookies。py

:return:

"""

#当前文件路径

path = os.path.split(os.path.realpath(__file__))[0]

#path = os.getcwd()

print(path)

# mitmdump -s 执行脚本 -w 保存到文件 本命令

command = "mitmdump -s {}/write_cookies.py -w {} mp.weixin.qq.com/mp/getappmsgext".format(

path,self.outfile)

os.system(command)

def get_cookie():

rc = ReadCookie('cookie.txt')

rc.write_cookie()

appmsg_token_string, cookies = rc.parse_cookie()

return appmsg_token_string, cookies

fp_src = open('links.txt', 'r')

fp_dst = open('articleInfo.txt', 'w')

count = 0

while True:

# 登录微信PC端获取文章信息

appmsg_token, cookies = get_cookie()

# print(appmsg_token_string)

cookie = ''

for ck in cookies.items():

if not cookie:

cookie = cookie + ck[0] + '=' + ck[1]

else:

cookie = cookie + '; ' + ck[0] + '=' + ck[1]

print(cookie)

for i in range(100):

url = fp_src.readline()

if not url:

break

article_url = url

test = ArticlesInfo(appmsg_token, cookie)

read_num, like_num, old_like_num = test.read_like_nums(article_url)

count = count + 1

print(str(count) + " read_like_num:", read_num, like_num, old_like_num)

fp_dst.write(str(read_num) + ';' + str(like_num) + ';' + str(old_like_num) + '\n')

time.sleep(3)

  解析*敏*感*词*到的包后,就可以得到我们需要的cookie和appmsg_token,然后获取微信公众号的文章信息,重复100次,然后更新cookie和appmsg_token。在此之前,我已经将文章的所有链接预先保存在一个文本文件“links.txt”中,每次从中读取一行,都是一个文章链接。

  

  然后每100条记录后,我手动点击文件传输窗口中的链接,即每次命令行提示以下信息时,我点击上面文件传输助手中的链接更新cookie和appmsg_token。

  Proxy server listening at http://*:8080

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线