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

Los rastreadores requieren que conozca al menos los conceptos básicos de las etiquetas html y css. Se recomienda aprender primero y luego aprender rastreadores. Es
muy simple y puede comprender lo que hacen html y css en un día.
Si no quieres aprender, tienes que leer mi explicación mientras Baidu no entiende lo que no entiendes.

Consulte el último bloque de código para ver el código completo. No se recomienda usarlo directamente. Se recomienda comprender lentamente el principio y escribir su propio código único.

Primero arroje algunos documentos de referencia
documentación de urllib: https://docs.python.org/3.7/library/urllib.html
documentación china de beautifulsoup: https://www.crummy.com/software/BeautifulSoup/bs4/doc/index. zh.html
sobre documentación: https://docs.python.org/3.7/library/re.html

1. Obtener información de texto


urllib es el paquete bs4 que viene con python3 y necesita ser descargado
Después de configurar las variables de entorno, ingrese pip install bs4 en cmd

from urllib import request
from bs4 import BeautifulSoup
#要抓取的链接
url = "https://blog.csdn.net/qq_36376711/article/details/86614578"
#获取到的内容
content = request.urlopen(url)
#获取网页的源码
encode_html = content.read()
#print(encode_html)#打印出来会发现是编码过的html
#解码,一般是utf-8
html = encode_html.decode("utf-8")
#print(html)#打印发现中文能正常显示了

Se realiza el acceso más simple (el acceso solo requiere la biblioteca urllib)

Analicemos los datos obtenidos (usando bs4 para el análisis).
Aquí, tome el número de lecturas de este artículo como ejemplo.
Presione F12/ o haga clic derecho -> inspeccionar elemento. Encuentre con paciencia el valor de la clase del objeto
número de lecturas
y descubra que la clase correspondiente al conteo de lectura es conteo de lectura, que se encuentra en el par de etiquetas de intervalo

#应用BeautifulSoup对获取到的数据进行格式转换,方便数据处理
soup = BeautifulSoup(html,"html.parser")
#同样方法找到文章标题的字体大小标签,发现是h1(不懂class,h1,标签对是啥的自己先百度html标签看了
#再来)
#一看就知道这个大小的字体只有标题
print("文章:",soup.h1)#直接通过标签属性访问
#找到soup中所有标签名为span,且span对应的class名为read-count的标签对
print("阅读数:",soup.find_all("span","read-count"))#通过标签加类别

Como resultado de la impresión, encontramos que resultado
la parte del par de etiquetas que no queríamos ver también se imprimió
, por lo que la parte anterior del código se modificó de la siguiente manera:

print("文章:",soup.h1.get_text())
#因为count是个列表,所以不能像上面一样直接get_text()
count = soup.find_all("span","read-count")
for c in count:
    print("阅读数:",c.get_text())

No se puede acceder a esta forma de escritura normalmente cuando se elimina el artículo, el servidor CSDN está inactivo, etc.
No cree que sea un gran problema con solo mirar este programa, pero cuando rastrea información de múltiples URL y
resume o Al acceder a diferentes URL en un bucle cambiando la URL,
no queremos que todo el programa finalice debido a un problema con una URL
Durante el acceso de alta frecuencia, si no se establece el intervalo de acceso, ser reconocido por el mecanismo anti-crawler.
Y no hay disfraz como un encabezado de acceso aquí, por lo que el encabezado de acceso de python le dirá al objeto de acceso que es un rastreador de python de forma predeterminada.Algunos
sitios web requieren un código de verificación, algunos sitios web necesitan iniciar sesión y algunos sitios web necesitan información de encabezados para acceder normalmente. Los enlaces en el extranjero deben pasar por alto el muro y también pueden provocar una suspensión inesperada.
También necesita enviar los datos obtenidos no solo a la consola, es posible que desee enviarlos a un archivo txt o csv

El código anterior también se puede escribir como soup.find_all
(“span”,{“class”:“read-count”}).

Solo obtenga la analogía del texto anterior, no entre en detalles, el 95% de lo que no aprendió se debe a su conocimiento de html. La mayoría de las
personas no saben cómo obtener la información que quieren porque no saben cómo para analizar páginas html
, no conocimiento de python.

2. Obtén fotos

Continúe con el código anterior para agregar contenido
$ es una expresión regular, puede consultar mi otro artículo o puede buscar
https://blog.csdn.net/qq_36376711/article/details/86505332

import re#一个字符串处理的包
#获取图片的链接,"img表示选取所有img标签对"".jpg$表示获取标签对中
#所有以.jpg结尾的内容"
links = soup.find_all('img',"",src=re.compile(r'.jpg$'))
#打印出所有链接中src属性的内容
print(links.attsr["src"])

obtener imagen

import time#时间相关的包
# 设置保存图片的路径,否则会保存到程序当前路径
#要求path必须存在,所以测试时发现bug多半是因为你没有创建该文件夹
#修改path的值或者自己去E盘创建该文件夹,那些不阅读代码光复制粘贴运行的估计会认为是教学有问题
path = r'E:\pystest\images'
#路径前的r是保持字符串原始值的意思,就是说不对其中的符号进行转义
for link in links:
    #打印出所有链接中src属性的内容
    print("正在下载:",link.attrs['src'])
    #保存链接并命名,time.time()返回当前时间戳防止命名冲突
    request.urlretrieve(link.attrs['src'],path+'\%s.jpg' % time.time())
    #使用request.urlretrieve直接将所有远程链接数据下载到本地

resultado:
La imagen jpg obtenida

3. Código completo

Mejore el código y aumente la estabilidad

from urllib import request
from bs4 import BeautifulSoup
import re
import time
#导入chardet 用于检测编码
import chardet

def get_html_content(url):
    try:
        '''
        urlopen 返回对象可以使用
        1.geturl:返回请求对象的url
        2.info:对象的meta信息,包含http返回的头信息
        3.getcode:返回的http code
        例如print("URL:{0}".format(page.getcode()))
        
        '''
        xhtml = request.urlopen(url).read()
        #将bytes内容解码,转换为字符串
        #html源码里面一般有编码格式
        #利用chardet检测编码
        charset = chardet.detect(xhtml)
    except Exception as e:
        print(e)
        #urlopen可能出现httperror,如404等
        return None
    try:
        #如果找到encoding,返回其值,设置没有找到时默认为utf-8
        #使用get取值防止出错
        html = xhtml.decode(charset.get("encoding","utf-8"))
    except AttributeError as e:
        print(e)
        return None
    soup = BeautifulSoup(html,"html.parser")
    return soup
               
url = "https://blog.csdn.net/qq_36376711/article/details/85712738"

soup = get_html_content(url)
#如果获得的内容为空则直接退出
if soup is None:
    exit(0)

print("文章:",soup.h1.get_text())

count = soup.find_all("span","read-count")

for c in count:
    print("阅读量:",c.get_text())

links = soup.find_all('img',"",src=re.compile(r'.jpg$'))

path = r'E:\pystest\images'
print("以下图片将存储在:",path)

for link in links:
    print("正在下载:",link.attrs['src'])
    #建一个空的readme防止路径不存在错误
    #直接创建文件夹更好,参考下面文章,为了代码简短所以我没用
    #https://www.cnblogs.com/monsteryang/p/6574550.html
    with open(r"E:\pystest\images\readme.txt","w") as file:
        #pass表什么都不做
        pass
    request.urlretrieve(link.attrs['src'],path+'\%s.jpg' % time.time())

Acerca de cómo recopilar información de diferentes páginas web a través de bucles y lidiar con códigos de verificación y anti-rastreo, usar rastreadores de biblioteca de solicitudes o scarpy, etc. En el futuro, cuando tenga tiempo, escribiré otro artículo y agregaré enlaces aquí, o encontraré enlaces a mejores tutoriales.

Este blog es original y está escrito en base al conocimiento que el autor ha adquirido en el Aula en la Nube de Netease, el Edificio del Laboratorio y el libro "Recopilación de Datos de la Red Python".

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

Cómo ver páginas html e información de conexión http: https://blog.csdn.net/qq_36376711/article/details/86679266
Análisis más detallado:
suplemento de detalles de seguimiento de la herramienta de captura de paquetes wireshark: https://blog.csdn.net /qq_36376711 /artículo/detalles/86675208

Supongo que te gusta

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