Python获取购物平台APP的评论内容
最近研究需要商品评论数据,参考学习了其他大佬的文章。根据我自己不同的数据需求,改写了一个可以爬取购物APP评论数据的爬虫。但是不完全自动,仅供参考和个人学习使用。
数据与结果示例
评论原数据(这里的APP页面我用vx电脑版转过来的,因为电脑连接手机获取APP页面对我来说有点麻烦)
手机APP评论界面(就不贴图了,可以自己试一下)
右键检查找到network,这里jsv=xxxxx&appkey=xxxxx就是我们要爬取的评论进入preview可以看到ratelist,一页有十条评论数据。如果找不到这个可以打开search输入你要爬取的数据搜索就可以找到。
接下来通过爬取就可以得到如下的结果存入excel表格。
你需要什么数据就爬什么,后面代码会有不同的正则表达式匹配数据
操作步骤
1用vx桌面版打开手机分享的APP商品界面
2用chrome或者edge打开要爬取的评论页面。
3右键检查进入network找到评论数据JS文件(找不到可以search)。这里要爬到数据就是要请求到正确的url(可以在headers中看到)可以看一下url的结构baseurl¶ms参数组合,这里一个重点就是t与sign是动态生成的。
4 request(1)python 模拟请求抓取数据包,,手动获取自己的cookies
#爬取的页面
import requests
#from pymongo import MongoClient
#from urllib.parse import urlencode
import re
import json,simplejson
import hashlib
import time
import pandas as pd
import csv
import xlwt,xlrd,xlutils.copy
from requests.exceptions import RequestException
#conn = MongoClient('127.0.0.1', 27017) # 连接 mongodb
#db = conn.xxxxx # 连接数据库,没有则自动创建
#my_set = db.meishi # 连接meishi表,没有则自动创建
# 获取请求需要的信息
def get_request_headers(page_num):
headers = {
'Connection': 'close',
'Content-Type':'application/json',
'accept':'*/*',
'accept-encoding':'gzip, deflate, br',
'accept-language':'zh-CN,zh;q=0.9',
'referer': 'https://h5.m.xxxxx.com/',
'user-agent': '这里写入你自己的agent,不同浏览器会不同一点',
'cookie': '这里写入你自己的cookie(以上参数都可以在响应头里找到复制)'
}
(2)获取参数,打开以下
所有参数都在这里,其中t,sign为动态生成的,auctionNumid商品ID,pagenum表示页数。
需要计算t和sign,其中t为当前时间戳,计算如下代码所示,
sign为token + ‘&’ + t + ‘&’ + appKey + ‘&’ + data这个合成字符串的md5加密结果,
其中token为cookie中有_m_h5_tk和_m_h5_tk_enc这两个参数,找到_m_h5_tk就是_m_h5的值加上时间戳,那么token就是前面的值,,比如:_m_h5_tk=abcd_1234,token=abcd
t已获取,appKey和data可以在参数组中得到复制就可
data='{"showTrueCount":**,"auctionNumId":"*复制你的*","rateType":"","pageSize":10,"pageNo":' + str(page_num) + '}'
t = str(int(time.time()*1000))#等于当前的时间戳乘以1000取整再转字符串
t/o/k/e/n = "******"#token 是 cookies中_m_h5_tk的_前的值,找到复制;
appKey = "12574478"
#sign =md5( token + '&' + t + '&' + appKey + '&' + data)
datas = token+'&'+t+'&'+appKey+'&'+data
sign = hashlib.md5() # 创建md5对象
sign.update(datas.encode()) # 使用md5加密要先编码,默认编码是utf-8
signs = sign.hexdigest() # 加密
#print('sign:' + signs)
#以上解出动态的sign值,传入到下面的参数
params = {
'jsv':'2.6.2',
'appKey': appKey,
't': t,
'sign': signs,#上面的解
'api':'mtop.xxxxxx.rate.detaillist.get',
'v':'4.0',
'ecode':'1',
'type':'jsonp',
'timeout':'20000',
'dataType':'jsonp',
'sessionOption':'AutoLoginOnly',
'jsonplncPrefix':'haloMtop',
'url':'https://mocks.xxxx-inc.com/mock/rate/h5/ratelist',
'method':'get',
'callback':'mtopjsonphaloMtop'+str(page_num),
'data': data#上面写好的data
}
# 返回请求头和要传的参数
return headers, params
至此有了正确的url就可以
def get_content(url, headers):
try:
response = requests.get(url, headers