Python爬虫之起点中文网完本小说

任务

  1. 爬取起点中文网前5页(页数可改)完本小说
  2. 将爬取到的小说名字、作者、链接以及相关简介保存到一个excel表格中

分析

在这里插入图片描述
通过检查网页的源码可知,浏览器发起的是get请求,返回的数据类型是text/html。因此可以调用requests模块中的get() 函数得到页面源码数据

headers = {
        'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 86.0.4240.198Safari / 537.36'
    }
param = {
            'page': page_num
        }
url = 'https://www.qidian.com/finish?action=hidden&orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=2&'
response = requests.get(url=url, params=param, headers=headers)
page_data = response.text

(由于刚刚接触爬虫,这里遇到了一个问题:
当得到page_data数据后,对其进行打印显示,发现页面源码缺少本次任务的关键内容,即小说的所有数据都不在页面源码中。但是当将其保存为一个html文件,再打开,并创建一个BeautifulSoup对象后,再对其进行打印,小说的有关数据又会显示出来,这一点不是太明白,希望看到此文的朋友可以讲解一下原理。)

file = open('qidian.html', 'r', encoding='utf-8')
soup = BeautifulSoup(file, 'lxml')

得到BeautifulSoup对象soup后,就可以用正则表达式对要爬取的内容进行提取。每得到一个数据,就将其保存在一个列表中,最后对excel表格进行操作,就可将数据进行永久化存储。

完整代码

# -*-  coding = utf-8 -*-
# @Time : 2020/12/27 11:17
# @author: 农夫三犭
# @File : main.py
# @Software:PyCharm


import requests
import re
from bs4 import BeautifulSoup
import xlwt

# 小说链接
findLink = re.compile(r'<a data-bid=.*? data-eid=.*? href="(.*?)"', re.S)   # 选取的内容要用括号括起来
# 小说名字
findName = re.compile(r'<a data-bid=.*? data-eid=.*? href=.*? target=.*?>(.*)</a></h4>')
# 小说作者
findAuthor = re.compile(r'a class="name" data-eid=.*? href=.*? target="_blank">(.*?)</a><em>|</em>')
# 小说简介
findIntroduce = re.compile(r'<p class="intro">(.*?)</p>', re.S)

if __name__ == '__main__':
    savepath = "起点小说完结.xls"
    datalist = []

    headers = {
        'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 86.0.4240.198Safari / 537.36'
    }
    url = 'https://www.qidian.com/finish?action=hidden&orderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=2&'

    for page_num in range(1, 6):       # 前5页内容
        page_num = str(page_num)
        param = {
            'page': page_num
        }

        response = requests.get(url=url, params=param, headers=headers)
        page_data = response.text

        with open('./qidian.html', 'w', encoding='utf-8') as fp:
            fp.write(page_data)

        file = open('qidian.html', 'r', encoding='utf-8')

        soup = BeautifulSoup(file, 'lxml')

        for item in soup.find_all('div', class_='book-mid-info'):

            data = []

            item = str(item)           # 必须先转换为字符串
            # 小说名字
            name = re.findall(findName, item)[0]
            data.append(name)
            # 小说作者
            author = re.findall(findAuthor, item)[0]
            data.append(author)
            # 小说链接
            link = re.findall(findLink, item)[0]
            link = 'https' + link
            data.append(link)
            # 小说简介
            introduce = re.findall(findIntroduce, item)
            introduce = [x.strip() for x in introduce if x.strip() != ''][0]     # 去除列表中的空格和换行
            data.append(introduce)
            datalist.append(data)

    book = xlwt.Workbook(encoding="utf-8")  # 创建workbook对象
    sheet = book.add_sheet('起点小说完本', cell_overwrite_ok=True)  # 创建工作表
    column = ("小说名字", "小说作者", "小说链接", "小说简介")  # 元组
    for i in range(0, 4):
        sheet.write(0, i, column[i])  # 列名

    for i in range(0, len(datalist)):
        print(f"第{i + 1}条写入成功")
        datas = datalist[i]
        for j in range(0, 4):
            sheet.write(i + 1, j, datas[j])  # 数据

    book.save(savepath)

(刚开始学爬虫,不足之处还请大家多多指教)

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农夫三犭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值