[100 días de dominio de Python] Día 43: desarrollo del rastreador web Python _ conceptos básicos del rastreador (biblioteca urlib, biblioteca Beautiful Soup, uso de proxy + código de combate real)

Tabla de contenido

1 biblioteca urlib

2 Hermosa biblioteca de sopas

3 Utilice un proxy

3.1 Tipos de proxy HTTP, HTTPS y SOCKS5

3.2 Utilice urllib y solicite la biblioteca para utilizar proxy

3.3 Caso: grupo de proxy de construcción propia

4 Extracción y análisis práctico de información de vídeo.


1 biblioteca urlib

   urllibes la biblioteca estándar incorporada de Python para manejar URL, enviar solicitudes HTTP y procesar datos de red. Contiene múltiples módulos, como urllib.requestpara enviar solicitudes, urllib.parseanalizar URL, urllib.errormanejar excepciones, etc.

  • urllib.request: Se utiliza para enviar solicitudes HTTP y obtener respuestas.
  • urllib.parse: Se utiliza para analizar URL, dividir y fusionar partes de URL.
  • urllib.error: Maneja excepciones como errores de conexión, errores HTTP, etc.

Sintaxis común:

  1. Enviar una solicitud GET:
import urllib.request

url = "https://www.example.com"
response = urllib.request.urlopen(url)
content = response.read().decode("utf-8")
print(content)

2 Envíe una solicitud POST:

import urllib.request

url = "https://www.example.com"
response = urllib.request.urlopen(url)
content = response.read().decode("utf-8")
print(content)

3 ejemplos prácticos:

Rastrear contenido web:

import urllib.request

url = "https://www.example.com"
response = urllib.request.urlopen(url)
content = response.read().decode("utf-8")
print(content)

descargar archivo:

import urllib.request

url = "https://www.example.com/sample.pdf"
urllib.request.urlretrieve(url, "sample.pdf")
print("File downloaded.")

Manejar excepciones:

import urllib.error

try:
    response = urllib.request.urlopen("https://www.nonexistent-website.com")
except urllib.error.URLError as e:
    print("Error:", e)

Análisis de URL:

import urllib.parse

url = "https://www.example.com/page?param1=value1&param2=value2"
parsed_url = urllib.parse.urlparse(url)
print(parsed_url.scheme)  # 输出协议部分
print(parsed_url.netloc)  # 输出域名部分
print(parsed_url.query)   # 输出查询参数部分

Los ejemplos anteriores son sólo urllibalgunos usos de la biblioteca. Esta biblioteca es muy poderosa y puede usarla en muchas operaciones de red, incluido el rastreo, las llamadas API, etc. En proyectos reales, es posible que deba ocuparse de más detalles, como configurar encabezados de solicitud, procesar respuestas, etc. Consultar la documentación oficial puede ayudarle a comprender más completamente urllibla funcionalidad y el uso de la biblioteca. 

Procesador de 4 controladores y abridor personalizado:

Los controladores le permiten personalizar cómo se procesan las solicitudes para satisfacer necesidades específicas. urllib.requestEl módulo proporciona algunos controladores predeterminados, como HTTPHandler y HTTPSHandler, para manejar solicitudes HTTP y HTTPS. También puede combinar diferentes procesadores creando un Opener personalizado para lograr una configuración de solicitudes más flexible.

Ejemplo de abridor personalizado:

import urllib.request

# 创建自定义 Opener,组合不同的处理器
opener = urllib.request.build_opener(urllib.request.HTTPSHandler())

# 使用自定义 Opener 发送请求
response = opener.open("https://www.example.com")
content = response.read().decode("utf-8")
print(content)

5 Error de URL y error de HTTP

  URLErrory HTTPErrorambas son urllib.errorclases de excepción en el módulo para manejar condiciones de error relacionadas con solicitudes de red.

  • URLError: Se utiliza para detectar excepciones relacionadas con URL, como fallas al resolver el nombre del host, inaccesibilidad de la red, etc.
  • HTTPError: Se utiliza para capturar respuestas de error HTTP, como la página web solicitada no existe (404 no encontrada), error del servidor (500 Error interno del servidor), etc.

Ejemplo de error de URL:

import urllib.error

try:
    response = urllib.request.urlopen("https://www.nonexistent-website.com")
except urllib.error.URLError as e:
    print("URLError:", e)

Ejemplo de error HTTP:

import urllib.error

try:
    response = urllib.request.urlopen("https://www.example.com/nonexistent-page")
except urllib.error.HTTPError as e:
    print("HTTPError:", e.code, e.reason)

 En el ejemplo, e.codeestá el código de error HTTP y e.reasones el motivo del error.

En resumen, los controladores y abridores le permiten personalizar el comportamiento de las solicitudes de red URLErrory HTTPErrorle ayudan a manejar las condiciones de error que pueden surgir en las solicitudes. Estas funciones son muy útiles tanto en solicitudes de red reales como en tareas de rastreo.

2 Hermosa biblioteca de sopas

        Beautiful Soup es una biblioteca de Python para analizar documentos HTML y XML. Puede extraer datos de páginas web, manipular árboles de documentos y ayudarle a explorar y buscar diferentes partes de los documentos. Puede ayudarlo a manejar etiquetas, atributos, contenido de texto, etc., haciendo que la extracción y el procesamiento de datos sean más convenientes.

        Beautiful Soup es una poderosa biblioteca de Python para analizar documentos HTML y XML y extraer datos de ellos. Las siguientes son algunas de las sintaxis y métodos comúnmente utilizados en Beautiful Soup:

from bs4 import BeautifulSoup

# HTML 示例
html = """
<html>
<head>
<title>Sample HTML</title>
</head>
<body>
<p class="intro">Hello, Beautiful Soup</p>
<p>Another paragraph</p>
<a href="https://www.example.com">Example</a>
</body>
</html>
"""

# 创建 Beautiful Soup 对象
soup = BeautifulSoup(html, "html.parser")

# 节点选择器
intro_paragraph = soup.p
print("Intro Paragraph:", intro_paragraph)

# 方法选择器
another_paragraph = soup.find("p")
print("Another Paragraph:", another_paragraph)

# CSS 选择器
link = soup.select_one("a")
print("Link:", link)

# 获取节点信息
text = intro_paragraph.get_text()
print("Text:", text)

# 获取节点的属性值
link_href = link["href"]
print("Link Href:", link_href)

# 遍历文档树
for paragraph in soup.find_all("p"):
    print(paragraph.get_text())

# 获取父节点
parent = intro_paragraph.parent
print("Parent:", parent)

# 获取兄弟节点
sibling = intro_paragraph.find_next_sibling()
print("Next Sibling:", sibling)

# 使用 CSS 选择器选择多个节点
selected_tags = soup.select("p.intro, a")
for tag in selected_tags:
    print("Selected Tag:", tag)

# 修改节点文本内容
intro_paragraph.string = "Modified Text"
print("Modified Paragraph:", intro_paragraph)

# 添加新节点
new_paragraph = soup.new_tag("p")
new_paragraph.string = "New Paragraph"
soup.body.append(new_paragraph)

# 移除节点
link.extract()
print("Link Extracted:", link)

3 Utilice un proxy

3.1 Tipos de proxy HTTP, HTTPS y SOCKS5

  • Proxy HTTP: un proxy para el protocolo HTTP, adecuado para solicitudes HTTP, como navegar por páginas web.
  • Proxy HTTPS: un proxy para el protocolo HTTPS que puede manejar solicitudes HTTPS cifradas.
  • Proxy SOCKS5: un protocolo de proxy más general, admite tráfico TCP y UDP y es adecuado para diversas solicitudes de red.

  • Obtenga un proxy gratuito:

    Puede utilizar tecnología de rastreo para obtener la IP y el puerto del proxy desde el sitio web de proxy gratuito.

    Utilice un proxy pago:

    Los proxies pagos suelen proporcionar conexiones más estables y rápidas y son adecuados para situaciones en las que se requiere un proxy de alta calidad.

3.2 Uso urllibde requestsbibliotecas y usando proxies

URL:

import urllib.request

proxy_handler = urllib.request.ProxyHandler({'http': 'http://proxy.example.com:8080'})
opener = urllib.request.build_opener(proxy_handler)
response = opener.open('https://www.example.com')

peticiones:

import requests

proxies = {'http': 'http://proxy.example.com:8080'}
response = requests.get('https://www.example.com', proxies=proxies)

3.3 Caso: grupo de proxy de construcción propia

import requests
from bs4 import BeautifulSoup
import random

# 获取代理IP列表
def get_proxies():
    proxy_url = "https://www.example.com/proxy-list"
    response = requests.get(proxy_url)
    soup = BeautifulSoup(response.text, "html.parser")
    proxies = [proxy.text for proxy in soup.select(".proxy")]
    return proxies

# 从代理池中随机选择一个代理
def get_random_proxy(proxies):
    return random.choice(proxies)

# 使用代理发送请求
def send_request_with_proxy(url, proxy):
    proxies = {'http': proxy, 'https': proxy}
    response = requests.get(url, proxies=proxies)
    return response.text

if __name__ == "__main__":
    proxy_list = get_proxies()
    random_proxy = get_random_proxy(proxy_list)
    
    target_url = "https://www.example.com"
    response_content = send_request_with_proxy(target_url, random_proxy)
    print(response_content)

Este ejemplo demuestra cómo seleccionar aleatoriamente un proxy del grupo de proxy y utilizar el proxy seleccionado para enviar solicitudes. Tenga en cuenta que es posible que sea necesario modificar las URL y los métodos de los ejemplos según la situación real.

Estos conceptos y ejemplos pueden ayudarle a comprender cómo utilizar servidores proxy para proteger su identidad y sus datos de solicitudes o rastreadores web.

4 Extracción y análisis real  de información de video.

import urllib.request
from bs4 import BeautifulSoup

# 定义目标网页的 URL
url = 'https://www.example.com/videos'

# 定义代理(如果需要使用代理)
proxies = {'http': 'http://proxy.example.com:8080'}

# 发起请求,使用代理
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
response = urllib.request.urlopen(req, proxies=proxies)

# 解析网页内容
soup = BeautifulSoup(response, 'html.parser')

# 创建一个空的视频列表
videos = []

# 获取视频信息
video_elements = soup.find_all('div', class_='video')
for video_element in video_elements:
    title = video_element.find('h2').text
    video_link = video_element.find('a', class_='video-link')['href']
    videos.append({'title': title, 'video_link': video_link})

# 输出提取到的视频信息
for video in videos:
    print(f"Title: {video['title']}")
    print(f"Video Link: {video['video_link']}")
    print()

# 对视频信息进行分析
num_videos = len(videos)
print(f"Total Videos: {num_videos}")

        En este ejemplo, supongamos que la página de destino contiene información para varios videos, cada uno con un título y un enlace al video. Usamos urllibla biblioteca para obtener el contenido de la página web y luego usamos Beautiful Souppara analizar la página y extraer el título del video y el enlace. Finalmente, generamos la información del video extraída y realizamos un análisis simple para calcular la cantidad de videos.

        Tenga en cuenta que este ejemplo solo se utiliza para demostrar conceptos básicos de extracción y análisis de datos. En la aplicación real, es posible que deba ajustar el código para adaptarlo a la situación real de acuerdo con la estructura y el contenido de la página de destino.

Supongo que te gusta

Origin blog.csdn.net/qq_35831906/article/details/132382676
Recomendado
Clasificación