mitmdump爬取"京东读书校园版"App电子书信息

京东阅读校园版(汇云书舍)专为高校读者提供电子书畅读服务,拥有20万正版数字图书资源。App内有很多有质量的学习书籍供免费阅读。下面通过抓取其App上的电子书信息

1.爬取目标

我的爬取目标是App内计算机板块的电子书信息,并将其保存到MongoDB,如图1所示

mitmdump爬取

把图书的名称、作者、字数、上架时间、简介爬取下来,App操作手动进行。mitmdump负责捕捉响应并将数据提取保存。

2.准备工作

安装好了mitmproxy和mitmdump,手机和PC处于同一个局域网下,同时配置好mitmproxy的CA证书,安装好Mongodb。

3.抓取分析

新建一个脚本文件命名为 script.py
首先试探当前页面的URL和返回内容 script.py :

def response(flow):
    print(flow.request.url)
    print(flow.response.text)

运行命令 mitmdump

mitmdump - s script.py

打开App电子书页面,pc端有相应输出如图2所示

URL为 https://tob-api.jd.com/tob/api/category/5307/ebook?
通过URL可以看出这就是获取电子书列表的接口。URL下方是响应内容,为JSON格式的字符串,将其格式化,如图3
mitmdump爬取
格式化后的data字段下的name、info、author、word_count_desc、created_desc 即为所找内容
下面只需要通过接口获取想要的内容即可,然后解析返回结果,将结果保存到数据库。

4.数据获取、提取保存

接下来我们对接口做出过滤,抓取如上分析的接口,再提取结果中的对应字段

注:mitmproxy引入pymongo包会出现问题
所以曲线救国先将数据保存为txt文件,然后将txt文件读取保存到mongodb中

修改脚本如下:

#-*- coding: UTF-8 -*-
# @Time    :19-1-27 上午11:04
# @Author  :Zhou Chuang
from mitmproxy import ctx
import json


def write_to_file(content):
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')


def response(flow):
    url = 'https://tob-api.jd.com/tob/api/category/5307/ebook'
    if flow.request.url.startswith(url):   # 如果以url开头的
        text = flow.response.text
        data = json.loads(text)
        books = data.get('data').get('items')

        for book in books:
            data = {
                'bookname': book.get('name'),
                'author': book.get('author'),
                'words': book.get('word_count_desc'),
                'times': book.get('created_desc'),
                'info': book.get('info')
            }

            ctx.log.info(str(data))
            write_to_file(data)

通过insert()方法将数据插入到数据库

# @Time    :19-1-27 下午9:50
# @Author  :Zhou Chuang
import json
import pymongo

client = pymongo.MongoClient(host='localhost', port=27017)
db = client['test']
collection = db['jd_read']

f = open('result.txt', 'r+')
for i in f.readlines():
 new = json.loads(i)
 collection.insert(new)

现在滑动手机,发现图书信息都被保存到了result.txt中,然后运行第二个脚本,发现所有的图书信息都被保存到MongoDB中,一共爬取了7513本书籍的信息,如图4:
mitmdump爬取

你可能感兴趣的:(Python)