python点赞脚本_Python爬取评论、点赞等相
关信息
爬⾍⽅案分析(爬取⽂艺相处)
之前考虑过使⽤搜狗来爬取信息,不过搜狗提供的数据有诸多弊端,⽐如⽂章链接是临时的,⽂章没有阅读量等指标,所以考虑通过⼿机客户端利⽤ Python 爬⽂章。
因为公众平台并没有对外提供 Web 端⼊⼝,只能通过⼿机客户端查看⽂章,所以使⽤Fiddler来进⾏抓包,分析相关操作的请求信息,后⾯通过Python 代码来模拟请求。
抓取所有历史⽂章
使⽤ Fiddler 抓包⽅式,打开⼿机某个历史⽂章列表,上拉加载更多,此时可以到加载更多⽂章的 URL 请求地址:
分析response,⼏个字段信息:
ret:请求是否成功,0就表⽰成功
msg_count: 返回的数据条数
can_msg_continue: 是否还有下⼀页数据
next_offset: 下⼀次请求的起始位置
general_msg_list:真实数据
general_msg_list是历史⽂章⾥⾯的基本信息,包括每篇⽂章的标题、发布时间、摘要、链接地址、封⾯图等,⽽像⽂章的阅读数、点赞数、评论数、赞赏数这些数据都需要通过额外接⼝获取。
通过字段 can_msg_continue 确定是否继续抓取,再结合 next_offset 就可以加载更多数据,我们需要把 url 中可变的参数 offset ⽤变量来代替,递归调⽤直到 can_msg_continue 为 0 说明所有⽂章都爬取完了。
class WeiXinCrawler:
def crawl(self, offset=0):
"""
爬取更多⽂章
"""
# appmsg_token需刷新
url = "mp.weixin.qq/mp/profile_ext?" \
"action=getmsg&" \
"__biz=MzUzNTcwNDkxNA==&" \
"f=json&offset={offset}&" \
"count=10&is_ok=1&scene=124&uin=777&key=777&" \
"pass_ticket=z%2FYMNxHa1GuVS1pHj99nPCf1uwQrkEaSJeztTLDcQCGGJx%2BH5evDSY9ooI3nDLQx&" \
"wxtoken=&" \
"appmsg_token=954_X70f2Zp%252BnwCvfxt6YdRWgETK3fRaWtXY80tJfQ~~&x5=1&" \
"f=json".format(offset=offset)
# 从 Fiddler 获取最新的请求头参数
headers = """
省略
"""
# 将"Host: mp.weixin.qq"格式的字符串转换成字典类型转换成字典类型
headers = utils.headers_to_dict(headers)
response = (url, headers=headers, verify=False)
result = response.json()
("ret") == 0:
msg_list = ("general_msg_list")
logger.info("抓取数据:offset=%s, data=%s" % (offset, msg_list))
self.save(msg_list)
# 递归调⽤直到 can_msg_continue 为 0 说明所有⽂章都爬取完了
has_next = ("can_msg_continue")
if has_next == 1:
next_offset = ("next_offset") #下⼀次请求的起始位置
time.sleep(2)
else:
# 错误消息
<("请求参数失效,请重新设置")
exit()
将爬取的⽂章存储到MongoDB
关于数据的存储有很多选择,最简单的⽅式就是直接保存到 csv ⽂件中,这种⽅式操作简单,适合数据量少的情况,Python的标准库 csv 模块就可以直接⽀持。如果遇到数据量⾮常⼤的情况,就必须要⽤到专业的数据库系统,既可以使⽤ MySQL 这样的关系型数据库,也可以使⽤ MongoDB ⼀类的⽂档型数据库。⽤Python 操作 MongoDB ⾮常⽅便,⽆需定义表结构就可以直接将数据插⼊,所以使⽤MongoDB 来存储数据。
连接数据库 # 连接 mongodb
connect('ssq_weixin', host='localhost', port=27017)
定义数据模型 class Post(Document):
"""
⽂章信息
"""
title = StringField() # ⽂章标题
content_url = StringField() # ⽂章链接
content = StringField() # ⽂章内容
digest = StringField() # ⽂章摘要
cover = URLField(validation=None) # 封⾯图
p_date = DateTimeField() # 推送时间
read_num = IntField(default=0) # 阅读数
like_num = IntField(default=0) # 点赞数
comment_num = IntField(default=0) # 评论数
reward_num = IntField(default=0) # 赞赏数
author = StringField() # 作者
u_date = DateTimeField(w) # 最后更新时间
获取⽂章标题、⽂章链接等信息存⼊数据库 @staticmethod
def save(msg_list):
msg_list = place("\/", "/")
data = json.loads(msg_list)
msg_list = ("list")
for msg in msg_list:
p_date = ("comm_msg_info").get("datetime")
msg_info = ("app_msg_ext_info") # ⾮图⽂消息没有此字段
if msg_info:
WeiXinCrawler._insert(msg_info, p_date)
multi_msg_info = ("multi_app_msg_item_list")
for msg_item in multi_msg_info:
WeiXinCrawler._insert(msg_item, p_date)
else:
logger.warning(u"此消息不是图⽂推送,data=%s" % json.("comm_msg_info"))) @staticmethod
def _insert(item, p_date):
keys = ('title', 'author', 'content_url', 'digest', 'cover', 'source_url')
sub_data = utils.sub_dict(item, keys)
post = Post(**sub_data)
p_date = datetime.fromtimestamp(p_date)
post["p_date"] = p_date
logger.info('save data %s ' % post.title)
try:
post.save()
except Exception as e:
代码转换("保存失败 data=%s" % _json(), exc_info=True)
获取阅读数、点赞数、赞赏数
取之前存取的 content_url 中的参数和获取点赞数的接⼝的body参数中,除了 chksm 其它⼏个参数都在,我们把 content_url 中的参数替换到body中 再来验证请求会不会正常返回数据。经过多次实验是ok的。
# 这个参数是从Fiddler中拷贝出 URL,然后提取出查询参数部分再转换成字典对象
# 稍后会作为参数传给request.post⽅法
data_url_params = {
将url中的查询参数转换为字典格式
}
body = '⾃⼰的请求体'
data = utils.str_to_dict(body, "&", "=") #将body的字符串转换为字典格式
data.update(content_url_params)
data_url = "mp.weixin.qq/mp/getappmsgext"
r = requests.post(data_url, data=data, verify=False, params=data_url_params, headers=headers)
开⼯:
if __name__ == '__main__':
crawler = WeiXinCrawler()
for post in Post.objects(reward_num=0):
crawler.update_post(post)
time.sleep(5) #sleep时间稍微久点,防⽌出现301错误
可以愉快的爬取啦!
数据分析、可视化
后续可以利⽤Pandas对爬取的数据进⾏数据,通过Matplotlib 对数据进⾏可视化展⽰。时间有限暂时先不做了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论