Utilice Python para crear el rastreador novedoso más simple con interfaz GUI desde cero (3/3)

Tabla de contenido

Contenido del capítulo anterior

prefacio

algunos problemas

El inconveniente de rastrear novelas mediante el paquete de solicitudes.

Utilice el paquete aiohttp para rastrear novelas de forma asincrónica

introducir

el código

principal.py

 prueba_1.py

prueba_3.py

Explicación general del código.

Aviso

Resumen de la serie


Contenido del capítulo anterior

Utilice Python para crear el rastreador novedoso más simple con interfaz GUI desde cero (2/3 ) Configuración En los dos capítulos siguientes, hablaremos principalmente sobre la implementación del código principal del rastreador. https://blog.csdn.net/mumuemhaha/article/details/132457770?spm=1001.2014.3001.5501

prefacio

El contenido de este capítulo trata sobre cómo rastrear novelas cuando se proporcionan enlaces a artículos novedosos.

algunos problemas

El inconveniente de rastrear novelas mediante el paquete de solicitudes.

Al principio, incluido el blog que escribí hace algún tiempo, usé el paquete de solicitudes para rastrear

Pero esta vez hay un problema.

En pocas palabras, las solicitudes se ejecutan secuencialmente.

El siguiente paso debe esperar hasta que regrese la solicitud de red anterior.

Supongamos que la novela que quiero rastrear tiene 2000 capítulos.

Se necesita 1 segundo para que se devuelva cada solicitud y se procese la información

Luego tomará un total de 2000 segundos, que es más de media hora.

Si hay otro error de tiempo de espera de retorno en el medio

La mentalidad está a punto de explotar.

tiempo de espera de retorno podemos configurar el tiempo de espera del tiempo de espera

Pero sigue siendo el retraso de las solicitudes de red lo que ocupa la mayor parte del tiempo.

Entonces ¿hay alguna forma de solucionarlo?

Utilice el paquete aiohttp para rastrear novelas de forma asincrónica

introducir

La asincronía es un modelo de concurrencia que es mucho más eficiente que el subproceso múltiple. Está desordenado. Para completar una determinada tarea, en el proceso de ejecución, no hay necesidad de comunicación y coordinación entre diferentes unidades de programa, y ​​la tarea puede También se puede completar, es decir, las unidades de programa no relacionadas pueden ser asincrónicas.

En pocas palabras, se puede comparar con una especie de matemáticas en la escuela primaria: puedes lavar las verduras mientras hierves agua y picarlas mientras las cocinas.

En el programa Python, puede continuar enviando otros paquetes de datos mientras espera el paquete de respuesta de la red.

La tendencia a maximizar la utilización de los recursos.

el código

El código específico está aquí.

Aquí hay solo una introducción preliminar y no se detallará el uso de paquetes específicos.

principal.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_())

 prueba_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


prueba_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

Explicación general del código.

Los dos parámetros de pachong() pasados ​​en la función principal, uno es la lista total de enlaces de artículos y el otro es el nombre de la novela (el nombre utilizado para crear el archivo txt)

Continuar enviando solicitudes mientras espera una respuesta de la red

Luego use la biblioteca re para extraer el texto del artículo en el código fuente y escríbalo en txt.

Aviso

Los capítulos de novela rastreados con este método están desordenados, pero se pueden ordenar por nombre de capítulo (es tan difícil de escribir que no quiero escribirlo más)

Resumen de la serie

Este artículo tiene una comprensión preliminar de la producción de la interfaz gráfica GUI y conoce otro método de rastreo de rastreadores: el rastreador asíncrono.

Supongo que te gusta

Origin blog.csdn.net/mumuemhaha/article/details/132471796
Recomendado
Clasificación