python3简单实现微信爬虫

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&timestamp=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技术站

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

相关文章

  • Django视图之ORM数据库查询操作API的实例

    Django是一个用Python编写的Web框架,其中的ORM(Object-relational mapping)提供了一种以面向对象的方式操作数据库的方法,而ORM数据库查询操作API是Django ORM的核心组件之一,它可以让我们更方便的对数据进行操作。下面是实现ORM数据库查询操作API的步骤。 1. 配置数据库 在Django中使用ORM进行数据…

    python 2023年5月14日
    00
  • python3 删除所有自定义变量的操作

    针对Python3删除所有自定义变量的操作,我将分以下几个部分进行讲解: 所谓自定义变量,指的是在程序中手动创建的变量。在Python中,可以使用del语句来删除变量。del语句的一般形式是 del 变量名,例如:删除一个名为’num’的整数变量,可以这样写: python num = 10 del num 如果你想要删除所有自定义变量,可以使用global…

    python 2023年6月6日
    00
  • Python Pandas批量读取csv文件到dataframe的方法

    Python Pandas是一个强大的数据分析工具,支持读取多种数据格式,包括csv文件。在处理大量的数据时,我们需要批量读取多个csv文件到dataframe中,并能够进行合并和分析。下面就来详细讲解一下Python Pandas批量读取csv文件到dataframe的方法。 方法一:使用for循环逐个读取并合并 使用for循环逐个读取csv文件,并将文件…

    python 2023年6月3日
    00
  • Python中threading库实现线程锁与释放锁

    当多个线程需要同时访问同一个共享资源时,可能会导致数据不一致或者丢失。为了避免这个问题,就需要使用线程锁来互斥访问共享资源。Python中提供了threading库来实现多线程编程,其中线程锁的实现方式非常简单。 线程锁的基本使用方法 Python中,可以使用threading.Lock()方法来创建线程锁,然后使用acquire()方法来获得锁,使用rel…

    python 2023年5月19日
    00
  • python中os模块和sys模块的使用详解

    下面为您讲解”Python中os模块和sys模块的使用详解”。 1. OS模块 1.1. OS模块概述 Python中os模块是与操作系统进行交互的一个标准库模块,它包含了很多处理操作系统相关任务的函数。具体来说,它可以用来执行诸如文件操作、进程管理、环境变量配置等一系列系统操作。在程序运行的过程中,我们经常需要动态地获取当前文件或目录的路径、在指定路径下创…

    python 2023年5月30日
    00
  • Django笔记十七之group by 分组用法总结

    本文首发于微信公众号:Hunter后端原文链接:Django笔记十七之group by 分组用法总结 这篇笔记介绍 Django 里面 model 的 group by 对应的一些操作。 用到的 Model 如下: class TestModel(models.Model): num = models.IntegerField() user_id = mod…

    python 2023年4月18日
    00
  • Python Pandas学习之series的二元运算详解

    Python Pandas学习之series的二元运算详解 在Pandas中,Series对象可以通过一些特殊的方式进行计算和操作。本文将介绍Series对象的二元运算,即针对两个Series对象进行如加、减、乘、除等运算的操作。 二元运算符 Pandas中常见的二元运算符有: 加号(+) 减号(-) 乘号(*) 除号(/) 模(%) 整除(//) 幂(**…

    python 2023年5月14日
    00
  • 利用Python实现颜色色值转换的小工具

    下面是详细讲解: 利用Python实现颜色色值转换的小工具 介绍 在开发图像处理、数据可视化等项目时,可能需要对颜色色值进行转换,以满足不同场景的需求。利用Python的各种库和工具,我们可以很方便地完成这一任务。本文将介绍如何使用Python实现颜色色值转换的小工具。 工具实现的功能 本工具主要完成以下功能: RGB、HSV、CMYK、十六进制等常见颜色色…

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