Rastreador web de Python y extracción de información (Parte 1)

     Requisito previo : después de aprender cierta base de python, puede continuar aprendiendo el contenido del rastreador web. Si no tiene conocimientos básicos de gramática de python, puede navegar por el resumen de notas de gramática básica de python .

1. Reglas del rastreador web

1. Primeros pasos con la biblioteca de solicitudes

método ilustrar
solicitudes.solicitud() Construya una solicitud que admita los métodos subyacentes de los siguientes métodos
solicitudes.get() El método principal para obtener páginas HTML, correspondiente a HTTP get
solicitudes.head() El método para obtener la información del encabezado de la página HTML, correspondiente al encabezado HTTP
solicitudes.post() El método de enviar una solicitud POST a una página HTML, correspondiente a la publicación HTTP
solicitudes.put() Envíe un método de solicitud PUT a una página HTML, correspondiente a HTTP put
solicitudes.parche() Envíe una solicitud de modificación parcial a una página HTML, correspondiente a un parche HTTP
solicitudes.eliminar() Envíe una solicitud de eliminación a una página HTML, correspondiente a la eliminación HTTP

1.1, método get()

r = requests.get(url)	#构造一个向服务器请求资源的Request对象,返回一个Resopnse对象r

​ solicitudes.get(url,params=Ninguno,**kwargs)

​url : El enlace url de la página a obtener

​params : parámetros adicionales en formato de URL, diccionario o flujo de bytes, opcional

​ * * kwargs : 12 parámetros que controlan el acceso

Atributos ilustrar
r.status_code El estado de retorno de la solicitud HTTP, 200 significa que la conexión es exitosa, 404 significa falla
r.texto La forma de cadena del contenido de la respuesta HTTP, es decir, el contenido de la página correspondiente a la URL
r.codificación Adivinar la codificación del contenido de la respuesta a partir de los encabezados HTTP
r.aparente_codificación Codificación del contenido de la respuesta para ser analizado del contenido (codificación alternativa)
r.content La forma binaria del contenido de la respuesta HTTP

​Nota : r.encoding: si no hay un juego de caracteres en el encabezado, se considera que la codificación es ISO-8859-1, que no puede analizar el chino. Cuando r.encoding no se puede decodificar correctamente, debe usar r.apparent_encoding, asignar la codificación obtenida a r.encoding y se puede analizar correctamente

#爬取案例
import requests
r = requests.get("http://www.baidu.com")
print(r.status_code) #状态码200
print(r.encoding)   #ISO-8859-1
#   print(r.text)   不能成功解码
print(r.apparent_encoding)#utf-8
r.encoding = 'utf-8'    #修改编码方式
print(r.text)   #成功获取

1.2, Excepción de biblioteca de solicitudes

anormal ilustrar
solicitudes.ConnectionError Errores de conexión de red anormales, como falla de consulta de DNS, conexión rechazada, etc.
solicitudes.HTTPError excepción de error HTTP
solicitudes.URLRequerido Excepción de falta de URL
solicitudes.TooManyRedirects Si se supera el número máximo de redirecciones, se genera una excepción de redirección
solicitudes.ConnectTimeout Excepción de tiempo de espera de conexión al servidor remoto
solicitudes.Tiempo de espera Se agotó el tiempo de espera de la URL de la solicitud, lo que provocó una excepción de tiempo de espera

1.3 Framework de código general para rastrear páginas web

import requests

def getHTMLText(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status() #如果状态不是200,引发HTTPError异常
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"

if __name__ == "__main__":
    url = "http://www.baidu.com"	#选择爬取的网页
    print(getHTMLText(url))

1.4, protocolo HTTP

El protocolo HTTP es un protocolo de transferencia de hipertexto.

HTTP es un protocolo de capa de aplicación sin estado basado en el modelo de "solicitud y respuesta".

​Operaciones de protocolo HTTP

método ilustrar
CONSEGUIR Solicitud para obtener el recurso en la ubicación de la URL
CABEZA Solicitud para obtener el informe del mensaje de respuesta del recurso de ubicación de URL, es decir, obtener la información del encabezado del recurso
CORREO Agregar nuevos datos después de la solicitud al recurso en la ubicación de la URL
PONER Solicitud para almacenar un recurso en la ubicación de la URL, sobrescribiendo el recurso en la ubicación de la URL original
PARCHE Solicitar una actualización parcial del recurso en la ubicación de la URL, es decir, cambiar parte del contenido del recurso redirigido
ELIMINAR Solicitud para eliminar el recurso almacenado en la ubicación de la URL

1.5, el análisis principal de la biblioteca de solicitudes

requests.request(method,url,**kwargs)

​método : método de solicitud, consulte los seis tipos de 1.4

​ * * kwargs : parámetros que controlan el acceso, todo opcional

Tipo de parámetro describir
parámetros Diccionario o secuencia de bytes, agregue url como parámetro
datos Un diccionario, secuencia de bytes u objeto de archivo, como el contenido de la Solicitud
json Datos en formato JSON como contenido de Solicitud
encabezados Diccionario, encabezados personalizados HTTP
galletas Diccionario o CookieJar, cookie en Solicitud
autenticación Tuple, admite la función de autenticación HTTP
archivos Tipo de diccionario, archivo de transferencia
se acabó el tiempo Establecer el tiempo de espera en segundos
apoderados Tipo de diccionario, establecer servidor proxy de acceso, puede agregar autenticación de inicio de sesión

2. Protocolo de robots

Función: el sitio web le dice al rastreador cuáles se pueden rastrear y cuáles no.

​ Formato: archivo robots.txt en el directorio raíz del sitio web

Ejemplo: http://www.baidu.com/robots.txt

Protocolo de uso de robots :

Rastreador web: identifique automática o manualmente robots.txt y rastree el contenido.

​ Vinculante: se recomienda el acuerdo de Robots, pero no es vinculante. Es posible que los rastreadores web no lo cumplan, pero existen riesgos legales.

3, solicita el combate del rastreador web de la biblioteca

Simular un navegador para visitar un sitio web:

kv = {
    
    "user-agent":"Mozilla/5.0"}
url = ""
r = requests.get(url,headers = kv)

3.1, palabras clave de búsqueda de Baidu

import requests

# 百度搜索关键字提交:
# 百度搜索关键字格式:http://www.baidu.com/s?wd=关键字
kv = {
    
    "wd":"Python"}    #输入需要查询的关键字
r = requests.get("http://www.baidu.com/s",params=kv)
print(r.status_code)
print(r.request.url) #查询提交的url是否为想提交的
print(len(r.text)) #查询有多少长度

3.2 Rastreo y almacenamiento de imágenes de red

import requests
import os

url = "http://img0.dili360.com/pic/2022/03/28/624109135e19b9603398103.jpg"
root = "D://pics//"
path = root + url.split('/')[-1]
try:
    if not os.path.exists(root):
        os.mkdir(root)
    if not os.path.exists(path):
        r = requests.get(url)
        with open(path,"wb") as f:
            f.write(r.content)
            f.close()
            print("文件保存成功")
    else:
        print("文件已存在")
except:
    print("爬取失败")

2. Extracción del rastreador web

1. Uso de la biblioteca Beautiful Soup

from bs4 import BeautifulSoup
soup = BeautifulSoup(mk,"html.parser")

1.1 Elementos básicos

Analizador de la biblioteca Beautiful

analizador Instrucciones condición
analizador HTML para bs4 BeautifulSoup(mk,“html.parser”) Instalar la biblioteca bs4
lxml的HTML解析器 BeautifulSoup(mk,“lxml”) pip install lxml
lxml的XML解析器 BeautifulSoup(mk,“xml”) pip install lxml
html5lib的解析器 BeautifulSoup(mk,“html5lib”) pip install html5lib

Beautiful Soup类的基本元素

基本元素 说明
Tag 标签,最基本的信息组织单元,分别使用<>和</>标明开头和结尾
Name 标签的名字,

的名字是’p’,格式:.name
Attributes 标签的属性,字典形式组织,格式:.attrs
NavigableString 标签内非属性字符串,<>…</>中字符串,格式:.string
Comment 标签内字符串的注释部分,一种特殊的Comment类型

1.2、基于bs4库的HTML内容遍历方法

标签树的下行遍历

属性 说明
.contents 子节点的列表,将所有儿子节点存入列表
.children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
.descendants 子孙节点的迭代类型,包含所有子孙节点,用于循环遍历

标签树的下行遍历

属性 说明
.parent 节点的父亲标签
.parents 节点先辈标签的迭代类型,用于循环遍历先辈节点

标签树的平行遍历

属性 说明
.next_sibling 返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling 返回按照HTML文本顺序的上一个平行节点标签
.next_siblings xu迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
.previous_siblings 迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

1.3、基于bs4库的HTML格式化和编码

​ prettify():在html后自动增加换行,更好的观察标签树

​ 默认编码格式:utf-8

2、信息组织与提取方法

2.1、信息标记

信息的标记

​ 标记后的信息可形成信息组织结构,增加了信息维度

​ 标记后的信息可用于通信、存储或展示

​ 标记结构与信息一样具有重要价值

​ 标记后的信息更利于程序的理解和应用

XML:最早的通用信息标记语言,可扩展性好,但繁琐

JSON:信息有类型,适合程序处理(js),较XML简洁

YAML:信息无类型,文本信息比例最高,可读性好

2.2、信息提取的一般方法

方法一:完整解析信息的标记形式,再提取关键信息

​ 需要标记解析器,例如:bs4库的标签树遍历

​ 优点:信息解析准确

​ 缺点:提取过程繁琐,速度慢

方法二:无视标记形式,直接搜索关键信息

​ 对信息的文本查找函数即可。

​ 优点:提取过程简洁,速度较快

​ 缺点:提取结果准确性与信息内容相关

融合方法:结合形式解析与搜索方法,提取关键信息。

​ 需要标记解析器及文本查找函数

实例:提取HTML中所有的URL链接

​ 思路:搜索到所有的标签,解析标签格式,提取href后的链接内容。

import requests
from bs4 import BeautifulSoup
r = requests.get("http://python123.io/ws/demo.html")
demo = r.text
soup = BeautifulSoup(demo,"html.parser")
for link in soup.find_all('a'):
    print(link.get('href'))

2.3、基于bs4库的HTML内容查找方法

<>.find_all(name, atrs, recursive, string, **kwargs)

​ 返回一个列表类型,存储查找的结果

name:对标签名称的索引字符串。

attrs:对标签属性值的检索字符串,可标记属性检索

recursive:是否对子孙全部检索,默认True

string:<>…</>中字符串区域的检索字符串

(…) 等价于 .find_all(…)

soup(…) 等价于 soup.find_all(…)

3、实例:大学排名信息

import bs4
import requests
from bs4 import BeautifulSoup

def getHTMLText(url):
    '''获取网页的文本'''
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()  # 如果状态不是200,引发HTTPError异常
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

def fillUnivList(ulist,html):
    '''解析需要的文本,放入到列表中'''
    soup = BeautifulSoup(html,"html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string.strip('\n '),tds[1].a.string,tds[4].string.strip('\n ')])

def printUnivLIist(ulist,num):
    '''按格式化输出'''
    tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
    print(tplt.format("排名","学校名称","总分",chr(12288)))
    for i in range(num):
        u = ulist[i]
        print(tplt.format(u[0],u[1],u[2],chr(12288)))

def main():
    uinfo = []
    url = "https://www.shanghairanking.cn/rankings/bcur/2022"
    html = getHTMLText(url)
    fillUnivList(uinfo,html)
    printUnivLIist(uinfo,30)

main()

Supongo que te gusta

Origin blog.csdn.net/weixin_45573296/article/details/124324679
Recomendado
Clasificación