Compartir tecnología

【Rastreador】Conceptos básicos del rastreador

2024-07-12

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


1. Respuesta y solicitud HTTP

HTTP es un protocolo cliente-servidor y las dos partes de la comunicación son el cliente y el servidor. El cliente envía una solicitud HTTP y el servidor recibe y procesa la solicitud y devuelve una respuesta HTTP.

1. Solicitud HTTP

Las solicitudes HTTP constan de líneas de solicitud, encabezados de solicitud, líneas en blanco y datos de solicitud (como datos de formulario en solicitudes POST).

  • La línea de solicitud contiene el método de solicitud, la URL solicitada y la versión del protocolo. Los métodos de solicitud comunes incluyen GET, POST, PUT, DELETE, etc.
  • El encabezado de la solicitud contiene otra información sobre el cliente y la solicitud, como Agente de usuario, Aceptar, Tipo de contenido, etc.
  • Se utiliza una línea en blanco para separar los encabezados de la solicitud y los datos de la solicitud.
  • Los datos de solicitud se utilizan normalmente para solicitudes POST y contienen datos enviados.

Ejemplo de solicitud:

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

línea de solicitud:POST /api/usuarios HTTP/1.1

Encabezado de solicitud: Contiene host, agente de usuario, aceptación, tipo de contenido, longitud del contenido, etc.

linea en blanco: Línea en blanco entre el encabezado de la solicitud y el cuerpo de la solicitud

Cuerpo de la solicitud:datos JSON

2. Respuesta HTTP

La respuesta HTTP consta de una línea de estado, encabezados de respuesta, líneas en blanco y datos de respuesta.

  • La línea de estado contiene la versión del protocolo, el código de estado y el mensaje de estado. El código de estado indica el resultado del procesamiento de la solicitud, como 200 indica éxito, 404 indica recurso no encontrado, 500 indica error interno del servidor, etc.
  • El encabezado de respuesta contiene otra información sobre el servidor y la respuesta, como servidor, tipo de contenido, longitud del contenido, etc.
  • Se utiliza una línea en blanco para separar los encabezados de respuesta y los datos de respuesta.
  • Los datos de respuesta contienen datos devueltos por el servidor, como HTML, JSON, etc.

Suponiendo que el servidor devuelve una página HTML simple, la respuesta podría ser la siguiente:

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

línea de estado:HTTP/1.1 200 OK

encabezado de respuesta: Contiene fecha, servidor, tipo de contenido, longitud del contenido, conexión, etc.

linea en blanco: Línea en blanco entre los encabezados de respuesta y el cuerpo de la respuesta

cuerpo de respuesta: Contiene código HTML

3. Código de estado

Los códigos de estado HTTP indican los resultados del procesamiento de la solicitud por parte del servidor. Los códigos de estado comunes incluyen:

  • 1xx: respuesta de información, indicando que la solicitud ha sido recibida y el procesamiento continúa.
  • 2xx: éxito, indica que la solicitud ha sido recibida, comprendida y aceptada exitosamente por el servidor.
  • 3xx: redireccionamiento, lo que indica que se requieren más acciones para completar la solicitud.
  • 4xx: error del cliente, lo que indica que el servidor no puede procesar la solicitud.
  • 5xx: error del servidor, lo que indica que se produjo un error mientras el servidor procesaba la solicitud.

código de estado

2. Biblioteca de solicitudes

La biblioteca de solicitudes de Python es una biblioteca HTTP muy potente y fácil de usar.

Antes de usarlo, debe instalar la biblioteca de Solicitudes:pip install requests

1. Iniciar una solicitud GET

La solicitud GET se utiliza para solicitar datos del servidor. Realizar una solicitud GET usando la biblioteca de Solicitudes es muy simple:

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. Iniciar una solicitud POST

La solicitud POST se utiliza para enviar datos al servidor. Por ejemplo, los sitios web que requieren un inicio de sesión suelen utilizar solicitudes POST para enviar un nombre de usuario y contraseña. El método para utilizar la biblioteca de Solicitudes para iniciar una solicitud POST es el siguiente:

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. Procesar encabezados de solicitud

En algunos sitios web (como Douban), el mecanismo anti-rastreo no está permitido para los rastreadores, y los encabezados y parámetros de las solicitudes HTTP deben configurarse para simular ser un navegador y pasar la autenticación.

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

Solicitud fallida

Por ejemplo, si el código anterior no establece el encabezado de la solicitud, Douban nos negará el acceso.

imagen-20240607014319894

Podemos ingresar al sitio web a voluntad, encontrar un Agente de usuario ya preparado y colocarlo en el encabezado de nuestra solicitud.

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

imagen-20240607014435738

De esta forma podrás acceder a Douban y obtener el contenido de la página web.

3. Biblioteca BeautifulSoup

BeautifulSoup es una biblioteca de Python para analizar documentos HTML y XML, especialmente para extraer datos de páginas web.

Antes de su uso, debe instalar la biblioteca BeautifulSoup:pip install beautifulsoup4

1. Analizar documentos HTML

html.parser Es el analizador integrado de Python y es adecuado para la mayoría de escenarios. Tome Douban arriba como ejemplo.

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. Buscar y extraer datos

BeautifulSoup proporciona múltiples métodos para buscar y extraer datos de documentos HTML.

Métodos comunes de BeautifulSoup:

  • find(tag, attributes): busque la primera etiqueta que coincida con los criterios.
  • find_all(tag, attributes): Encuentra todas las etiquetas coincidentes.
  • select(css_selector): utilice selectores CSS para buscar etiquetas que coincidan con los criterios.
  • get_text(): obtiene el contenido del texto dentro de la etiqueta.
  • attrs: Obtiene el diccionario de atributos de la etiqueta.

Ⅰ. Encuentra un solo elemento.

find El método se utiliza para encontrar el primer elemento que cumpla con los criterios. Por ejemplo, para buscar el primer título de una página:

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

Ⅱ. Encuentra todos los elementos.

findAll El método se utiliza para encontrar todos los elementos que cumplan los criterios. Por ejemplo, para buscar todos los títulos de una página:

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

Ⅲ Utilice el selector CSS.

select El método permite utilizar selectores CSS para buscar elementos. Por ejemplo, para buscar todos los títulos:

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

IV.Obtener atributos de elementos

puedo usarattrs Propiedades Obtiene el diccionario de atributos del elemento. Por ejemplo, obtenga las URL de todas las imágenes:

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

4. Rastrea la lista de películas de Douban

imagen-20240607021500369

Título de la película: el nombre de la etiqueta HTML es: span y el atributo de clase del elemento especificado es el título.

imagen-20240607021403243

Clasificación: la etiqueta HTML es: span y el atributo de clase del elemento especificado es 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

imagen-20240607021144542

El rastreo se realizó correctamente, pero solo se rastreó la primera página y el contenido posterior no se rastreó correctamente.Analice la conexión de URL anterior, cada página pasa la URL en elstartLos parámetros están paginados.

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