Python爬虫实战-小说网站爬虫开发

2023-11-17

需求:

从http://www.kanunu8.com/book3/6879爬取《动物农场》所有章节的网址,再通过一个多线程爬虫将每一章的内容爬取下来。在本地创建一个“动物农场”文件夹,并将小说中的每一章分别保存到这个文件夹中。每一章保存为一个文件。
在这里插入图片描述
涉及到的知识点
1、requests爬虫网站内容
2、正则表达式提取内容
3、文件写入
4、多线程

插话:做这类需求,最好还是先自己想,自己实现,实现后再去看自己跟书上的有什么不一样。

单线程实现

#使用requests获取网页源代码
import requests
import re
import time

#获取首页源码
html=requests.get('https://www.kanunu8.com/book3/6879/').content.decode(encoding='gbk')
# print(html)
#获取所有章节链接
herf=re.findall('<a href="(13.*?)">',html,re.S)
print(herf)
start=time.time()
for i in herf:
    #通过链接获取每一章的源码
    chapter_html=requests.get('https://www.kanunu8.com/book3/6879/'+i).content.decode(encoding='gbk')
    # print(chapter_html)
    title=re.search('size="4">(.*?)<',chapter_html,re.S).group(1)#获取章节名称
    content=re.findall('<p>(.*?)</p>',chapter_html,re.S)#获取每一张p标签内的内容,结果返回为列表

    content_str="\n".join(content).replace("<br />","")#列表转为字符串并替换多余符号
    with open('动物农场/'+title+'.txt','w',encoding='utf-8') as f:
        f.write(title)
        f.write(content_str)
end=time.time()
print(f'单线程耗时{end-start}')

结果,文件夹是自己手动创建的,生成如下十个章节txt文件。
文件为每个章节的内容。
如果看不到,在文件夹右键,reload from disk
在这里插入图片描述
这个记录了下耗时,可以看到是13秒多。
单线程耗时13.868733167648315

多线程

#使用requests获取网页源代码
import requests
import re
import time
from multiprocessing.dummy import Pool
def get_html():
    #获取首页源码
    html=requests.get('https://www.kanunu8.com/book3/6879/').content.decode(encoding='gbk')
    # print(html)
    #获取所有章节链接
    herf=re.findall('<a href="(13.*?)">',html,re.S)
    return herf

def get_every_chapter(i):
        #通过链接获取每一章的源码
        chapter_html=requests.get('https://www.kanunu8.com/book3/6879/'+i).content.decode(encoding='gbk')
        # print(chapter_html)
        title=re.search('size="4">(.*?)<',chapter_html,re.S).group(1)#获取章节名称
        content=re.findall('<p>(.*?)</p>',chapter_html,re.S)#获取每一张p标签内的内容,结果返回为列表

        content_str="\n".join(content).replace("<br />","")#列表转为字符串并替换多余符号
        with open('动物农场/'+title+'.txt','w',encoding='utf-8') as f:
            f.write(title)
            f.write(content_str)
if __name__ == '__main__':
    start = time.time()
    herf=get_html()#html内容
    print(herf)
    pool = Pool(3)#创建三个线程
    pool.map(get_every_chapter,herf) #章节链接列表传给函数入参
    end=time.time()
    print(f'多线程耗时{end-start}')

这里使用了3个线程,耗时5.348664283752441
需要注意的一个点,map的第一个参数只写函数名,不用写()
4个线程,耗时4.111229181289673
另外试了5个线程,耗时耗时5.717579126358032
可见,3,4,5中,4个线程耗时最少,线程数不是越多越好。

书上实现

创建文件夹

文件路径
在这里插入图片描述
且实现了一个保存文件的函数
在这里插入图片描述
爬虫部分差不多,需要注意的是findall输出为列表,和search结果为字符串。
在这里插入图片描述
总结:先自己写,再看书上实现,才能锻炼能力。
内容参考:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫实战-小说网站爬虫开发 的相关文章

随机推荐

  • 关于建筑物半自动化提取方法的总结

    基于边界 基于边界的交互式提取方法要求用户指定目标边界的少量关键点或大概位置 然后基于目标边界强度和连续性等特征 对目标的边界进行准确跟踪 常见的基于边界方法是Snake算法和智能剪刀 Intelligent Scissors 基于边界方法
  • [附源码]计算机毕业设计社区生活废品回收APPSpringboot程序

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • 微信支付 api v3 支付通知 异步 验签失败 PHP

    微信支付v3 异步验签失败 此处我们接收参数 报文主体 一般是通过框架 自带的request接收 例如TP6 this gt request gt param 这里如果使用此接收方式在进行json转换验签会失败 我们需要用原生的接收方式 f
  • python之pandas简单介绍及使用(一)

    一 Pandas简介 1 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具 该工具是为了解决数据分析任务而创建的 Pandas 纳入了大量库和一些标准的数据模型 提供了高效地操作大型数
  • JVM系列(三) JVM垃圾判断及强引用关系

    1 判断垃圾对象 如何判断该对象是垃圾 或者该对象要被回收 引用计数法 在对象中添加一个引用计数器 每当有一个地方引用它时 计数器值就 1 当引用失效时 计数器值就 1 任何时刻计数器为 0 的对象就是没人用的 那么就要被回收 优点是原理简
  • Game101课程笔记_lecture10_几何

    Game101课程笔记 lecture10 几何 1 纹理应用 1 环境光 环境贴图 2 凹凸贴图 法线贴图 1 Bump Mapping 3 位移贴图 4 三维纹理 5 环境光遮蔽 6 体渲染3D Texture and Volume R
  • Bookface(中位数,保序回归)

    include
  • int 和 Integer 作为接收参数类型,参数长度不能大于10?

    今天的博客主题 Java开发路上的小坑坑 int 和 Integer 作为接收参数类型 参数长度不能大于10 int 和 Integer 作为接收参数类型 参数长度不能大于10 What 就问问小菜鸟惊讶不惊讶 大佬略过 public st
  • Shell中的$0、$1、$2的含义

    0 就是编写的shell脚本本身的名字 1 是在运行shell脚本传的第一个参数 2 是在运行shell脚本传的第二个参数 如 新建了一个shell脚本 test sh bin sh echo shell脚本名称 0 echo 传到shel
  • three.js引用FontLoader()报错Unexpected token < in JSON at position 1

    使用three js的FontLoader 时 总是报错 文件也是正常的引入的json文件 但是还是报错 后来各自百度发现是文件路径的问题 报错时我使用的是相对路径 const loader new THREE FontLoader con
  • background 背景属性详解

    background 背景属性 我们知道元素有前景色color 与之对应的还有背景色 通过background我们可以为元素添加实色 background color 和任意多个背景图片 background image css 背景常见属
  • 计算机网络(二):TCP篇

    文章目录 1 TCP头部包含哪些内容 2 为什么需要 TCP 协议 TCP 工作在哪一层 3 什么是 TCP 4 什么是 TCP 连接 5 如何唯一确定一个 TCP 连接呢 6 UDP头部大小是多少 包含哪些内容 7 TCP与UDP的区别
  • nvidia训练深度学习模型利器apex使用解读

    本文参考 英伟达 NVIDIA 训练深度学习模型神器APEX使用指南 咆哮的阿杰的博客 CSDN博客 apex 英伟达 Pytorch混合精度 FP16 FP32 AMP 半精度 训练 二 代码示例 apex pytorch hxxjxw的
  • JPA基本使用

    JPA的基本使用 这段时间看了下JPA 简单的做个笔记吧 1 搭建环境 1 1 application yaml 我用的是Mysql 需要数据库连接驱动 数据源看你心情吧 系统也有默认的数据源 spring datasource url j
  • No module named ‘tensorflow.contrib‘

    1 安装tensorflow pip install tensorflow i https pypi tuna tsinghua edu cn simple 已经安装tensorflow后出现No module named tensorfl
  • actionInvocation.invoke()是什么意思

    关于Struts2的自定义的验证截器 package ch06 struts2 Interceptor import java util Map import com opensymphony xwork2 Action import co
  • c语言编译defined,#if defined(__GNUC__)的意思是不是如果使用的是GCC编译器?

    满意答案 wcctf05 2015 05 22 采纳率 58 等级 8 已帮助 414人 是的 就是编译器选择 参考以下内容 Compiler name and version macros are predefined by all C
  • : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi

    出现这种报错的原因一定是sql语句写错了 报错 分析 解决方案 在这种报错的情况下 1 看字段是否写错 2 是否多逗号或者少写逗号 3 sql语句本身语法有没有错误
  • ecere ide安装

    上一篇 无 跨平台Ecere语言 Windows MacOSX Linux BSD Android IDE没什么特别名字 我管它叫ec ide好了 里面的3d例子挺好的 主要opengl 3ds 也有Dx的 图片支持bmp jpg png
  • Python爬虫实战-小说网站爬虫开发

    需求 从http www kanunu8 com book3 6879爬取 动物农场 所有章节的网址 再通过一个多线程爬虫将每一章的内容爬取下来 在本地创建一个 动物农场 文件夹 并将小说中的每一章分别保存到这个文件夹中 每一章保存为一个文