Κοινή χρήση τεχνολογίας

【Crawler】Βασικά στοιχεία του Crawler

2024-07-12

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


1. Απάντηση και αίτημα Http

Το HTTP είναι ένα πρωτόκολλο πελάτη-διακομιστή και τα δύο μέρη επικοινωνίας είναι ο πελάτης και ο διακομιστής. Ο πελάτης στέλνει ένα αίτημα HTTP και ο διακομιστής λαμβάνει και επεξεργάζεται το αίτημα και επιστρέφει μια απάντηση HTTP.

1. Αίτημα HTTP

Τα αιτήματα HTTP αποτελούνται από γραμμές αιτημάτων, κεφαλίδες αιτημάτων, κενές γραμμές και δεδομένα αιτημάτων (όπως δεδομένα φόρμας σε αιτήματα POST).

  • Η γραμμή αιτήματος περιέχει τη μέθοδο αιτήματος, τη διεύθυνση URL που ζητήθηκε και την έκδοση πρωτοκόλλου. Οι συνήθεις μέθοδοι αιτημάτων περιλαμβάνουν GET, POST, PUT, DELETE κ.λπ.
  • Η κεφαλίδα αιτήματος περιέχει άλλες πληροφορίες σχετικά με τον πελάτη και το αίτημα, όπως User-Agent, Accept, Content-Type κ.λπ.
  • Μια κενή γραμμή χρησιμοποιείται για τον διαχωρισμό των κεφαλίδων αιτημάτων και των δεδομένων αιτημάτων.
  • Τα δεδομένα αιτήματος χρησιμοποιούνται συνήθως για αιτήματα POST και περιέχουν δεδομένα που έχουν υποβληθεί.

Παράδειγμα αιτήματος:

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

γραμμή αιτήματος:POST /api/χρήστες HTTP/1.1

Κεφαλίδα αιτήματος: Περιέχει Host, User-Agent, Accept, Content-Type, Content-Length, κ.λπ.

κενή γραμμή: Κενή γραμμή μεταξύ της κεφαλίδας αιτήματος και του σώματος αιτήματος

Σώμα αιτήματος:Δεδομένα JSON

2. Απόκριση HTTP

Η απόκριση HTTP αποτελείται από γραμμή κατάστασης, κεφαλίδες απόκρισης, κενές γραμμές και δεδομένα απόκρισης.

  • Η γραμμή κατάστασης περιέχει την έκδοση πρωτοκόλλου, τον κωδικό κατάστασης και το μήνυμα κατάστασης. Ο κωδικός κατάστασης υποδεικνύει το αποτέλεσμα επεξεργασίας του αιτήματος, όπως το 200 που υποδεικνύει επιτυχία, το 404 που υποδεικνύει ότι ο πόρος δεν βρέθηκε, το 500 υποδεικνύει σφάλμα εσωτερικού διακομιστή κ.λπ.
  • Η κεφαλίδα απόκρισης περιέχει άλλες πληροφορίες σχετικά με τον διακομιστή και την απόκριση, όπως Διακομιστής, Τύπος περιεχομένου, Μήκος περιεχομένου κ.λπ.
  • Μια κενή γραμμή χρησιμοποιείται για τον διαχωρισμό των κεφαλίδων απόκρισης και των δεδομένων απόκρισης.
  • Τα δεδομένα απόκρισης περιέχουν δεδομένα που επιστρέφονται από τον διακομιστή, όπως HTML, JSON κ.λπ.

Υποθέτοντας ότι ο διακομιστής επιστρέφει μια απλή σελίδα HTML, η απάντηση μπορεί να είναι η εξής:

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

γραμμή κατάστασης:HTTP/1.1 200 OK

κεφαλίδα απάντησης: Περιέχει ημερομηνία, διακομιστή, τύπο περιεχομένου, μήκος περιεχομένου, σύνδεση κ.λπ.

κενή γραμμή: Κενή γραμμή μεταξύ των κεφαλίδων απόκρισης και του σώματος απόκρισης

σώμα απάντησης: Περιέχει κώδικα HTML

3. Κωδικός κατάστασης

Οι κωδικοί κατάστασης HTTP υποδεικνύουν τα αποτελέσματα επεξεργασίας του αιτήματος από τον διακομιστή. Οι κοινοί κωδικοί κατάστασης περιλαμβάνουν:

  • 1xx: Απόκριση πληροφοριών, υποδεικνύοντας ότι το αίτημα έχει παραληφθεί και η επεξεργασία συνεχίζεται.
  • 2xx: επιτυχία, υποδεικνύοντας ότι το αίτημα ελήφθη επιτυχώς, κατανοητό και αποδεκτό από τον διακομιστή.
  • 3xx: Ανακατεύθυνση, υποδεικνύοντας ότι απαιτούνται περαιτέρω ενέργειες για την ολοκλήρωση του αιτήματος.
  • 4xx: Σφάλμα πελάτη, υποδεικνύοντας ότι ο διακομιστής δεν μπορεί να επεξεργαστεί το αίτημα.
  • 5xx: Σφάλμα διακομιστή, υποδεικνύοντας ότι παρουσιάστηκε σφάλμα κατά την επεξεργασία του αιτήματος από τον διακομιστή.

κωδικός κατάστασης

2. Βιβλιοθήκη αιτημάτων

Η βιβλιοθήκη αιτημάτων της Python είναι μια πολύ ισχυρή και εύχρηστη βιβλιοθήκη HTTP.

Πριν το χρησιμοποιήσετε, πρέπει να εγκαταστήσετε τη βιβλιοθήκη αιτημάτων:pip install requests

1. Εκκινήστε ένα αίτημα GET

Το αίτημα GET χρησιμοποιείται για να ζητήσει δεδομένα από τον διακομιστή. Η υποβολή αιτήματος GET χρησιμοποιώντας τη βιβλιοθήκη αιτημάτων είναι πολύ απλή:

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. Εκκινήστε ένα αίτημα POST

Το αίτημα POST χρησιμοποιείται για την υποβολή δεδομένων στον διακομιστή. Για παράδειγμα, οι ιστότοποι που απαιτούν σύνδεση χρησιμοποιούν συχνά αιτήματα POST για να υποβάλουν ένα όνομα χρήστη και έναν κωδικό πρόσβασης. Η μέθοδος χρήσης της βιβλιοθήκης αιτημάτων για την εκκίνηση ενός αιτήματος POST είναι η εξής:

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. Επεξεργαστείτε τις κεφαλίδες αιτημάτων

Σε ορισμένους ιστότοπους (όπως το Douban), για να αποτρέψετε τα προγράμματα ανίχνευσης να έχουν μηχανισμό κατά της ανίχνευσης, πρέπει να ορίσετε κεφαλίδες και παραμέτρους αιτημάτων HTTP ώστε να προσποιούνται ότι είναι πρόγραμμα περιήγησης και να περάσετε τον έλεγχο ταυτότητας.

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

Αίτημα απέτυχε

Για παράδειγμα, εάν ο παραπάνω κωδικός δεν ορίζει την κεφαλίδα του αιτήματος, το Douban θα μας αρνηθεί την πρόσβαση.

εικόνα-20240607014319894

Μπορούμε να μπούμε στον ιστότοπο κατά βούληση, να βρούμε έναν έτοιμο παράγοντα χρήστη και να τον βάλουμε στην κεφαλίδα του αιτήματός μας.

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

εικόνα-20240607014435738

Με αυτόν τον τρόπο, μπορείτε να αποκτήσετε πρόσβαση στο Douban και να αποκτήσετε το περιεχόμενο της ιστοσελίδας.

3. Βιβλιοθήκη BeautifulSoup

Το BeautifulSoup είναι μια βιβλιοθήκη Python για την ανάλυση εγγράφων HTML και XML, ειδικά για την εξαγωγή δεδομένων από ιστοσελίδες.

Πριν από τη χρήση, πρέπει να εγκαταστήσετε τη βιβλιοθήκη BeautifulSoup:pip install beautifulsoup4

1. Ανάλυση εγγράφων HTML

html.parser Είναι ο ενσωματωμένος αναλυτής της Python και είναι κατάλληλος για τα περισσότερα σενάρια. Πάρτε το Douban παραπάνω ως παράδειγμα.

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. Εύρεση και εξαγωγή δεδομένων

Το BeautifulSoup παρέχει πολλαπλές μεθόδους εύρεσης και εξαγωγής δεδομένων από έγγραφα HTML.

Κοινή μέθοδοι BeautifulSoup:

  • find(tag, attributes): Βρείτε την πρώτη ετικέτα που ταιριάζει με τα κριτήρια.
  • find_all(tag, attributes): Βρείτε όλες τις ετικέτες που ταιριάζουν.
  • select(css_selector): Χρησιμοποιήστε επιλογείς CSS για να βρείτε ετικέτες που ταιριάζουν με τα κριτήρια.
  • get_text(): Λάβετε το περιεχόμενο κειμένου μέσα στην ετικέτα.
  • attrs: Λάβετε το λεξικό χαρακτηριστικών της ετικέτας.

Ⅰ Βρείτε ένα μεμονωμένο στοιχείο

find Η μέθοδος χρησιμοποιείται για την εύρεση του πρώτου στοιχείου που πληροί τα κριτήρια. Για παράδειγμα, για να βρείτε τον πρώτο τίτλο σε μια σελίδα:

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

Ⅱ Βρείτε όλα τα στοιχεία

findAll Η μέθοδος χρησιμοποιείται για την εύρεση όλων των στοιχείων που πληρούν τα κριτήρια. Για παράδειγμα, για να βρείτε όλους τους τίτλους σε μια σελίδα:

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

Ⅲ Χρησιμοποιήστε τον επιλογέα CSS

select Η μέθοδος επιτρέπει τη χρήση επιλογέων CSS για την εύρεση στοιχείων. Για παράδειγμα, για να βρείτε όλους τους τίτλους:

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

IV. Λήψη χαρακτηριστικών στοιχείων

μπορεί να χρησιμοποιηθείattrs Ιδιότητες Λαμβάνει το λεξικό χαρακτηριστικών του στοιχείου. Για παράδειγμα, λάβετε τις διευθύνσεις URL όλων των εικόνων:

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

4. Αναζητήστε τη λίστα ταινιών Douban

εικόνα-20240607021500369

Τίτλος ταινίας: Το όνομα της ετικέτας HTML είναι: span και το χαρακτηριστικό class του καθορισμένου στοιχείου είναι τίτλος.

εικόνα-20240607021403243

Βαθμολογία: Η ετικέτα HTML είναι: span και το χαρακτηριστικό class του καθορισμένου στοιχείου είναι 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

εικόνα-20240607021144542

Η ανίχνευση ήταν επιτυχής, αλλά μόνο η πρώτη σελίδα ανιχνεύτηκε και το επόμενο περιεχόμενο δεν ανιχνεύτηκε με επιτυχία.Αναλύστε την παραπάνω σύνδεση url, κάθε σελίδα περνάει τοstartΟι παράμετροι σελιδοποιούνται.

εικόνα-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