Tabla de contenido
Contenido del capítulo anterior
El inconveniente de rastrear novelas mediante el paquete de solicitudes.
Utilice el paquete aiohttp para rastrear novelas de forma asincrónica
Explicación general del código.
Contenido del capítulo anterior
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.