先前写过一篇《Python爬虫实践:如何快速、高效的爬取微信公众号阅读在看》的文章,里面介绍了四种公众号阅读数、在看数的采集方法,分别是:
第一种:使用第三方的平台获取
第二种方法:使用PC端模拟点击;
第三种:使用第三方工具;
第四种:基于微信公众号平台的方式;
今天抽空把第二种
方式实现了,把代码贴出来供大家参考。其中分为两个类,一个是模拟点击等操作的公共类;一个是具体执行模拟操作,进行数据采集的类。具体介绍如下:
开发环境
Python3.6+
源代码:
第一个类:模拟点击公共类:
import time, random, pyperclip
from com.fy.plugs.mouse.pymouse.PyMousePlugs import PyMousePlugs
class CrawlerClickAndLook:
def __init__(self):
self.pmp = PyMousePlugs()
print(self.pmp .x_dim, self.pmp .y_dim)
def control(self, url):
try:
self.pmp.click(60, self.pmp .y_dim) #点击任务栏微信快捷方式;
time.sleep(0.5)
self.pmp.click(400, 480)#点击输入区,把鼠标置于输入状态;
time.sleep(0.5)
self.pmp.input(url)#输入链接
time.sleep(0.5)
self.pmp.kb.tap_key(self.pmp.kb.enter_key)#回车,进行信息发送;
time.sleep(0.5)
self.pmp.click(600, 370)#打开连接
time.sleep(random.randint(2, 4))#等待内容加载完毕
self.pmp.kb.press_keys([self.pmp.kb.control_r_key, 'a'])#全选
time.sleep(0.5)
self.pmp.kb.press_keys([self.pmp.kb.control_r_key, 'c'])#复制;
time.sleep(0.5)
text = pyperclip.paste()
if "阅读 "in text:
index = text.index("阅读 ")
click = text[index:]
for kw in click.split("\n"):
if "阅读 " in kw:
print("阅读:", kw.replace("阅读", "").strip())
elif "在看" in kw:
print("在看:", kw.replace("在看", "").strip())
self.pmp.click(self.pmp .x_dim - 15, 15)#关闭详情页;
return
print(text)
except:pass
if __name__ == '__main__':
owc = CrawlerClickAndLook()
owc.control("你的文章地址")
上面这个是主类
,运行以后的结果如下图:
第二个类:模拟点击、键盘操作公共类:
from pymouse import PyMouse
from pykeyboard import PyKeyboard
import pyperclip
from com.fy.utils.date.DateUtils import Date_Utils
class PyMousePlugs:
def __init__(self):
self.du = Date_Utils()
self.pm = PyMouse()
self.kb = PyKeyboard()
self.x_dim, self.y_dim = self.pm.screen_size() #–获得屏幕尺寸
#向输入框中输入内容,解决了汉字无法输入的问题;
def input(self, kw):
pyperclip.copy(kw)#把待写入输入框的内容,添加到剪切板中;
#以下语句模拟键盘点击ctrl+v
self.kb.press_key(self.kb.control_key)
self.kb.tap_key('v')
self.kb.release_key(self.kb.control_key)
def click(self, x, y):
self.pm.click(x, y)#点击
#多功能点击
def clickMulti(self, x:"x轴坐标位置", y:"y轴坐标位置", button:"–1表示左键,2表示点击右键",
n:"–点击次数,默认是1次,2表示双击"):
self.pm.click(x, y, button, n)# –鼠标点击
def option(self):
return self.pm.position()#获取鼠标位置
def enter(self):
self.kb.tap_key(self.kb.enter_key)#回车
def selectAll(self):
self.pmp.kb.press_keys([self.pmp.kb.control_r_key, 'a'])#选择全部
def selectAndCopyAll(self):
self.selectAll()
self.pmp.kb.press_keys([self.pmp.kb.control_r_key, 'c'])#选择并复制
上面两个类,拷贝到Python开发工具中,可以直接运行,不过记得修改一下第一个类中click的x、y轴坐标点。
坐标点的确定很简单,按下“Ctrl+Alt+A”截屏时,不断变动的那两个数值即是x、y坐标轴位置。
注意事项:
1:由于是模拟点击,所以两次点击之间最好有等待间隔,如0.5秒;
2:环境受限。该种方法必须独占一台电脑,因为是模拟点击,所以不能有其他人使用;
3:速度受限。
4:该种方法可以结合FastAPI,对外提供接口,实时调用;
5:处理的URL受限。
一个微信号每天大概能处理8000个请求(不同环境下可能有差异),所以当前方法不太适合大批量的实时处理。可以用于临时获取一批文章的阅读数;
基于微信PC端的文章阅读数和在看数采集,大概就这么点东西,改天有空把第四种方式想办法实现以下。