首页 > 其他分享 >爬虫爬取在线小说阅读网站详解

爬虫爬取在线小说阅读网站详解

时间:2023-05-16 22:32:40浏览次数:46  
标签:__ get self html 爬虫 爬取 详解 div requests


前言

环境:python 安装、requests安装、Beautiful Soup安装

爬取目标:

笔趣看网站的《校花之贴身高手》,以下是第一章链接

https://www.biqukan.com/11_11499/4260511.html

开始爬取

1.打开链接,打开检查窗口

通过审查Elements,能定位到小说的文本内容在<div id="content" class="showtxt">里面

爬虫爬取在线小说阅读网站详解_html


2.借用requests库将页面的HTML内容先爬取下来

新建文件getnovel1.py

import requests

if __name__ == '__main__':
    print((requests.get(url='https://www.biqukan.com/11_11499/4260511.html')).text)

然后运行代码:

爬虫爬取在线小说阅读网站详解_HTML_02

解析HTML信息

爬取网页的HTML信息后,就要使用Beautiful Soup 来解析HTML信息

1.安装Beautiful Soup

pip install beautifulsoup4

爬虫爬取在线小说阅读网站详解_pyrhon_03

2.在解析html之前,我们需要创建一个Beautiful Soup 对象。

Beautiful Soup函数的参数就是之前获取到的html信息。

然后使用find_all()方法,获得html信息中所有class属性为showtxt的div标签。

find_all方法的第一个参数是获取的标签名,第二个参数是标签的属性,带了一个下划线是因为class是python中的关键字。

新建文件 getnovel2.py

import requests
from bs4 import BeautifulSoup

if __name__=="__main__":
    html = requests.get(url='https://www.biqukan.com/11_11499/4260511.html').text
    novel = BeautifulSoup(html).find_all('div',class_='showtxt')
    print(novel)

   
运行:

爬虫爬取在线小说阅读网站详解_a标签_04

3.但是爬取的内容还是有一些不如人意,我们要想法去除掉div 标签、br标签等。

新建文件getnovel3.py

import requests
from bs4 import BeautifulSoup

if __name__=="__main__":
    html = requests.get(url='https://www.biqukan.com/11_11499/4260511.html').text
    novel = BeautifulSoup(html).find_all('div',class_='showtxt')
    print(novel[0].text.replace('\xa0'*8,'\n\n'))

分析:

find_all匹配的返回结果是列表,使用tnovel[0]获取匹配结果,使用text属性,提取文本内容,
这样能过滤掉br标签。

然后使用replace方法,替换空格为回车,为什么是8格空格,再看网页结构。

爬虫爬取在线小说阅读网站详解_pyrhon_05

运行结果:

爬虫爬取在线小说阅读网站详解_a标签_06

爬取目录信息

1.上面已经爬取了第一章的内容,想要下载所有章节,先来分析下小说目录。

爬虫爬取在线小说阅读网站详解_pyrhon_07

2.从上面我们知道,这些章节存放在了class属性为listmain的div标签下的dl下的dd下的a标签中,

而且这些a标签的href属性前面都是一样的,只有后面部分不一样。

3.对于BeautifulSoup返回的匹配结果a,使用a.get('href')方法就能获取href的属性值,使用a.string就能获取章节的名字。

4.新建文件getnovel4.py

from bs4 import BeautifulSoup
import requests
if __name__ == "__main__":
     server = 'https://www.biqukan.com/'
     target = 'https://www.biqukan.com/11_11499/'
     req = requests.get(url = target)
     html = req.text
     div_bf = BeautifulSoup(html)
     div = div_bf.find_all('div', class_ = 'listmain')
     a_bf = BeautifulSoup(str(div[0]))
     a = a_bf.find_all('a')
     for each in a:
          print(each.string, server + each.get('href'))

备注:

小说每张章的链接放在了class属性为listmain的div标签下的<a>中。先匹配class属性为listmain的<div>标签,再匹配

<a>标签。接下来再匹配每一个<a>标签,并提取章节名和章节文章。因为find_all返回的是一个列表,里边存放了很多的<a>标签,

所以使用for 循环遍历每个<a>标签并打印出来。

运行:

爬虫爬取在线小说阅读网站详解_html_08

5.整合代码

# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests, sys


class downloader(object):

    def __init__(self):
        self.server = 'http://www.biqukan.com/'
        self.target = 'https://www.biqukan.com/11_11499/'
        self.names = []            #存放章节名
        self.urls = []            #存放章节链接
        self.nums = 0            #章节数


    def get_download_url(self):
        req = requests.get(url = self.target)
        html = req.text
        div_bf = BeautifulSoup(html)
        div = div_bf.find_all('div', class_ = 'listmain')
        a_bf = BeautifulSoup(str(div[0]))
        a = a_bf.find_all('a')
        self.nums = len(a[15:])                                #剔除不必要的章节,并统计章节数
        for each in a[15:]:
            self.names.append(each.string)
            self.urls.append(self.server + each.get('href'))


    def get_contents(self, target):
        req = requests.get(url = target)
        html = req.text
        bf = BeautifulSoup(html)
        texts = bf.find_all('div', class_ = 'showtxt')
        texts = texts[0].text.replace('\xa0'*8,'\n\n')
        return texts


    def writer(self, name, path, text):
        write_flag = True
        with open(path, 'a', encoding='utf-8') as f:
            f.write(name + '\n')
            f.writelines(text)
            f.write('\n\n')

if __name__ == "__main__":
    dl = downloader()
    dl.get_download_url()
    print('《小说》开始下载:')
    for i in range(dl.nums):
        dl.writer(dl.names[i], '小说.txt', dl.get_contents(dl.urls[i]))
        sys.stdout.write("  已下载:%.3f%%" %  float(i/dl.nums) + '\r')
        sys.stdout.flush()
    print('《小说》下载完成')

 

运行

爬虫爬取在线小说阅读网站详解_a标签_09

爬虫爬取在线小说阅读网站详解_HTML_10

标签:__,get,self,html,爬虫,爬取,详解,div,requests
From: https://blog.51cto.com/BADAOLIUMANGQZ/6287655

相关文章

  • 爬虫之IP代理
        在爬虫,爬数据的时候,很容易出现IP锁定,403,验证码等情况,一般出现此类情况的时候,就会用IP代理,来实现,大量的频繁更换IP来实现数据的频繁爬取和并发爬取。   现在的方式是增加一个这个的一个服务,一直跑几个免费的IP平台,大致也是这个流程以上图片来源于网络.其中代理的......
  • 程序员岗位介绍,我爬取了拉勾网所有技术岗位工资数据,算法工程师平均薪资高达2W
    点击观看视频↓↓↓程序员岗位介绍,我爬取了拉勾网所有技术岗位工资数据,算法工程师平均薪资高达2W文字版大家好,我是宁一,一个多月没有更新视频了,这一个多月我都在准备一个店铺商城的云开发小程序项目,项目刚刚开发完,还需要一段时间来写成课程,怕大家把我忘了,先来更新一篇文章~最近有......
  • mixin 详解
    mixin是什么?官方解释:混入(mixin)提供了一种非常灵活的方式,来分发Vue组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。理解:mixin对象,可以包含组件内的任意选项,用来提取组件中可复用的功能......
  • python爬取电影演员数据
    可以使用Python中的BeautifulSoup和Requests库来爬取网络上的电影数据和演员数据。首先需要使用Requests库发送网络请求,获取HTML页面的源代码。然后,使用BeautifulSoup库解析HTML代码,提取需要的数据。下面是一个示例代码,用于从IMDb网站上获取电影"Titanic"的演员列表,以及他们的角......
  • 《c++徒步》vs界面详解
    vs2010字符集:多字节字符集和Unicode字符集是不同的字符集标准,主要区别如下:字符编码范围不同:多字节字符集使用单字节或多个字节来表示字符,编码范围较窄,通常只能表示本地语言的字符集。Unicode字符集则是全球通用的字符编码标准,可以同时表示全球范围内的多种语言字符集。字......
  • 【转】Gradle Wrapper 详解
    什么是GradleWrapper关于“什么是GradleWrapper?”这个问题在官网是这么定义的:TherecommendedwaytoexecuteanyGradlebuildiswiththehelpoftheGradleWrapper(inshortjust“Wrapper”).TheWrapperisascriptthatinvokesadeclaredversionofGradl......
  • Android AVD创建及设置中各参数详解
    设置AVD时有些参数比较模糊,特地找了篇文章,大家参考下!本文根据如下的模拟器安装做一些解释:[color=red][b]Name[/b][/color]:自定义虚拟的名称,不能有空格或者其他非法字符,否则不能创建,即CreatAVD不能高亮点击。[color=red][b]Target[/b][/color]:选择要运行的android版本(也可理解......
  • 环状替换法详解
    环状替换法详解给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。链接:https://leetcode.cn/problems/rotate-array示例:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,......
  • Vue跨域详解
    碰到这种问题,其实你的接口已经通了,但是在页面上就是访问不通过。你可以把API请求地址单独拎出来新开个网站打开看请求是否成功,成功,但是你的项目不通。有那么几个可能吧:1、请求头设置错误headers={ 'Content-Type':'application/json'//错误的'......
  • Android AlertDialog 详解
    创建对话框一个对话框一般是一个出现在当前Activity之上的一个小窗口.处于下面的Activity失去焦点,对话框接受所有的用户交互.对话框一般用于提示信息和与当前应用程序直接相关的小功能.AndroidAPI支持下列类型的对话框对象:警告对话框AlertDialog: 一个可以有......