京东阅读校园版(汇云书舍)专为高校读者提供电子书畅读服务,拥有20万正版数字图书资源。App内有很多有质量的学习书籍供免费阅读。下面通过抓取其App上的电子书信息
我的爬取目标是App内计算机板块的电子书信息,并将其保存到MongoDB,如图1所示
把图书的名称、作者、字数、上架时间、简介爬取下来,App操作手动进行。mitmdump负责捕捉响应并将数据提取保存。
安装好了mitmproxy和mitmdump,手机和PC处于同一个局域网下,同时配置好mitmproxy的CA证书,安装好Mongodb。
新建一个脚本文件命名为 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
格式化后的data字段下的name、info、author、word_count_desc、created_desc 即为所找内容
下面只需要通过接口获取想要的内容即可,然后解析返回结果,将结果保存到数据库。
接下来我们对接口做出过滤,抓取如上分析的接口,再提取结果中的对应字段
注: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: