抓取网页生成电子书(得到App电子书信息“得到”App没有信息(组图) )
优采云 发布时间: 2022-01-20 12:12抓取网页生成电子书(得到App电子书信息“得到”App没有信息(组图)
)
PS:如需Python学习资料,可点击下方链接自行获取
mitmdump 爬取“获取”应用电子书信息
“Get”应用是罗吉思微出品的碎片化时间学习应用。该应用程序中有许多学习资源。但是“获取”app没有对应的网页版,所以必须通过app获取信息。这次我们通过抓取它的App来练习mitmdump的使用。
抓取目标
我们的爬取目标是App中电子书版块的电子书信息,并将信息保存到MongoDB中,如图。
我们需要爬取书名、简介、封面和价格。不过这次爬取的重点是了解mitmdump工具的用法,所以暂时不涉及自动爬取,app的操作还是手动完成。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
打开“获取”应用的电子书页面,可以在PC控制台看到相应的输出。然后滑动页面加载更多的电子书,控制台中新输出的内容就是App发送的新的加载请求,包括下一页的电子书内容。控制台输出的示例如图所示。
可以看到url就是接口,后面跟一个sign参数。从 URL 的名称可以确定这是获取电子书列表的接口。URL下面的输出是响应内容,是JSON格式的字符串,我们格式化如图。
格式化后的内容收录ac字段,一个list字段,list的每个元素都收录价格、书名、描述等。第一个返回的结果是电子书《*敏*感*词*》,App的内容也是这个e-此时book,描述内容和价格也完全匹配,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”应用程序的电子书信息。
代码部分
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)