Technologieaustausch

【Crawler】Crawler-Grundlagen

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


1. HTTP-Antwort und -Anfrage

HTTP ist ein Client-Server-Protokoll und die beiden Kommunikationsparteien sind der Client und der Server. Der Client sendet eine HTTP-Anfrage, und der Server empfängt und verarbeitet die Anfrage und gibt eine HTTP-Antwort zurück.

1. HTTP-Anfrage

HTTP-Anfragen bestehen aus Anfragezeilen, Anfrageheadern, Leerzeilen und Anfragedaten (z. B. Formulardaten in POST-Anfragen).

  • Die Anforderungszeile enthält die Anforderungsmethode, die angeforderte URL und die Protokollversion. Zu den gängigen Anforderungsmethoden gehören GET, POST, PUT, DELETE usw.
  • Der Anforderungsheader enthält weitere Informationen über den Client und die Anforderung, z. B. User-Agent, Accept, Content-Type usw.
  • Zur Trennung von Anforderungsheadern und Anforderungsdaten wird eine Leerzeile verwendet.
  • Anforderungsdaten werden normalerweise für POST-Anfragen verwendet und enthalten übermittelte Daten.

Anfragebeispiel:

POST /api/users HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: application/json
Content-Type: application/json
Content-Length: 27

{
  "name": "John",
  "age": 30
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Anforderungszeile:POST /api/users HTTP/1.1

Anforderungsheader: Enthält Host, User-Agent, Accept, Content-Type, Content-Length usw.

Leerzeile: Leere Zeile zwischen Anforderungsheader und Anforderungstext

Anforderungstext:JSON-Daten

2. HTTP-Antwort

Die HTTP-Antwort besteht aus einer Statuszeile, Antwortheadern, Leerzeilen und Antwortdaten.

  • Die Statuszeile enthält die Protokollversion, den Statuscode und die Statusmeldung. Der Statuscode gibt das Verarbeitungsergebnis der Anfrage an, z. B. 200 für Erfolg, 404 für nicht gefundene Ressource, 500 für internen Serverfehler usw.
  • Der Antwortheader enthält weitere Informationen über den Server und die Antwort, z. B. Server, Inhaltstyp, Inhaltslänge usw.
  • Zur Trennung von Antwortheadern und Antwortdaten wird eine Leerzeile verwendet.
  • Antwortdaten enthalten vom Server zurückgegebene Daten wie HTML, JSON usw.

Angenommen, der Server gibt eine einfache HTML-Seite zurück, könnte die Antwort wie folgt aussehen:

HTTP/1.1 200 OK
Date: Sun, 02 Jun 2024 10:20:30 GMT
Server: Apache/2.4.41 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Content-Length: 137
Connection: keep-alive

<!DOCTYPE html>
<html>
<head>
    <title>Example Page</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <p>This is a sample HTML page.</p>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

Statuszeile:HTTP/1.1 200 OK

Antwortheader: Enthält Datum, Server, Inhaltstyp, Inhaltslänge, Verbindung usw.

Leerzeile: Leerzeile zwischen Antwortheadern und Antworttext

Antwortkörper: Enthält HTML-Code

3. Statuscode

HTTP-Statuscodes geben die Verarbeitungsergebnisse der Anfrage durch den Server an. Zu den gängigen Statuscodes gehören:

  • 1xx: InformationsantwortDies zeigt an, dass die Anfrage eingegangen ist und die Verarbeitung fortgesetzt wird.
  • 2xx: ErfolgDies zeigt an, dass die Anfrage vom Server erfolgreich empfangen, verstanden und akzeptiert wurde.
  • 3xx: Weiterleiten, was darauf hinweist, dass weitere Maßnahmen erforderlich sind, um die Anfrage abzuschließen.
  • 4xx: Clientfehler, was darauf hinweist, dass der Server die Anfrage nicht verarbeiten kann.
  • 5xx: Serverfehler, was darauf hinweist, dass beim Verarbeiten der Anfrage durch den Server ein Fehler aufgetreten ist.

Statuscode

2. Bibliothek anfordern

Die Requests-Bibliothek von Python ist eine sehr leistungsstarke und benutzerfreundliche HTTP-Bibliothek.

Bevor Sie es verwenden können, müssen Sie die Requests-Bibliothek installieren:pip install requests

1. Initiieren Sie eine GET-Anfrage

Mit der GET-Anfrage werden Daten vom Server angefordert. Das Erstellen einer GET-Anfrage mithilfe der Requests-Bibliothek ist sehr einfach:

import requests
# 发起GET请求
response = requests.get('https://news.baidu.com')
# 检查响应状态码
if response.status_code == 200:
    # 打印响应内容
    print(response.text)
else:
    print(f"请求失败,状态码:{response.status_code}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2. Initiieren Sie eine POST-Anfrage

Mit der POST-Anfrage werden Daten an den Server übermittelt. Beispielsweise verwenden Websites, die eine Anmeldung erfordern, häufig POST-Anfragen, um einen Benutzernamen und ein Passwort zu übermitteln. Die Methode zur Verwendung der Requests-Bibliothek zum Initiieren einer POST-Anfrage ist wie folgt:

import requests

# 定义要发送的数据
data = {
    'username': '123123123',
    'password': '1231231312'
}

# 发起POST请求
response = requests.post('https://passport.bilibili.com/x/passport-login/web/login', data=data)

# 检查响应状态码
if response.status_code == 200:
    # 打印响应内容
    print(response.text)
else:
    print(f"请求失败,状态码:{response.status_code}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3. Anforderungsheader verarbeiten

Um zu verhindern, dass Crawler auf einigen Websites (z. B. Douban) über einen Anti-Crawling-Mechanismus verfügen, müssen Sie HTTP-Anforderungsheader und -Parameter so festlegen, dass sie sich als Browser ausgeben und die Authentifizierung bestehen.

import requests

response = requests.get("https://movie.douban.com/top250")
if response.ok:
    print(response.text)
else:
    print("请求失败:" + str(response.status_code))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Anfrage fehlgeschlagen

Wenn der obige Code beispielsweise den Anforderungsheader nicht festlegt, verweigert Douban uns den Zugriff.

Bild-20240607014319894

Wir können die Website nach Belieben betreten, einen vorgefertigten User-Agent finden und ihn in unseren Anfrage-Header einfügen.

import requests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}

response = requests.get("https://movie.douban.com/top250", headers=headers)
print(response.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Bild-20240607014435738

Auf diese Weise können Sie auf Douban zugreifen und den Inhalt der Webseite abrufen.

3. BeautifulSoup-Bibliothek

BeautifulSoup ist eine Python-Bibliothek zum Parsen von HTML- und XML-Dokumenten, insbesondere zum Extrahieren von Daten aus Webseiten.

Vor der Verwendung müssen Sie die BeautifulSoup-Bibliothek installieren:pip install beautifulsoup4

1. HTML-Dokumente analysieren

html.parser Es handelt sich um den in Python integrierten Parser, der für die meisten Szenarien geeignet ist. Nehmen Sie als Beispiel Douban oben.

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}

response = requests.get("https://movie.douban.com/top250", headers=headers)
html = response.text
# 使用html.parser来解析HTML内容
soup = BeautifulSoup(html, "html.parser")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2. Suchen und extrahieren Sie Daten

BeautifulSoup bietet mehrere Methoden zum Suchen und Extrahieren von Daten aus HTML-Dokumenten.

Gemeinsame Methoden von BeautifulSoup:

  • find(tag, attributes): Finden Sie das erste Tag, das den Kriterien entspricht.
  • find_all(tag, attributes): Alle passenden Tags finden.
  • select(css_selector): Verwenden Sie CSS-Selektoren, um Tags zu finden, die den Kriterien entsprechen.
  • get_text(): Holen Sie sich den Textinhalt innerhalb des Etiketts.
  • attrs: Rufen Sie das Attributwörterbuch des Tags ab.

Ⅰ. Finden Sie ein einzelnes Element

find Die Methode wird verwendet, um das erste Element zu finden, das die Kriterien erfüllt. So finden Sie beispielsweise den ersten Titel auf einer Seite:

title = soup.find("span", class_="title")
print(title.string)
  • 1
  • 2

Ⅱ. Finden Sie alle Elemente

findAll Die Methode wird verwendet, um alle Elemente zu finden, die die Kriterien erfüllen. So finden Sie beispielsweise alle Titel auf einer Seite:

all_titles = soup.findAll("span", class_="title")
for title in all_titles:
    print(title.string)
  • 1
  • 2
  • 3

Ⅲ. Verwenden Sie den CSS-Selektor

select Die Methode ermöglicht die Verwendung von CSS-Selektoren zum Suchen von Elementen. Um beispielsweise alle Titel zu finden:

all_titles = soup.select("span.title")
for title in all_titles:
    print(title.get_text())
  • 1
  • 2
  • 3

IV. Elementattribute abrufen

Kann benutzenattrs Eigenschaften Ruft das Attributwörterbuch des Elements ab. Rufen Sie beispielsweise die URLs aller Bilder ab:

all_images = soup.findAll("img")
for img in all_images:
    print(img['src'])
  • 1
  • 2
  • 3

4. Crawlen Sie die Douban-Filmliste

Bild-20240607021500369

Filmtitel: Der HTML-Tag-Name lautet: span und das Klassenattribut des angegebenen Elements ist title.

Bild-20240607021403243

Bewertung: Das HTML-Tag lautet: span und das Klassenattribut des angegebenen Elements ist Rating_num

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}
    response = requests.get(f"https://movie.douban.com/top250", headers=headers)
    html = response.text
    soup = BeautifulSoup(html, "html.parser")

    # 获取所有电影
    all_movies = soup.find_all("div", class_="item")

    for movie in all_movies:
        # 获取电影标题
        titles = movie.find_all("span", class_="title")
        for title in titles:
            title_string = title.get_text()
            if "/" not in title_string:
                movie_title = title_string

        # 获取电影评分
        rating_num = movie.find("span", class_="rating_num").get_text()

        # 输出电影标题和评分
        print(f"电影: {movie_title}, 评分: {rating_num}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

Bild-20240607021144542

Das Crawling war erfolgreich, aber nur die erste Seite wurde gecrawlt und nachfolgende Inhalte wurden nicht erfolgreich gecrawlt.Analysieren Sie die obige URL-Verbindung. Jede Seite übergibt siestartParameter werden ausgelagert.

Bild-20240607020345475

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0"
}

for start_num in range(0, 250, 25):
    response = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers=headers)
    html = response.text
    soup = BeautifulSoup(html, "html.parser")

    # 获取所有电影条目
    all_movies = soup.find_all("div", class_="item")

    for movie in all_movies:
        # 获取电影标题
        titles = movie.find_all("span", class_="title")
        for title in titles:
            title_string = title.get_text()
            if "/" not in title_string:
                movie_title = title_string

        # 获取电影评分
        rating_num = movie.find("span", class_="rating_num").get_text()

        # 输出电影标题和评分
        print(f"电影: {movie_title}, 评分: {rating_num}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28