Verwenden Sie Python, um den einfachsten Roman-Crawler mit GUI-Schnittstelle von Grund auf zu erstellen (2/3)

Inhaltsverzeichnis

Blog zum vorherigen Kapitel

Vorwort

Code-Implementierung der Hauptfunktion

Zeile für Zeile Code-Analyse

Link bekommen

Titel bekommen

Holen Sie sich den Quellcode der Webseite

Erhalten Sie Links zu einzelnen Artikeln

Funktionscode

Bibliotheksdatei importieren

Holen Sie sich den Titel des Artikels

Holen Sie sich den Quellcode des Artikels

Extrahieren Sie Links zu einzelnen Artikeln eines Artikelverzeichnisses

Gesamtcode

Inhalt des nächsten Kapitels


Blog zum vorherigen Kapitel

Verwenden Sie Python, um den einfachsten Roman-Crawler mit GUI-Schnittstelle von Grund auf zu erstellen (1/3 ). Wenn die Reptilien spielen, sagen Sie nichts und fangen Sie an! ! ! https://blog.csdn.net/mumuemhaha/article/details/132394257?spm=1001.2014.3001.5501

Vorwort

Im vorherigen Kapitel des Blogs haben wir darüber gesprochen, wie man über PyQt5 eine grafische Oberfläche erstellt und einige Grundeinstellungen vornimmt

In den nächsten beiden Kapiteln sprechen wir hauptsächlich über die Implementierung des Kern-Crawler-Codes

Code-Implementierung der Hauptfunktion

 Code aus dem vorherigen Kapitel

self.Button_run.clicked.connect(self.F_run)

Stellt das Klicken auf die Schaltfläche dar, um die F_run-Funktion auszuführen (beachten Sie, dass hier keine Klammern vorhanden sind).

Dann müssen wir diese Funktion definieren

Die Idee ist wahrscheinlich so

    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.setText("提取源代码成功")
        time.sleep(1)
        search_1=F_searchlink(test_1)
        self.text_result.append("提取文章链接成功")
        pachong(search_1,title_1)

Zeile für Zeile Code-Analyse

Link bekommen

erster Pass

self.line_link.text()

Befehl, um den Link in das Eingabefeld einzugeben

Und weisen Sie es link_1 zu

Titel bekommen

Gleichzeitig extrahiere ich die Schlüsselwörter, indem ich den Quellcode des Webseiten-Links crawle, um den Titel des Artikels zu erhalten

so heißt der Roman

title_1=F_gettitle(link_1)

Holen Sie sich den Quellcode der Webseite

Crawlen Sie den Quellcode der Katalogseite des Romanartikels und weisen Sie ihn als test_1 zu (zur späteren Extraktion von Links zu jedem Artikel).

test_1=F_getyuan(link_1)

Erhalten Sie Links zu einzelnen Artikeln

search_1=F_searchlink(test_1)

Extrahieren und filtern Sie den erhaltenen Quellcode, um die Links zu jedem Artikel zu erhalten

Darunter werden self.text_result.setText und self.text_result.append im roten Kreis unten angezeigt

(Aus ästhetischen Gründen können Sie es nicht hinzufügen)

Funktionscode

Um den Code hier nicht zu lang zu machen, habe ich zwei separate Python-Dateien zum Speichern von Python-Funktionen erstellt

Bibliotheksdatei importieren

import requests
import re
import numpy as np
from lxml import etree

  request wird für Netzwerkanfragen verwendet

re und lxml werden zum Filtern von Quellcodeinformationen verwendet

während Numpy zum Speichern der Elemente verwendet wird

Holen Sie sich den Titel des Artikels

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]

Sehr einfacher Aufbau eines

Erhalten Sie den Quellcode auf Anfrage

Verwenden Sie dann den Baum in lxml, um den Quellcode zu filtern

(Wenn Sie den XPath-Pfad verwenden, fügen Sie am Ende text() hinzu, um die Textform auszugeben, andernfalls wird der Quellcode nicht angezeigt.)

Der XPath-Pfad kann durch Drücken der F12-Konsole extrahiert werden

Holen Sie sich den Quellcode des Artikels

Es sollte leicht zu verstehen sein. Schreiben Sie einfach den Code direkt

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

Extrahieren Sie Links zu einzelnen Artikeln eines Artikelverzeichnisses

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

Hier verwende ich direkt die Regelmäßigkeit der Re-Bibliothek, um den passenden Link abzugleichen

Beachten Sie, dass es sich bei dem passenden Link nicht um einen vollständigen Link handelt

Es muss also gespleißt werden

 Nachdem das Spleißen abgeschlossen ist, kann es direkt geöffnet werden

Hier speichere ich es der Einfachheit halber in einem Array und crawle dann den Quellcode jedes Artikels

und dann zurück

Gesamtcode

main.py

import sys
# PyQt5中使用的基本控件都在PyQt5.QtWidgets模块中
from PyQt5.QtWidgets import QApplication, QMainWindow
# 导入designer工具生成的login模块
from win import Ui_MainWindow
from test_1 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


Inhalt des nächsten Kapitels

Schließlich werden alle Kapitellinks abgerufen und der nächste Schritt besteht darin, den Artikel zu crawlen

Es hätte zusammen geschrieben werden können (Sie können den auskommentierten Teil in meiner test_1.py sehen), aber später fanden sich einige Probleme

Nur das nächste Kapitel

wird im nächsten Kapitel ausführlich erläutert

Supongo que te gusta

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