Python爬取起点小说并保存到本地文件夹和MongoDB数据库中

本文介绍了使用Python3.7和Mongo4.0,通过Pycharm进行起点小说的爬取,并将数据有效保存到本地文件夹和MongoDB数据库的过程。
摘要由CSDN通过智能技术生成

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': []},
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值