python逆向微信指数爬取实现步骤

下面是“Python逆向微信指数爬取实现步骤”的完整攻略。

步骤一:安装依赖库

在开始实现微信指数爬取之前,需要安装一些依赖库:

  • requests:用于请求数据;
  • execjs:用于执行JS代码;
  • pandas:用于处理数据;
  • numpy:用于科学计算。

你可以使用以下命令进行安装:

pip install requests execjs pandas numpy

步骤二:爬虫初步

首先我们需要打开微信指数官网,在检查元素中,可以发现指数相关的数据是通过JS渲染的。但是如果我们直接访问JS链接得到的数据是无法直接处理的。因为微信指数有反爬虫机制,需要我们先访问/security/verifycode/取得验证码后,再带上验证码请求JS链接中的数据。

以下是取得验证码的示例代码:

import requests
import time

verify_session = requests.session()

def get_verify_img():
    url = "https://index.weixin.qq.com/security/verifycode/"
    headers = {
        "Referer": "https://index.weixin.qq.com/",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:61.0) Gecko/20100101 Firefox/61.0",
    }
    img = verify_session.get(url, headers=headers).content
    return img

def get_verify_code(img):
    url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
    headers = {
        "Content-Type": "application/x-www-form-urlencoded",
    }
    params = {
        "access_token": "your_access_token",
    }
    img_str = base64.b64encode(img).decode()
    data = {
        "image": img_str,
    }
    r = requests.post(url, headers=headers, params=params, data=data).json()
    code = r['words_result'][0]['words']
    return code

image = get_verify_img()
code = get_verify_code(image)
print('验证码:', code)

其中,get_verify_img()函数用于获取验证码图片,get_verify_code(img)函数调用百度的OCR接口完成验证码识别。这里需要你先去百度AI开放平台上注册账号,取得OCR接口的access_token

需要注意的是,微信指数每次打开页签时都会访问/security/verifycode/获取验证码,使用上述获取验证码的示例时需要注意:验证码只能使用一次,如果验证码使用错误,则需要重新请求获取。

步骤三:JS处理

除验证码之外,JS也是利用反爬虫机制的一种手段。通过浏览器开发者工具,我们可以获得JS链接。再通过JS解码得到请求URL和headers。

以下是JS解码代码示例:

import execjs

def decode_js(js):
    ctx = execjs.compile(js)
    return ctx.call('decode')

url = decode_js(js)['url']
headers = decode_js(js)['headers']

其中,decode_js(js)函数传入需要解码的JS代码,并完成解码操作。

步骤四:数据获取

完成前三步后,我们可以得到请求URL和headers。接下来,就是发送请求,获取数据的阶段。具体操作如下:

import pandas as pd
import json

def get_data():
    url = 'xxxxxx'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
        'Referer': 'https://index.weixin.qq.com/',
        'Cookie': 'xxxxxxxx', # 你的Cookie信息
    }
    params = {
        'r': 'index%2Fgetclassinfo',
        's': 'weixin',
        'c': 'main',
        'type': '1',
        'query': '',
        'begin_date': '20210425',
        'end_date': '20210425',
        'pagesize': '5',
        'page': '1',
        'needIndent': 'true',
        'needCircle': 'true',
        'uuid': 'xxxxxxxx', # 你的uuid信息
    }
    resp = requests.get(url, headers=headers, params=params)
    data = json.loads(resp.text)
    df = pd.DataFrame(data['data']['list'])
    return df

其中,get_data()函数完成请求操作,并将请求回来的数据转为DataFrame形式进行处理。

示例一:抓取公众号近七天的指数数据

以下是实现抓取的代码示例:

begin_date = '20210720' # 往前7天时间为:20210714
end_date = '20210720'
pages = 3 # 需要获取的页码数

df_all = pd.DataFrame()

for page in range(pages):
    df = get_data(page+1, begin_date, end_date)
    df_all = pd.concat([df_all, df], ignore_index=True)
    time.sleep(2)

df_all.to_excel('./微信指数数据.xlsx', index=False, encoding='utf-8')

其中,get_data(page, begin_date, end_date)函数完成了请求的操作,多页数据的获取我们可以使用for循环来完成。

示例二:抓取单个关键词在近七天的指数数据

以下是实现抓取的代码示例:

import datetime

keyword = 'python'
begin_date = '20210720' # 往前7天时间为:20210714
end_date = '20210720'

dt_begin = datetime.datetime.strptime(begin_date, '%Y%m%d').date()
dt_end = datetime.datetime.strptime(end_date, '%Y%m%d').date()

date_list = [datetime.datetime.strftime(dt_begin+datetime.timedelta(days=i), '%Y%m%d') for i in range((dt_end-dt_begin).days+1)]

df_all = pd.DataFrame()

for date in date_list:
    df = get_data(keyword, date, date)
    df_all = pd.concat([df_all, df], ignore_index=True)
    time.sleep(2)

df_all.to_excel('./微信指数数据.xlsx', index=False, encoding='utf-8')

其中,get_data(keyword, begin_date, end_date)函数完成了请求的操作,为了获取同一关键词在不同时间段的指数数据,我们需要使用datetime库和date_list列表,循环遍历每个时间点,调用get_data()函数并将结果进行拼接。

以上是Python逆向微信指数爬取的实现步骤和两条示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python逆向微信指数爬取实现步骤 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • python 数据保存为npy和npz格式并读取的完整代码

    下面给出Python保存为npy和npz格式并读取的完整攻略。 使用NumPy保存为npy格式 import numpy as np # 创建一个数组 arr = np.arange(10) # 保存为npy格式 np.save(‘arr.npy’, arr) # 读取npy格式文件 arr_load = np.load(‘arr.npy’) 上面的代码演示…

    python 2023年6月2日
    00
  • python 实现快速生成连续、随机字母列表

    实现快速生成连续、随机字母列表,可以通过Python内置的string模块来实现。该模块提供了一个字符串ascii_letters,包含所有字母的高校可打印ASCII字符集合。 生成连续字母列表 要生成连续字母列表,可以使用Python的切片和range()函数结合。代码示例如下: import string def consecutive_letters(…

    python 2023年6月3日
    00
  • 如何使用 Redis 的发布/订阅功能实现实时消息推送?

    以下是详细讲解如何使用 Redis 的发布/订阅功能实现实时消息推送的完整使用攻略。 Redis 发布/订阅简介 Redis 发布/订阅是 Redis 中的一种传递模式,用于实现发布/订阅功能。发布/订阅由两个部分组成:发布者和订阅者。发布者将消息发布到指定的频道,订阅者订阅指定的频道并接收消息。 Redis 发布/订阅实现实时消息推送 在 Redis 中,…

    python 2023年5月12日
    00
  • Python pickle模块实现对象序列化

    Python中的pickle模块可以将Python对象序列化为二进制流,并在需要时反序列化回原始对象。pickle模块广泛应用于 Python 中可用于本地存储或远程传输数据对象。本文将详细介绍Python pickle模块的使用。 序列化数据 在Python中,要使用pickle模块对对象进行序列化,需要导入pickle模块。标准的pickle模块提供了四…

    python 2023年6月2日
    00
  • 详解Python如何巧妙实现数学阶乘n!

    详解Python如何巧妙实现数学阶乘n! 什么是阶乘? 阶乘,即n的阶乘,表示为n!,是指从1到n相乘之积,其中n是一个正整数。 例如: 5! = 5 * 4 * 3 * 2 * 1 = 120 Python如何实现阶乘求解? Python中可以使用自带的math库或者自己编写函数实现阶乘的求解。其中,使用自带的math库可以直接使用其自带的阶乘函数fact…

    python 2023年5月18日
    00
  • 详解python3中socket套接字的编码问题解决

    要解决Python3中socket套接字的编码问题,我们需要了解以下几个概念和步骤: 编码和解码的概念:在Python中,编码的过程是将内存中的Unicode字符串转换成字节串形式,也就是二进制数据的形式。解码的过程相反,是将字节串转换成Unicode形式的字符串。 在socket编程中,数据需要以字节串(bytes)形式进行传输和接收。所以我们需要将字符串…

    python 2023年5月31日
    00
  • python中文乱码的解决方法

    下面是详细的攻略: Python 中文乱码的解决方法 1. 理解编码和解码 Python的字符编码遵循Unicode标准,但在不同的操作系统和编程环境下会有不同的默认字符编码,导致中文输出出现乱码等问题。解决中文输出乱码的问题,需要先理解编码和解码的概念。 编码: 把字符转换成字节序列的过程。因为计算机只能处理二进制数据,所以不能直接处理文本,需要先把文本转…

    python 2023年5月13日
    00
  • 在Python中实现shuffle给列表洗牌

    要在Python中实现给列表洗牌的功能,可以使用random模块中的shuffle函数。以下是实现的完整攻略。 步骤 导入random模块 import random 定义列表 mylist = [1, 2, 3, 4, 5] 使用shuffle函数洗牌 random.shuffle(mylist) 输出洗牌后的列表 print(mylist) 示例 以下是…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部