目标概述
- 目标:爬取“得到”App电子版块的电子书信息,把图书的名称、简介、封面、价格爬取下来,测试demo
- 准备工作:安装好mitmproxy和mitmdump,手机和PC处于同一个局域网下,同时配置好mitmproxy的CA证书
- mitmdump一些方法介绍使用了解
- 如需存储数据,则安装好MongoDB并运行其服务,安装PyMongo库
1、请求分析
- 首先探寻当前页面的URL和返回内容,mitmdump -s script.py运行以下脚本;
#文件名 script.py def response(flow): print(flow.request.url) print(flow.response.text)
- 打开得到App电子书界面,便可以看到PC端输出内容;但是在不断加载过程中控制台会出现程序卡死(windows滴滴响);
- 因此,我直接在控制台输出mitmweb,然后打开得到App电子书界面,在网页中分析当前页面的URL和返回内容
- 如图可以看到,url为 https://entree.igetget.com/ebook2/v1/ebook/list 的接口,分析后可以确定这是获取电子书列表的接口,查看响应内容,是一个JSON格式的字符串,可见其中包含一个c字段,一个list字段,list的每个元素都包含名称、简介、封面、价格等内容
- 这说明当前接口就是获取电子书信息的接口,我们需要从这个接口来获取内容,然解析返回结果,保存到数据库
2、数据抓取
- 在控制台输出以下命令mitmdump -s script.py,其中script.py文件内容如下
import json from mitmproxy import ctx def response(flow): url = 'https://entree.igetget.com/ebook2/v1/ebook/list' if flow.request.url.startswith(url): text = flow.response.text data = json.loads(text) books = data['c']['list'] for book in books: data = { 'name': book['book_name'], 'intro': book['book_intro'], 'price': book['price'], 'cover': book['cover'] } ctx.log.info(str(data))
- 打开得到APP电子书界面,此时就会输出提取的结果,一本图书对应一条JSON格式的数据
3、提取保存
- 控制台输出以下命令mitmdump -s script.py,其中script.py文件内容如下,重新滑动得到App电子书界面,就可以将信息保存下来
import json from mitmproxy import ctx import pymongo def response(flow): client = pymongo.MongoClient('localhost', port=27017) db = client.igetget collection = db.books url = 'https://entree.igetget.com/ebook2/v1/ebook/list' if flow.request.url.startswith(url): text = flow.response.text data = json.loads(text) books = data['c']['list'] for book in books: data = { 'name': book['book_name'], 'intro': book['book_intro'], 'price': book['price'], 'cover': book['cover'] } ctx.log.info(str(data)) collection.insert_one(data)