开始

我们的需求是给我们可爱的群管家 APP 导入一些群数据,因此我们需要到网上找一些大家发的群二维码或者加群需求。这样的网站很多,比如:

  • 豆瓣小组
  • 腾讯频道
  • 小红书
    这三个常用的 APP 相信大家都不陌生。关键是怎么样爬取呢,这里我先卖个关子。

安装 python、pycharm

不一定要使用 python 语言,但使用 python 可以帮我们多快好的实现目标。

python 下载链接:https://www.python.org/downloads/
pycharm 下载链接:https://www.jetbrains.com/zh-cn/pycharm/download/
后者是 python 的开发环境。激活地址:https://tvtyoma2gi.feishu.cn/docx/FCPAdBwSQoJVQIx19wccQXcYnjc

中间人攻击

使用 mitmproxy 可以进行中间人攻击,新建文件 groupList.py,并拦截 request 请求:

import mitmproxy.http

def response(flow: mitmproxy.http.HTTPFlow):

    if flow.request.host != "chanels.qq.com":
        return
    if flow.request.path != "/wechatGroup/query":
        return

    # 获取 page 参数
    urlencoded_form = flow.request.urlencoded_form
    page = urlencoded_form['page']
    # 获取 response
    text = flow.response.get_text()
    flow.response.set_text(text)

    fileName = 'groupList_page_' + page + '.json'

    with open(fileName, 'w') as f:  # 设置文件对象
        f.write(text)  # 将字符串写入文件中

命令行中注入 groupList.py 文件:

mitmweb -s groupList.py

入库

拿到的群信息只是 json 文件,我们需要入库。
pycharm 自带 sqlite,因此我们直接编写代码即可,借助相应 ORM 库,我们操作数据库就会更加简单,这里我们使用的是 sqlalchemy。

最后上代码:

database.py:

import sqlalchemy
from sqlalchemy import create_engine, Column, Integer, String, Boolean, Float, ForeignKey
from sqlalchemy.orm import sessionmaker, relationship

Base = sqlalchemy.orm.declarative_base()

class Group(Base):
    __tablename__ = 'groups'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    description = Column(String)
    createTime = Column(Integer)
    modifyTime = Column(Integer)
    auditInfo = Column(String)

class Database:
    def __init__(self, db_url):
        self.engine = create_engine(db_url, pool_size=100)
        Base.metadata.create_all(self.engine)
        self.Session = sessionmaker(bind=self.engine)

    def create_group(self, group_data):
        session = self.Session()

        group = Group(**group_data)
        session.add(group)
        session.commit()
        return group.id

    def get_group(self, group_id):
        session = self.Session()
        group = session.query(Group).get(group_id)
        return group

    def update_group(self, group_id, update_data):
        session = self.Session()
        session.query(Group).filter(Group.id == group_id).update(update_data)
        session.commit()

    def delete_group(self, group_id):
        session = self.Session()
        session.query(Group).filter(Group.id == group_id).delete()
        session.commit()

test.py:

import json
from db.database import Database

class Test:
    def __init__(self, filename, dbpath='sqlite:///groupinfo.db'):
        self.filename = filename
        # 创建数据库连接
        self.db = Database(dbpath)

    def __readFile(self):
        data = ''
        with open(self.filename, 'r', encoding='utf-8') as f:
            for line in f.readlines():
                line = line.strip()
                data += line
        return data

    def startRecord(self):
        jsonString = self.__readFile()
        # 将 JSON 数据解析为 Python 对象
        jsonObject = json.loads(jsonString)

        # 插入用户和群组数据
        for group in jsonObject['data']:

            group_record = self.db.get_group(group_id)
            if not group_record:
                # 插入组数据
                self.db.create_group(group)


for num in range(1, 13):
    fileName = 'groupList_page_' + str(num) + '.json'
    test = Test(fileName)
    test.startRecord()

直接运行 test.py 即可,

查看数据

借助 navicate 等可视化工具即可查看群列表信息。

总结

使用爬虫技术时记得遵守相关法律哦!