Python爬取起点小说并保存到本地MongoDB数据库中
工具:Python3.7 + Mongo4.0 + Pycharm
"""
爬取起点小说《诡秘之主》步骤分析:
第一步:打开《诡秘之主》的目录网页:https://book.qidian.com/info/1010868264#Catalog
第二步:F12进入开发者模式,分析网页结构.获取页面html并输出到txt文件中,发现返回的html信息不全,包含章节链接的
body标签部分没有被爬取到,说明网站做了反爬措施。既然这个页面是动态加载的,故可能应用ajax与后端数据库进行了数据交互,
然后渲染到了页面上,我们只需拦截这次交互请求,获取到交互的数据即可。
第三步:打开网页 https://book.qidian.com/info/1010868264#Catalog ,再次点击F12,因为是要找到数据交互,
故点击network里的XHR请求,精确捕获XHR对象,我们发现一个url位
https://book.qidian.com/ajax/book/category?_csrfToken=SpY3u9zug9id6nAlhEshXZZcYbovrL2uYNzTtCfJ&bookId=1010868264
的请求返回的response是一个包含所有卷章节id的json对象,这就是我们要寻找的交互数据。
第四步:获取该response返回的json数据,从中获取每一卷的章节链接地址、卷名、该卷章节总数并存入列表中
第五步:将小说保存到MongoDB数据库中
注意:由于《诡秘之主》为付费小说,故仅可爬取免费部分,付费部分爬取下来的内容均为上架感言。
"""
import json
import os
import re
import pymongo
import requests
from bs4 import BeautifulSoup
def getJson(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/83.0.4103.116 Safari/537.36 ',
'Referer': 'https://book.qidian.com/info/1010868264',
'Cookie': '_csrfToken=SpY3u9zug9id6nAlhEshXZZcYbovrL2uYNzTtCfJ; newstatisticUUID=1593610130_492072764; '
'qdrs=0%7C3%7C0%7C0%7C1; showSectionCommentGuide=1; qdgd=1; se_ref=baidu; '
'e1=%7B%22pid%22%3A%22qd_P_limitfree%22%2C%22eid%22%3A%22qd_E04%22%2C%22l1%22%3A5%7D; '
'e2=%7B%22pid%22%3A%22qd_P_fin%22%2C%22eid%22%3A%22qd_A18%22%2C%22l1%22%3A3%7D; '
'rcr=1010868264%2C1020090606%2C107580; '
'lrbc=1010868264%7C402733549%7C0%2C1020090606%7C526624856%7C0%2C107580%7C4631519%7C0 '
}
try:
response = requests.get(url=url, params=headers)
if response.status_code == 200:
response.encoding = 'utf-8'
json_str = response.text
list_res = json.loads(json_str)['data']['vs']
# 创建一个名位”volume(卷)“的列表,用来存放每一卷的信息,包括每一卷的章节总数(chapterCount),卷名(volumeName),以及该卷的所有章节信息(cs)
volume = [
{
'chapterCount': "", 'volumeName': "", 'cs': []},