抓取网页生成电子书(mitmdump爬取“得到”App电子书信息(一)_Python学习 )
优采云 发布时间: 2021-12-29 12:14抓取网页生成电子书(mitmdump爬取“得到”App电子书信息(一)_Python学习
)
前言
文章文字及图片来自网络,仅供学习交流之用。它们没有任何商业用途。版权属于原作者。如果您有任何问题,请联系我们进行处理。
PS:如需Python学习资料,可点击下方链接自行获取
Python免费学习资料和*敏*感*词*流答案 点击加入
mitmdump爬取“获取”App电子书信息
“Get”App是罗季思伟出品的碎片化时间学习App。应用中有很多学习资源。但是“获取”App没有对应的网页版,只能通过App获取信息。这次我们将通过抓取它的App来练习mitmdump的使用。
抓取目标
我们的爬取目标是App电子书版块中的电子书信息,并将信息保存到MongoDB中,如图。
我们想爬下书名、介绍、封面、价格,但是这次爬取的重点是了解mitmdump工具的使用,所以暂时不涉及自动爬取,操作应用程序仍然是手动执行的。mitmdump 负责捕获响应并提取和保存数据。
2. 准备
请确保您已经正确安装了mitmproxy和mitmdump,手机和PC在同一个局域网内,同时配置了mitmproxy的CA证书,安装了MongoDB并运行其服务,安装了PyMongo库。具体配置请参考第一章说明。
3. 爬取分析
首先查找URL,返回当前页面的内容。我们写一个脚本如下:
def response(flow):
print(flow.request.url)
print(flow.response.text)
这里只输出请求的URL和响应体内容,也就是请求链接和响应内容这两个最关键的部分。脚本的名称保存为 script.py。
接下来运行mitmdump,命令如下:
mitmdump -s script.py
打开“Get”App的电子书页面,在PC控制台上可以看到相应的输出。然后滑动页面加载更多电子书,控制台中出现的新输出内容就是App发出的新加载请求,里面收录
了下一页的电子书内容。控制台输出结果示例如图所示。
可以看到URL所在的界面,后面加了一个sign参数。通过URL的名称,可以确定这是获取电子书列表的接口。URL下面的输出是响应内容,是一个JSON格式的字符串。我们将其格式化为如图所示。
格式化的内容收录
ac 字段和一个列表字段。列表的每个元素都收录
价格、标题、描述等,第一个返回结果是电子书《*敏*感*词*》,此时App的内容也是这本电子书,描述的内容和价格也完全匹配。App页面如图所示。
这意味着当前接口是获取电子书信息的接口,我们只需要从该接口获取内容即可。然后解析返回的结果并将结果保存到数据库中。
4. 数据采集
接下来,我们需要对接口进行过滤和限制,抓取上面分析的接口,然后在结果中提取相应的字段。
在这里,我们修改脚本如下:
import json
from mitmproxy import ctx
def response(flow):
url = 'https://dedao.igetget.com/v3/discover/bookList'
if flow.request.url.startswith(url):
text = flow.response.text
data = json.loads(text)
books = data.get('c').get('list')
for book in books:
ctx.log.info(str(book))
再次滑动电子书页面,观察PC控制台上的输出,如图。
控制台输出
现在输出图书的所有信息,一个图书信息对应一条JSON格式的数据。
5. 提取并保存
接下来我们需要提取信息,然后将信息保存到数据库中。为方便起见,我们选择MongoDB数据库。
该脚本还可以添加用于提取信息和保存信息的部分。修改后的代码如下:
import json
import pymongo
from mitmproxy import ctx
client = pymongo.MongoClient('localhost')
db = client['igetget']
collection = db['books']
def response(flow):
global collection
url = 'https://dedao.igetget.com/v3/discover/bookList'
if flow.request.url.startswith(url):
text = flow.response.text
data = json.loads(text)
books = data.get('c').get('list')
for book in books:
data = {'title': book.get('operating_title'),
'cover': book.get('cover'),
'summary': book.get('other_share_summary'),
'price': book.get('price')
}
ctx.log.info(str(data))
collection.insert(data)
再次滑动页面,控制台会输出信息,如图。
现在输出的每一条内容都是提取出来的内容,包括电子书的书名、封面、描述、价格等信息。
一开始我们声明了MongoDB的数据库连接。提取信息后,调用对象的insert()方法将数据插入到数据库中。
滑动几页,发现所有书籍信息都保存在MongoDB中,如图。
至此,我们已经使用了一个非常简单的脚本来保存“Get”App的电子书信息。
代码部分
import json
import pymongo
from mitmproxy import ctx
client = pymongo.MongoClient('localhost')
db = client['igetget']
collection = db['books']
def response(flow):
global collection
url = 'https://dedao.igetget.com/v3/discover/bookList'
if flow.request.url.startswith(url):
text = flow.response.text
data = json.loads(text)
books = data.get('c').get('list')
for book in books:
data = {
'title': book.get('operating_title'),
'cover': book.get('cover'),
'summary': book.get('other_share_summary'),
'price': book.get('price')
}
ctx.log.info(str(data))
collection.insert(data)