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 .
contenido
- 1. Reglas del rastreador web
- 2. Extracción del rastreador web
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()