下面是“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技术站