Python3 implementa artículos urllib del rastreador + procesamiento de datos (usando bs4) (2)

Esta vez presentaré un uso detallado de la biblioteca urllib y BeautifulSoup.
Solo hablaré sobre cómo usar y procesar datos. Si algunas funciones no entienden lo que hacen, o si desea saber sobre el manejo de excepciones, consulte la sección anterior. artículo: https://blog.csdn.net/qq_36376711/article/details/86614578

urllib es una biblioteca integrada para python3, y bs4 necesita pip install bs4 bajo cmd Si falla, es básicamente un problema con la configuración de la variable de entorno o pip

Pedir parte:

solicitar el método de acceso uno:

urllib.request.urlopen(url, datos=Ninguno, [tiempo de espera, ]*, cafile=Ninguno, capath=Ninguno, cadefault=Falso, contexto=Ninguno)

url puede ser una cadena o un objeto de solicitud, generalmente una dirección de enlace HTTP/HTTPS

Los datos generalmente se ignoran, actualmente solo HTTP/HTTPS usa datos

timeout especifica el tiempo de espera de la conexión, solo válido para conexiones HTTP, HTTPS, FTP

Los parámetros cafile y capath opcionales especifican un conjunto de certificados de CA de confianza para solicitudes HTTPS.

Cadefault no me importa

context es una instancia de ssl.SSLContext que describe varias opciones de SSL

from urllib import request

url = "https://docs.python.org/3.7/library/urllib.html"
#urlopen是request库中最简单的访问方法
content = request.urlopen(url)
#显示你访问的url地址
print(content.geturl())
#以email.message_from_string()实例的形式返回页面的元信息,例如标题
#参考:https://docs.python.org/3.7/library/email.parser.html#email.message_from_string
print(content.info())
#html访问成功则返回200
print(content.getcode())

html = content.read().decode("utf-8")

Se devolverá un objeto http.client.HTTPResponse si el acceso HTTP o HTTPS es exitoso, y
se devolverá una subclase de excepción http.client.HTTPException si falla

urllib.request.urlopen() corresponde a urllib2.urlopen en la versión anterior

Solicitar el método de acceso dos:

class urllib.request.Request(url, data=Ninguno, headers={}, origin_req_host=Ninguno, no verificable=Falso, método=Ninguno)
Esta es la clase abstracta de solicitud de URL

url2 = "https://www.csdn.net/"
#构造头数据,伪装成正常浏览器访问
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0'}
content2 = request.Request(url=url2, headers=headers)
html2 = content2.read().decode("utf-8") 

Presione F12 o haga clic con el botón derecho en el navegador para inspeccionar el elemento, encontrar la red y realizar algunas operaciones. Tome el ejemplo de ingresar un texto para traducir al acceder a Google Translate. Después de ingresar, se encuentra que se produce el intercambio de datos. Haga clic en en cualquier elemento para encontrar encabezados de solicitud. Los parámetros de los encabezados que se utilizan realmente necesitan que usted mismo compruebe el sitio web que desea rastrear y analice la situación específica. Algunos parámetros innecesarios tampoco se pueden completar, esto requiere un intento paciente.

Si no puede entender con solo leer el texto, consulte la descripción gráfica:
https://blog.csdn.net/qq_36376711/article/details/86679266

encabezados
Algunos ejemplos dados por la documentación de urllib

with urllib.request.urlopen('http://www.python.org/') as f:
	print(f.read(300))

hermosa parte de la sopa:

bs4: biblioteca de Python para extraer datos de archivos HTML o XML
Documentación en chino:
https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
y módulos similares a bs4 son html.parser (python viene con es) y lxml

from urllib import request
from bs4 import BeautifulSoup
url = "https://blog.csdn.net/qq_36376711/article/details/86675208"
html = request.urlopen(url).read().decode("utf-8")
soup = BeautifulSoup(html,'html.parser')

El parámetro html.parser se usa para especificar el analizador
Clasificación del analizador

#也可以直接通过本地html文档或者传入一个字符串(符合html语法的字段)直接构建bs对象
soup = BeautifulSoup(open("index.html"))
soup = BeautifulSoup("<html>data</html>")

El método anterior convertirá el documento a Unicode y todas las instancias de HTML se convertirán a la codificación Unicode.

#获取所有文字部分
print(soup.get_text())
#格式化输出获取到的soup
print(soup.prettify())

#通过标签访问标题,因为标题的字体是h1标签内的内容
#soup.h1包含标签,soup.h1.get_text()不含标签
print(soup.h1.get_text())
#方式不同,但和上一句结果相同
print(soup.h1.string)

Busque las etiquetas de encabezado:
h1
Soup.h1:
sopa.h1
Soup.h1.get_text():
sopa.h1.get_text

find_all( nombre , atributos , recursivo , texto , **kwargs )

find( nombre , atributos , recursivo , texto , **kwargs )

name se refiere al nombre de la etiqueta (html, span, div, p, h1, etc.), attr se refiere al valor/clase (categoría) del atributo de la etiqueta, recursive especifica si buscar recursivamente, el valor predeterminado es True

#利用soup.h1输出,会发现,h1类标签(不懂的话你就理解成字体最大的)明明不止标题,所以可以看出
#soup.h1找到第一个符合条件的值就会停止搜索,所以我们采用find_all()来找出所有满足条件的
#findAll()与find_all()都可用
text_h1 = soup.find_all("h1")
for text in text_h1:
    print(text.get_text())
#通过属性值,如class查找,上面的h1是通过标签查找
#有些tag属性在搜索不能使用,比如HTML5中的 data-* 属性:
print(soup.find_all("title")[0].get_text())
#通过id查找,id=True表示查找所有具有id属性的标签
print(soup.find_all(id="article_content"))

#sopa.find_all("a") es equivalente a sopa("a")

#find也是找到第一个满足条件的就会停止
print(soup.find(h1).get_text())

La descripción simple del parámetro de texto es incómoda de entender, así que vaya directamente a la documentación china de bs
descripción del parámetro de texto

#也可以通过string访问其值
print(soup.h1.string)#前面也提到过
#访问标签名
print(soup.h1.name)
#访问标签的父节点(上级标签)#同理可访问兄弟节点和子节点
print(soup.h1.parrent)
#可以直接修改soup的属性:tag[attribute] = "value",如
h1[class] = "title"
#应用场景:批量修改部分标签属性等
#通过标签加类别
print("文章阅读数:",soup.find_all("span","read-count")[0].get_text())
#找出所有的h1-h6标签
h_list = soup.find_all({"h1","h2","h3","h4","h5","h6"})
#由于find_all返回的是个列表,所以用循环打印输出,不能直接用.get_text()
#或者像获取文章阅读数一样用 [0]去获取
for h in h_list:
	print(h.get_text())

下面两句完全等价,class为python保留字,所以用class_
soup.find_all(class_ = "recommend-right")
soup.find_all("",{"class":"recommend-right"})
#利用html节点的contents属性获取数据,当该节点没有子节点时会报错
for content in soup.head.contents:
	#content没有string属性和get_text()方法
    print(content)

#Acceso al nodo secundario
para el niño en sopa.cabeza.niños:
imprimir(niño)

True coincide con todas las etiquetas, pero no devuelve nodos de cadena, lo cual es conveniente para ver qué campos tiene la página html

for tag in soup.find_all(True):
    print(tag.name)

También puede usar la coincidencia de expresiones regulares para buscar datos en combinación con la biblioteca re, que se explicó en el artículo anterior y no se repetirá aquí.

Además, hay otras funciones de búsqueda disponibles y búsquedas según css
como:
find_parents( nombre , atributos , recursivo , texto , **kwargs )
find_parent( nombre , atributos , recursivo , texto , **kwargs )
find_all_next( nombre , atributos , recursive , text , **kwargs )
find_next( name , attrs , recursive , text , **kwargs )
...
el resultado del artículo es un poco confuso y será refactorizado más adelante (divertido)

Este blog es original y está escrito en base al conocimiento que el autor ha adquirido en el libro "Python Network Data Collection" y documentos oficiales.

Eres libre de modificar y publicar esta publicación de blog, incluso puedes decir que la escribiste tú mismo.

El próximo artículo está programado para explicar cómo rastrear una gran cantidad de información de la página y tratar con un mecanismo anti-rastreador simple.

Supongo que te gusta

Origin blog.csdn.net/qq_36376711/article/details/86675208
Recomendado
Clasificación