Python3简单实现微信爬虫
本篇文章将介绍如何使用Python3实现微信爬虫,并简单介绍一些爬虫的基础知识。
什么是微信爬虫
微信爬虫是指通过程序自动爬取微信公众号的文章、阅读量、点赞数等数据的技术。目前,微信不允许普通用户通过API或其他方式来获取公众号的文章数据,但是可以通过模拟登陆和数据抓取的方式实现爬取公众号的目的。
实现步骤
步骤一:模拟登陆
模拟登陆指的是用程序来模拟用户在微信网页版上登陆的过程,获取授权cookie,以达到后续爬取的目的。可以通过Selenium、Requests等库来实现模拟登陆。
下面是一个使用Requests库来模拟登陆的实例:
import requests
email = 'xxxxx'
pwd = 'xxxx'
def login():
url = 'https://mp.weixin.qq.com/'
headers = {
'Referer': 'https://mp.weixin.qq.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
s = requests.Session()
s.headers.update(headers)
res = s.get(url)
token = res.url.split('token=')[1]
data = {
'username': email,
'pwd': pwd,
'imgcode': '',
'f': 'json',
'token': token
}
post_url = 'https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin'
res = s.post(post_url, data=data)
ret = eval(res.content)
status = ret.get('base_resp').get('ret')
if status == 0:
print('login success!')
return s
else:
print('login error:', ret.get('base_resp').get('err_msg'))
步骤二:获取文章列表
微信公众号文章列表是通过Ajax动态加载的,我们可以模拟发送Ajax请求获取文章列表。
下面是一个使用Requests库来获取文章列表的实例:
import json
def get_page(s, begin=0):
query_id = '1000000015'
query_key = 'cbb36e512133a67f06a2600056f1fabd26d7494a03fcc3cbe7d5851a98ae7d44a851084658a471d44cf07078d43b4ca0ebedd2608bbd'
url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
params = {
'action': 'list_ex',
'begin': begin,
'count': '5',
'fakeid': 'xxxx',
'type': '9',
'query': '',
'token': '',
'lang': 'zh_CN',
'f': 'jsonp',
'ajax': '1',
'random': '0.7587945353390255',
'query_id': query_id,
'query_key': query_key,
}
res = s.get(url, params=params)
content = res.content.decode('utf-8')
content = content.replace('..\/', '')
content = content.replace('amp;', '')
content = content.replace('jsonpcallback', '')
content = content.replace('(', '')
content = content.replace(')', '')
content = content.strip()
data = json.loads(content)
return data.get('app_msg_list'), data.get('base_resp').get('total_count')
步骤三:获取文章信息
获取文章列表之后,我们需要对每篇文章进行遍历,并抓取相应的信息。我们可以抓取的信息包括:
- 文章标题
- 文章链接
- 阅读数
- 点赞数
- 发布时间
- 文章作者
- 文章摘要
下面是一个实现获取文章信息的示例:
import time
def get_article_info(s):
offset = 0
articles = []
while True:
article_list, count = get_page(s, offset)
if not article_list:
break
for article in article_list:
title = article.get('title')
link = article.get('link')
read_num = article.get('read_num')
like_num = article.get('like_num')
timestamp = article.get('create_time')
date_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp))
summary = article.get('digest')
author = article.get('author')
articles.append({
'title': title,
'link': link,
'read_num': read_num,
'like_num': like_num,
'datetime': date_time,
'summary': summary,
'author': author,
})
offset += len(article_list)
return articles
示例
示例一
以下代码展示了如何使用Python实现微信文章的阅读数和点赞数的爬取:
import requests
import re
def get_read_num_and_like_num(link):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36',
}
url = link + '&ascene=1&uin=MTU5NTAxODEyMA%3D%3D&devicetype=Windows+10+x64&version=62090076&nettype=WIFI&abtest_cookie=BQABAAoACwASABMAFQAFACOXHgBZ5keAKaZHgA%2Fmh4AP2seAAAA&lang=zh_CN&exportkey=AcMHPxzd4%2BbL4AUsP1KWA3U%3D&pass_ticket=4EB0ug846XCemllS3ZyV3z1WAy%2Fj4PvBhVf5XTcNBfw%3D&wx_header=1'
res = requests.get(url, headers=headers)
content = res.text
read_num = re.search(r'read_num":(\d+)', content).group(1)
like_num = re.search(r'like_num":(\d+)', content).group(1)
return read_num, like_num
link = 'https://mp.weixin.qq.com/s?src=11×tamp=1593587669&ver=2427&signature=ZSs7l1LdhH-pTJ1jiewJbN75fJmwdmCk1Nwzd4CVMDU20vi4lHRhCqmDYv-qXBFZ-DDghvRD*MZ7JZ3PnrG1vymN4Uc1f5-iiKkRCcy0Iy97eSU-Zdn678Uxh7k9-cly&new=1'
read_num, like_num = get_read_num_and_like_num(link)
print('阅读数:', read_num, '\t点赞数:', like_num)
示例二
以下代码展示了如何使用Python定时执行微信公众号爬取,并把数据存储到MySQL数据库中:
import time
import pymysql
from apscheduler.schedulers.blocking import BlockingScheduler
# 配置数据库连接信息
conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='weixin', charset='utf8mb4')
cursor = conn.cursor()
# 获取微信公众号列表
def get_gongzhonghao_list():
sql = "SELECT name, weixin_id FROM gongzhonghao;"
cursor.execute(sql)
rows = cursor.fetchall()
return rows
# 获取微信公众号文章列表
def get_article_list(s):
# TODO: 获取文章列表
pass
# 把文章列表存储到数据库中
def save_article_info(article_list, gzh_name):
for article in article_list:
sql = "INSERT INTO article (title, link, read_num, like_num, datetime, summary, author, gongzhonghao) VALUES (%s, %s, %s, %s, %s, %s, %s, %s);"
params = (article.get('title'), article.get('link'), article.get('read_num'), article.get('like_num'), article.get('datetime'), article.get('summary'), article.get('author'), gzh_name)
cursor.execute(sql, params)
conn.commit()
# 定时执行微信公众号爬取任务
def run():
s = check_login()
gzh_list = get_gongzhonghao_list()
for gzh in gzh_list:
gzh_name, weixin_id = gzh
article_list = get_article_list(s, weixin_id)
save_article_info(article_list, gzh_name)
if __name__ == '__main__':
scheduler = BlockingScheduler()
scheduler.add_job(run, 'interval', minutes=30) # 每隔30分钟执行一次爬取任务
scheduler.start()
总结
本文介绍了微信爬虫的实现步骤,包括模拟登陆、获取文章列表和获取文章信息等。同时,也给出了一些实际应用案例,希望对读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python3简单实现微信爬虫 - Python技术站