开始
我们的需求是给我们可爱的群管家 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 等可视化工具即可查看群列表信息。
总结
使用爬虫技术时记得遵守相关法律哦!