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 .
contente
- 1. Regras do rastreador da web
- 2. Extração do rastreador da web
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()