Teknologian jakaminen

【Indeksointi】Indeksoinnin perusteet

2024-07-12

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


1. HTTP-vastaus ja -pyyntö

HTTP on asiakas-palvelin-protokolla, ja viestinnän osapuolet ovat asiakas ja palvelin. Asiakas lähettää HTTP-pyynnön, ja palvelin vastaanottaa ja käsittelee pyynnön ja palauttaa HTTP-vastauksen.

1. HTTP-pyyntö

HTTP-pyynnöt koostuvat pyyntöriveistä, pyyntöjen otsikoista, tyhjistä riveistä ja pyyntötiedoista (kuten POST-pyyntöjen lomaketiedoista).

  • Pyyntörivi sisältää pyyntömenetelmän, pyydetyn URL-osoitteen ja protokollan version. Yleisiä pyyntömenetelmiä ovat GET, POST, PUT, DELETE jne.
  • Pyynnön otsikko sisältää muita tietoja asiakkaasta ja pyynnöstä, kuten User-Agent, Accept, Content-Type jne.
  • Pyyntöjen otsikot ja pyyntötiedot erotetaan toisistaan ​​tyhjällä rivillä.
  • Pyyntötietoja käytetään yleensä POST-pyyntöihin, ja ne sisältävät lähetettyjä tietoja.

Pyyntöesimerkki:

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

pyyntörivi:POST /api/users HTTP/1.1

Pyynnön otsikko: Sisältää isännän, käyttäjäagentin, hyväksynnän, sisältötyypin, sisällön pituuden jne.

tyhjä rivi: Tyhjä rivi pyynnön otsikon ja pyynnön tekstin välillä

Pyynnön runko:JSON-tiedot

2. HTTP-vastaus

HTTP-vastaus koostuu tilariviltä, ​​vastausotsikoista, tyhjistä riveistä ja vastaustiedoista.

  • Tilarivi sisältää protokollan version, tilakoodin ja tilaviestin. Tilakoodi ilmaisee pyynnön käsittelytuloksen, kuten 200 osoittaa onnistumisen, 404 osoittaa, että resurssia ei löydy, 500 ilmaisee sisäisen palvelinvirheen jne.
  • Vastauksen otsikko sisältää muita tietoja palvelimesta ja vastauksesta, kuten palvelin, sisältötyyppi, sisällön pituus jne.
  • Tyhjällä rivillä erotetaan vastausotsikot ja vastaustiedot.
  • Vastaustiedot sisältävät palvelimen palauttamia tietoja, kuten HTML, JSON jne.

Olettaen, että palvelin palauttaa yksinkertaisen HTML-sivun, vastaus voi olla seuraava:

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

tilarivi:HTTP/1.1 200 OK

vastauksen otsikko: Sisältää päivämäärän, palvelimen, sisältötyypin, sisällön pituuden, yhteyden jne.

tyhjä rivi: Tyhjä viiva vastauksen otsikoiden ja vastauksen rungon välillä

vastausrunko: Sisältää HTML-koodin

3. Tilakoodi

HTTP-tilakoodit osoittavat palvelimen pyynnön käsittelytulokset. Yleisiä tilakoodeja ovat:

  • 1xx: Tietovastaus, joka osoittaa, että pyyntö on vastaanotettu ja käsittely jatkuu.
  • 2xx: menestys, joka osoittaa, että palvelin on vastaanottanut, ymmärtänyt ja hyväksynyt pyynnön.
  • 3xx: Uudelleenohjaus, joka osoittaa, että pyynnön suorittaminen edellyttää lisätoimia.
  • 4xx: Asiakasvirhe, joka osoittaa, että palvelin ei voi käsitellä pyyntöä.
  • 5xx: Palvelinvirhe, joka osoittaa, että tapahtui virhe, kun palvelin käsitteli pyyntöä.

tilakoodi

2. Pyydä kirjastoa

Pythonin Requests-kirjasto on erittäin tehokas ja helppokäyttöinen HTTP-kirjasto.

Ennen kuin käytät sitä, sinun on asennettava Requests-kirjasto:pip install requests

1. Aloita GET-pyyntö

GET-pyyntöä käytetään tietojen pyytämiseen palvelimelta. GET-pyynnön tekeminen Requests-kirjaston avulla on hyvin yksinkertaista:

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. Aloita POST-pyyntö

POST-pyyntöä käytetään tietojen lähettämiseen palvelimelle. Esimerkiksi sivustot, jotka vaativat kirjautumisen, käyttävät usein POST-pyyntöjä käyttäjänimen ja salasanan lähettämiseen. Pyyntökirjaston käyttäminen POST-pyynnön käynnistämiseen on seuraava:

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. Käsittele pyyntöotsikot

Joillakin verkkosivustoilla (kuten Douban) indeksoinnin estomekanismi ei ole sallittu indeksointiroboteille, ja HTTP-pyyntöjen otsikot ja parametrit on asetettava niin, että ne teeskentelevät selaimia ja läpäisevät todennuksen.

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

Pyyntö epäonnistui

Jos yllä oleva koodi ei esimerkiksi aseta pyynnön otsikkoa, Douban estää meiltä pääsyn.

kuva-20240607014319894

Voimme siirtyä verkkosivustolle halutessasi, löytää valmiin User-Agentin ja laittaa sen pyyntömme otsikkoon.

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

kuva-20240607014435738

Tällä tavalla voit käyttää Doubania ja saada verkkosivun sisällön.

3. BeautifulSoup-kirjasto

BeautifulSoup on Python-kirjasto HTML- ja XML-dokumenttien jäsentämiseen, erityisesti tietojen poimimiseen verkkosivuilta.

Ennen käyttöä sinun on asennettava BeautifulSoup-kirjasto:pip install beautifulsoup4

1. Jäsennä HTML-dokumentteja

html.parser Se on Pythonin sisäänrakennettu jäsentäjä ja sopii useimpiin skenaarioihin. Otetaan esimerkkinä yllä oleva 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. Etsi ja poimi tietoja

BeautifulSoup tarjoaa useita tapoja löytää ja poimia tietoja HTML-asiakirjoista.

BeautifulSoupin yleiset menetelmät:

  • find(tag, attributes): Etsi ensimmäinen ehtoja vastaava tunniste.
  • find_all(tag, attributes): Etsi kaikki vastaavat tunnisteet.
  • select(css_selector): Käytä CSS-valitsimia löytääksesi ehtoja vastaavat tunnisteet.
  • get_text(): Hae tekstisisältö tarran sisällä.
  • attrs: Hanki tunnisteen attribuuttisanakirja.

Ⅰ Etsi yksi elementti

find Menetelmää käytetään etsimään ensimmäinen kriteerit täyttävä elementti. Esimerkiksi sivun ensimmäisen otsikon etsiminen:

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

Ⅱ Etsi kaikki elementit

findAll Menetelmällä etsitään kaikki kriteerit täyttävät elementit. Voit esimerkiksi etsiä sivun kaikki otsikot seuraavasti:

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

Ⅲ Käytä CSS-valitsinta

select Menetelmä mahdollistaa CSS-valitsimien käytön elementtien etsimiseen. Voit esimerkiksi etsiä kaikki otsikot seuraavasti:

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

IV. Hanki elementtiattribuutit

voi käyttääattrs Ominaisuudet Hakee elementin attribuuttisanakirjan. Hanki esimerkiksi kaikkien kuvien URL-osoitteet:

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

4. Indeksoi Douban-elokuvaluetteloa

kuva-20240607021500369

Elokuvan nimi: HTML-tunnisteen nimi on: span ja määritetyn elementin class-attribuutti on title.

kuva-20240607021403243

Rating: HTML-tunniste on: span ja määritetyn elementin class-attribuutti on 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

kuva-20240607021144542

Indeksointi onnistui, mutta vain ensimmäinen sivu indeksoitiin, eikä myöhemmän sisällön indeksointi onnistunut.Analysoi yllä oleva URL-yhteys, jokainen sivu välittää URL-osoitteenstartParametrit on sivuttu.

kuva-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