Rastreador da Web e extração de informações do Python (Parte 1)

     Pré -requisito : Depois de aprender uma determinada base python, você pode continuar aprendendo o conteúdo do rastreador da web. Se você não tiver aprendizado básico de gramática do python, poderá navegar pelo resumo das notas de gramática básica do python .

1. Regras do rastreador da web

1. Introdução à biblioteca de solicitações

método ilustrar
request.request() Construa uma solicitação que dê suporte aos métodos subjacentes dos seguintes métodos
request.get() O principal método de obtenção de páginas HTML, correspondente ao HTTP get
request.head() O método para obter as informações do cabeçalho da página HTML, correspondente ao cabeçalho HTTP
request.post() O método de enviar uma solicitação POST para uma página HTML, correspondente à postagem HTTP
request.put() Envie um método de solicitação PUT para uma página HTML, correspondente a HTTP put
request.patch() Envie uma solicitação de modificação parcial para uma página HTML, correspondente a um patch HTTP
request.delete() Envie uma solicitação de exclusão para uma página HTML, correspondente à exclusão HTTP

1.1, método get()

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

request.get(url,params=Nenhum,**kwargs)

url : O link url da página a ser obtida

​params : parâmetros extras em formato de url, dicionário ou fluxo de bytes, opcional

* * kwargs : 12 parâmetros que controlam o acesso

Atributos ilustrar
r.status_code O status de retorno da solicitação HTTP, 200 significa que a conexão foi bem-sucedida, 404 significa a falha
r.texto A forma de string do conteúdo da resposta HTTP, ou seja, o conteúdo da página correspondente ao URL
r.codificação Adivinhar a codificação de conteúdo de resposta de cabeçalhos HTTP
r.aparent_encoding Codificação do conteúdo da resposta a ser analisada a partir do conteúdo (codificação alternativa)
r.conteúdo A forma binária do conteúdo da resposta HTTP

Nota : r.encoding: Se não houver charset no cabeçalho, a codificação é considerada ISO-8859-1, que não pode analisar chinês. Quando r.encoding não pode ser decodificado corretamente, você precisa usar r.apparent_encoding, atribuir a codificação obtida a r.encoding e ela pode ser analisada corretamente

#爬取案例
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, Exceção da biblioteca de solicitações

anormal ilustrar
request.ConnectionError Erros anormais de conexão de rede, como falha de consulta DNS, conexão recusada etc.
request.HTTPError Exceção de erro HTTP
request.URLRnecessário Exceção de URL ausente
request.TooManyRedirects Se o número máximo de redirecionamentos for excedido, uma exceção de redirecionamento será gerada
request.ConnectTimeout Exceção de conexão com o servidor remoto expirado
solicitações.Tempo limite O URL de solicitação expirou, resultando em uma exceção de tempo limite

1.3. Estrutura de código geral para rastrear páginas da 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

O protocolo HTTP é um protocolo de transferência de hipertexto.

HTTP é um protocolo de camada de aplicação sem estado baseado no modelo "solicitação e resposta".

Operações do protocolo HTTP

método ilustrar
OBTER Solicitação para obter o recurso no local da URL
CABEÇA Solicitação para obter o relatório de mensagem de resposta do recurso de localização de URL, ou seja, obter as informações de cabeçalho do recurso
PUBLICAR Anexar novos dados após a solicitação ao recurso no local do URL
POR Solicitação para armazenar um recurso no local do URL, substituindo o recurso no local do URL original
CORREÇÃO Solicitar uma atualização parcial do recurso na localização da URL, ou seja, alterar parte do conteúdo do recurso redirecionado
EXCLUIR Solicitação para excluir o recurso armazenado no local da URL

1.5, a análise principal da biblioteca de solicitações

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

​método : método de solicitação, consulte os seis tipos de 1.4

* * kwargs : parâmetros que controlam o acesso, todos opcionais

Tipo de parâmetro descrever
parâmetros Dicionário ou sequência de bytes, adicione url como parâmetro
dados Um dicionário, sequência de bytes ou objeto de arquivo, como o conteúdo da solicitação
json Dados no formato JSON como o conteúdo da solicitação
cabeçalhos Dicionário, cabeçalhos personalizados HTTP
biscoitos Dicionário ou CookieJar, cookie em Request
autenticação Tupla, suporte a função de autenticação HTTP
arquivos Tipo de dicionário, arquivo de transferência
tempo esgotado Defina o tempo limite em segundos
procurações Tipo de dicionário, definir servidor proxy de acesso, pode adicionar autenticação de login

2. Protocolo de robôs

Função: O site informa ao rastreador quais podem ser rastreados e quais não podem

​ Formato: arquivo robots.txt no diretório raiz do site

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

Uso do Protocolo de Robôs :

​Rastreador da Web: identifique automaticamente ou manualmente o robots.txt e rastreie o conteúdo.

​ Vinculante: o contrato Robots é recomendado, mas não vinculativo. Os rastreadores da Web podem não cumpri-lo, mas há riscos legais

3, Solicita combate ao rastreador da web da biblioteca

Simular um navegador para visitar um site:

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

3.1, palavras-chave de pesquisa do 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. Rastreamento e armazenamento de imagens de rede

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. Extração do rastreador da web

1. Uso da biblioteca Beautiful Soup

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

1.1. Elementos básicos

Belo analisador de biblioteca de sopas

analisador Instruções doença
Analisador HTML para bs4 BeautifulSoup(mk,“html.parser”) Instale a 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()

Acho que você gosta

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