史上最快、最笨的公众号文章阅读数、在看数采集,哈哈

十点数据 1年前 ⋅ 4206 阅读

最快.jpg 先前写过一篇《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("你的文章地址")

上面这个是主类,运行以后的结果如下图:

结果.png

第二个类:模拟点击、键盘操作公共类:

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端的文章阅读数和在看数采集,大概就这么点东西,改天有空把第四种方式想办法实现以下。

全部评论: 0

    我有话说: