抓取网页生成电子书(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)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线