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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线