用python从零开始做一个最简单的小说爬虫带GUI界面(3/3)

news2025/1/18 10:58:09

目录

上一章内容

前言

出现的一些问题

requests包爬取小说的不便之处

利用aiohttp包来异步爬取小说

介绍

代码

main.py

 test_1.py

test_3.py

代码大致讲解

注意

系列总结


上一章内容

用python从零开始做一个最简单的小说爬虫带GUI界面(2/3)_木木em哈哈的博客-CSDN博客前一章博客我们讲了怎么通过PyQt5来制作图形化界面,并且进行一些基本设置接下来两章我们主要讲核心爬虫代码的实现。https://blog.csdn.net/mumuemhaha/article/details/132457770?spm=1001.2014.3001.5501

前言

本章内容讲的是给出了小说文章链接的情况下,如何爬取小说

出现的一些问题

requests包爬取小说的不便之处

在最开始的时候包括我前段时间写的博客都是利用requests包进行爬取

但是这回出现一个问题

简单来说就是request是顺序执行的

必须要等到上一个网络的请求返回后才会执行下一个步骤

假设我要爬取的小说有2000个章节

每次返回请求并且处理信息都需要1秒的时间

那么总共就需要2000秒也就是半个多小时

要是中间再来个返回超时出现错误的

心态直接要爆炸

返回超时我们可以设置超时等待时间

但是占据大部分时间的依然是网络请求的延迟

那有什么方法可以解决呢

利用aiohttp包来异步爬取小说

介绍

异步是一种比多线程高效得多的并发模型,是无序的,为了完成某个任务,在执行的过程中,不同程序单元之间过程中无需通信协调,也能完成任务的方式,也就是说不相关的程序单元之间可以是异步的。

简单来说就是可以类比小学的一种数学——你可以再烧开水的时候洗菜,在煮饭的时候切菜的那类问题

在python程序中就是你在等待网络回复的数据包时候可以继续发送其他的数据包

起到资源利用趋于最大化的趋势

代码

具体的代码在这

这里只做初步介绍,具体包的使用不展开细讲

main.py

import sys
# PyQt5中使用的基本控件都在PyQt5.QtWidgets模块中
from PyQt5.QtWidgets import QApplication, QMainWindow
# 导入designer工具生成的login模块
from win import Ui_MainWindow
from test_1 import *
from test_3 import *
import time
class MyMainForm(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyMainForm, self).__init__(parent)
        self.setupUi(self)
        self.Button_close.clicked.connect(self.close)
        self.Button_run.clicked.connect(self.F_run)

    def F_run(self):
        link_1=self.line_link.text()
        title_1=F_gettitle(link_1)
        self.text_result.setText(f"标题获取成功——{title_1}")
        # file_1=open(f'{title_1}.txt',mode='w',encoding='utf-8  ')
        test_1=F_getyuan(link_1)
        self.text_result.append("提取源代码成功")
        time.sleep(1)
        search_1=F_searchlink(test_1)
        self.text_result.append("提取文章链接成功")
        pachong(search_1,title_1)

if __name__ == "__main__":
    # 固定的,PyQt5程序都需要QApplication对象。sys.argv是命令行参数列表,确保程序可以双击运行
    app = QApplication(sys.argv)
    # 初始化
    myWin = MyMainForm()
    # 将窗口控件显示在屏幕上
    myWin.show()
    # 程序运行,sys.exit方法确保程序完整退出。
    sys.exit(app.exec_())

 test_1.py

import requests
import re
import numpy as np
from lxml import etree
#获取文章标题
def F_gettitle(link_0):
    head_qb={
        'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36'
    }
    test_1=requests.get(url=link_0,headers=head_qb)
    test_yuan=test_1.text
    dom=etree.HTML(test_yuan)
    test_2=dom.xpath('/html/body/article[1]/div[2]/div[2]/h1/text()')
    return test_2[0]


#提取源代码
def F_getyuan(link_1):
    head_qb={
        'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36'
    }
    test_1=requests.get(url=link_1,headers=head_qb)
    test_yuan=test_1.text
    test_yuan=str(test_yuan)
    return test_yuan


#查询所有小说章节链接
def F_searchlink(link_2):
    re_1='<a id="haitung" href="(.*?)" rel="chapter">'
    re_1=re.compile(re_1)
    link_3=re.findall(re_1,link_2)
    link_max=np.array([])
    for link_1 in link_3:
        link_4=f'http://www.biquge66.net{link_1}'
        link_max=np.append(link_max,link_4)

    return link_max


# #输出文章内容
# def F_edittxt(link_3):
#     head_qb={
#         'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36'
#     }
#     trytimes = 3
#     for i in range(trytimes):
#         try:
#             proxies = None
#             test_1=requests.get(url=link_3,headers=head_qb, verify=False, proxies=None, timeout=3)
#             if test_1.status_code == 200:
#                 break
#         except:
#             print(f'requests failed {i} time')
#     #提取文章链接
#     re_2='<p>(.*?)</p>'
#     re_2=re.compile(re_2)
#     #提取文章标题
#     re_3='<h1 class="bookname">(.*?)</h1>'
#     re.compile(re_3)
#     test_2=np.array([])
#     test_3=np.array([])
#     test_2=re.findall(re_2,test_1.text)
#     test_3 = re.findall(re_3, test_1.text)
#     #放在数组的最后一个
#     test_2=np.append(test_3,test_2)
#     return test_2


test_3.py

import asyncio
import aiohttp
import re
import numpy as np

title=''


async def F_2(session,url):
    head_qb = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Mobile Safari/537.36'
    }
    async with session.get(url,verify_ssl=False,headers=head_qb) as resqonse:
        global title
        text=await resqonse.text()
        text=str(text)
        re_2 = '<p>(.*?)</p>'
        re_2 = re.compile(re_2)
        # 提取文章标题
        re_3 = '<h1 class="bookname">(.*?)</h1>'
        re.compile(re_3)
        test_2 = np.array([])
        test_3 = np.array([])
        test_2 = re.findall(re_2, text)
        test_3 = re.findall(re_3, text)
        test_2 = np.append(test_3, test_2)
        for test_max in test_2:
            with open(f'{title}.txt',mode='a',encoding='utf-8') as file:
                file.writelines(test_max)


async def F_1(urls):
    async with aiohttp.ClientSession() as session:
        tasks=[asyncio.create_task(F_2(session,url)) for url in urls]
        await asyncio.wait(tasks)



def pachong(urls_1,title_1):
    global title
    title=title_1
    asyncio.run(F_1(urls_1))
    title=title_1

代码大致讲解

主函数中传入的pachong()的两个参数,一个是文章链接的总列表,一个是小说的名字(用于创建txt文件的名称)

在等待网络回复时继续发送请求

之后利用re库来提取源代码中的文章文字最后写入txt中

注意

利用这种方法爬取的内容小说章节是无序的,但是可以通过章节名来进行排序(好难写,不想写了)

系列总结

本次文章初步了解了GUI图形界面的制作,并且了解了另外一种爬虫爬取的方法——异步爬虫

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/926193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解放双手!ChatGPT助力编写JAVA框架! | 京东云技术团队

亲爱的Javaer们&#xff0c;在平时编码的过程中&#xff0c;你是否曾想过编写一个Java框架去为开发提效&#xff1f;但是要么编写框架时感觉无从下手&#xff0c;不知道从哪开始。要么有思路了后对某个功能实现的技术细节不了解&#xff0c;空有想法而无法实现。如果你遇到了这…

云LIS云实验室信息管理系统源码,支持IIS独立部署,Docker部署

云LIS技术架构&#xff1a;Asp.NET CORE 3.1 MVC SQLserver Redis等。 云LIS系统是医院信息管理的重要组成部分之一&#xff0c;它是一个基于B/S架构开发的实验室信息管理系统。整个系统的运行基于WEB层面&#xff0c;只需要在对应的工作台安装一个浏览器软件&#xff0c;有外…

和机器人抢工作 人类有哪些优势无法取代?

人工智能越来越有益处&#xff0c;并且广泛应用&#xff0c;世界各地的人们开始担心&#xff0c;自动化的新时代会如何影响自己的职业前景。 皮尤研究中心&#xff08;Pew Research&#xff09;最近的一项研究发现&#xff0c;在10个发达和新兴经济体国家中&#xff0c;大部分…

Rocket消息存储

一、存储介质 ● 关系型数据库DB Apache下开源的另外一款MQ—ActiveMQ (默认采用的KahaDB做消息存储)可选用JDBC的方式来做消息持久化&#xff0c;通过简单的xmI配置信息即可实现JDBC消息存储。由于&#xff0c;普通关系型数据库(如Mysql)在单表数据量达到千万级别的情况下&a…

API数据接口该怎么对接

随着互联网和移动互联网的发展&#xff0c;API&#xff08;Application Programming Interface&#xff09;接口的作用越来越重要。API接口将各种平台相互连接&#xff0c;使得不同系统的信息可以互相获取和使用&#xff0c;大大提高了系统的互操作性和开发效率。本文将介绍如何…

Delphi 中接口实现:Implementing Interfaces

目录 一、类声明&#xff08;Class Declarations&#xff09; 二、方法解决说明&#xff08;Method Resolution Clause&#xff09; 三、更改继承实现&#xff08;Changing Inherited Implementations&#xff09; 四、通过委托实现接口&#xff08;Implementing Interface…

决策树算法:随机森林民主算法【02/2】

决策树民主&#xff1a;随机森林算法 一、介绍&#xff1a; 记住您在阅读亚马逊上的所有评论后进行的最后一次购买&#xff0c;或者在查看 IMDb 评级后您观看的以前的电影。人类是社会动物&#xff0c;他人的意见和行为自然会影响我们。我们的决定在很大程度上取决于“群体智慧…

书单背景图片哪里找?如何制作成视频?

有没有小伙伴们发现&#xff0c;如今很多热门的短视频平台有很多使用书单文案制作的视频&#xff0c;很多情感博主会配上一些精致的图片&#xff0c;唯美的背景承载着一些美好的文案内容。这种类型的视频让不少的小伙伴都想制作专属于自己的视频来投稿&#xff0c;那么小伙伴们…

泡泡玛特上半年收入超28亿元 净利润超去年全年

8月22日&#xff0c;泡泡玛特发布2023中期业绩。数据显示&#xff0c;上半年实现营收28.14亿元&#xff0c;经调整净利润5.35亿元&#xff0c;同比增长42.3%&#xff0c;其中净利润4.77亿元&#xff0c;超去年全年净利润。海外业务延续高速增长态势并首次披露利润情况&#xff…

FOC控制框架图

pmsm电机数学模型以及FOC控制框图&#xff08;开源小项目FOC控制BLDC电机&#xff09;_foc 框图_栋哥爱做饭的博客-CSDN博客 电机控制----FOC框架讲解_foc电机控制_修才生的博客-CSDN博客

pdf编辑文字怎么编辑?这几种简单编辑方法看一看

pdf编辑文字怎么编辑&#xff1f;PDF文件是一种普遍的文档格式&#xff0c;但是在编辑时却比较困难。幸运的是&#xff0c;有许多PDF编辑器可以帮助我们轻松地编辑PDF文件。本文将介绍一些简单的PDF编辑方法&#xff0c;跟着我一起来看看吧&#xff01; 第一种方法&#xff1a;…

2.4G芯片G350规格书介绍,小体积易开发

给大家介绍一款2.4g芯片&#xff0c;G350是宇凡微电子开发的一款低成本、高集成度的无线收发芯片&#xff0c;内置了发射机、接收机、频率综合器和GFSK调制解调器&#xff0c;以满足各种无线通信需求。无论是在电子标签、无线遥控、无线键盘鼠标、智能家居、工业通信还是商用近…

vue页面中想在input框用户输入的参数后加单位的方法

<el-form-item label"金重" prop"weight"><el-input v-model"form.weight" placeholder"请输入金重"><template #append><div>g</div></template></el-input></el-form-item>

项目开展CICD的实践探路 | 京东物流技术团队

本文介绍了作者对CICD的理解以及在项目中开展CICD的几种场景&#xff0c;总结了每种场景实践的关键节点、带来的收益&#xff0c;以及结合具体项目开展的实际应用。读者可以借鉴本文中描述的场景&#xff0c;或借鉴文中提到的实践方式&#xff0c;在项目中开展CICD&#xff0c;…

【PHP】PHP开发教程-PHP开发环境安装

1、PHP简单介绍 PHP&#xff08;全称&#xff1a;Hypertext Preprocessor&#xff09;是一种广泛使用的开放源代码脚本语言&#xff0c;特别适用于Web开发。它嵌入在HTML中&#xff0c;通过在HTML文档中添加PHP标记和脚本&#xff0c;可以生成动态的、个性化的Web页面。 PHP最…

Java小项目|拼图小游戏|黑马

项目技术需求 Java基础 基本if、forio流File集合JFrame【看得懂就行】 项目素材以及打包exe&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rPazJezTwS9O6e8BoYNIYA?pwd6666 项目运行截图 项目来源 哔哩哔哩-黑马程序员上 哔哩哔哩-黑马程序员下 项目介绍&…

mac电脑免费垃圾清理软件有哪些?CleanMyMac好用不好用?

CleanMyMac是一款功能强大的mac垃圾清理软件&#xff0c;它可以帮助我们快速扫描和删除mac上的垃圾文件&#xff0c;释放磁盘空间&#xff0c;提升系统速度。本文将为你介绍CleanMyMac这款mac垃圾清理软件&#xff0c;以及CleanMyMac怎么关闭开机启动。 mac垃圾清理软件有很多…

SAP 资产屏幕增强(AS01/AS02/AS03)

导语&#xff1a;最新需要在资产屏幕上增加增强字段&#xff08;效果图在最后&#xff09;&#xff0c;下面分享一下实现过程。 一、在表中增强字段 本次增强的是【资产主数据->源】中的字段&#xff0c;选择储存在ANLU表中。 二、创建屏幕 在函数组XAIS中创建屏幕9001 在…

unity 模型显示在UI上 并交互(点击、旋转、缩放)

1.在Assets创建 Render Texture&#xff08;下面会用到&#xff09;&#xff0c;根据需要设置Size 2.创建UIRawImage&#xff0c;并把Render Texture赋上 3.创建相机&#xff0c;如下图&#xff1a; 4.基本UI的准备工作完成&#xff0c;剩下的就是代码了&#xff0c;值得一提&a…

qt 实现音视频的分贝检测系统

项目场景&#xff1a; 目前的产品经常播放m3u8流&#xff0c;有的视频声音正常&#xff0c;有的视频声音就偏低&#xff0c;即使放到最大音量声音也是比较小&#xff0c;所以就产生了某种需求&#xff0c;能否自动感知视频声音的大小&#xff0c;如果发现声音比较小的情况&…