Artigo Diretório
Introdução ao Módulo de Solicitação
Podemos obter o conteúdo dessas solicitações e respostas no navegador, então podemos "forjar" a solicitação? Ou seja, não mais enviando esses dados pelo navegador, mas sim pelo python para simular o navegador para enviar a solicitação. A resposta é viável. O módulo Request pode realizar essa função.
O módulo Requests é uma biblioteca HTTP simples e fácil de usar implementada por Python
Existem outras bibliotecas? A resposta é sim, por exemplo urllib
, urllib2
, httplib
, httplib2
e outros módulos. Mas atualmente o módulo Requests é o mais popular. E também é um bom módulo
enviar pedido:
O Requests
envio de solicitações de rede é muito simples. No início, é necessário importar o módulo de solicitações
import requests
Em seguida, tente obter uma determinada página da Web. Neste exemplo, vamos obter a página inicial da página da Sogou:
r=requests.get('https://www.sogou.com/')
Agora, temos um objeto Response denominado r, e podemos obter as informações que queremos desse objeto. Por exemplo: imprima o conteúdo devolvido
r.text
Na verdade, se abrirmos este URL no navegador, clicar com o botão direito e selecionar "Exibir código-fonte da página", você descobrirá que é exatamente o mesmo que acabamos de imprimir (se não houver anti-crawl ou o site é um site estático). Em outras palavras, as poucas linhas de código acima nos ajudaram a rastrear todo o código-fonte da página inicial do Sogou.
URLs de emenda:
1.
import requests
url='https://www.sogou.com/web?query='+'挖掘机小王子'
response=request.get(url)
print(response.text)
import requests
url='https://www.sogou.com/web?‘
param={
'query' : '挖掘机小王子'
}
response=request.get(url,params=param)
print(response.text)
Observação: nenhuma das chaves do dicionário será adicionada à string de consulta do URL
Amplie o conhecimento:
você também pode passar em uma lista:
import requests
payload={
’key1‘:'value1','key2':['value2','value3']}
r=requests.get('http://httpbin.org/get',params=payload)
print(r.url)
O resultado impresso é: http://httpbin.org/get?key1=vavlue1&key2=value2&key2=value3
Conteúdo da resposta de texto
Podemos ler o conteúdo da resposta do servidor. Antes disso, usávamos r.text para acessar o conteúdo retornado a nós pelo servidor. E podemos ver o conteúdo retornado, a mágica é que nem fizemos nada sobre codificação e decodificação. na verdade
as solicitações decodificarão automaticamente o conteúdo do servidor. A maioria dos conjuntos de caracteres UNICODE podem ser decodificados sem problemas.
Depois que a solicitação for enviada, as Solicitações farão uma suposição fundamentada na codificação da resposta do cabeçalho HTTP. Quando você visita r.text, as solicitações usam sua codificação de texto suposta. Você pode descobrir qual codificação o Requests usa e pode usar a propriedade e.encoding para alterá-la:
r.encoding
results in'utf -8 '
r.encoding='gb2312'
Se você alterar a codificação, toda vez que acessar r.text, Request usará o novo valor de r.encoding
A página HTML pode definir informações de codificação, você pode visualizar as informações de codificação e, em seguida, definir r.encoding para a codificação correspondente
para que a codificação correta possa ser usada para analisar r.text. E a codificação da página da web pode ser visualizada no navegador
Binário: as
solicitações decodificarão automaticamente o gzip e esvaziarão os dados de resposta codificados da transmissão para você
Por exemplo, as informações da imagem podem ser facilmente salvas em um arquivo. Para imagens, mp3, vídeo e outros dados, muitas vezes é necessário usar um método binário para ler
as solicitações de importação
url='https://pic.sogou.com/pics/recompic/detail.jsp?category=%E7%BE%8E%E5%A5%B3&tag=%E5%86%99%E7%9C%9F#1%263976741'
r=requests.get(url)
print(r.content)
with open('baidu.png','wb') as f:
f.write(r.content)
1.r.content é a informação binária 2.open
() abre o objeto de arquivo com o gerenciador de contexto, ele pode nos ajudar a fechar automaticamente o arquivo
f = open ()
f.write ()
f.close ()
3.como está para obter um Alias, o apelido
4.wb w é para gravar, mesmo se um arquivo for aberto para gravar dados, b é para gravar dados binários,
r é para ler dados e
a é para anexar dados, não sobrescrever dados
gbk gb2312
Cabeçalho de solicitação personalizada:
O objetivo final da construção de um site é que as pessoas visitem; na verdade, quase todos os sites não aceitam rastreadores. Mesmo agora, mais e mais sites irão proibir diretamente a visita do rastreador quando descobrirem que a outra parte é um programa rastreador. Ou seja, nenhuma informação será retornada ao rastreador e alguns retornarão um prompt: você está visitando ilegalmente! !
Como o servidor da web sabe que somos um rastreador? Existem muitas maneiras de julgar, e a mais comum é julgar pelo cabeçalho da solicitação.
Ao enviar uma solicitação HTTP, o navegador trará as informações do cabeçalho da solicitação, etc. (o padrão não é quando o programa é enviado) se o nosso programa não trouxer, ou as informações do cabeçalho da solicitação estiverem erradas, ou seja, não ser enviado pelo servidor Sim, será rejeitado pelo servidor.
A verificação do cabeçalho da solicitação também é a estratégia anti-crawler mais simples
Adicionar cabeçalho de solicitação
Nossa solução é simular a função ou comportamento do navegador o máximo possível. Uma vez que o navegador envia o cabeçalho da solicitação, nosso programa deve naturalmente também adicioná-lo. Em Requests, adicionamos informações de cabeçalho de solicitação por meio do parâmetro headers
imports requests
url=''
headers={
'User-Agent':' '
}
e=requests.get(url,headers=headers)
A solicitação POST é usada principalmente para enviar dados do formulário e, em seguida, o servidor analisa os dados do formulário e decide que tipo de dados retornar ao cliente
Dados de envio de formulário
Também é relativamente fácil realizar uma solicitação POST em Solicitações. Para isso, basta passar um dicionário para o parâmetro de dados e seu dicionário de dados será codificado automaticamente como um formulário ao fazer uma solicitação:
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post {'', data = payload}
Obviamente, o método post no Request é apenas mais um parâmetro de dados comparado ao método get. Outros Os parâmetros são semelhantes. Por exemplo, também podemos adicionar o parâmetro params da string de consulta ao URL na postagem ou adicionar o parâmetro headers como o método get.
Dados de postagem
Content-Type é o tipo de dado a ser transferido 1. Content-Type
: application / x-www-form-urlencoded (Form form) O
parâmetro data é usado quando o formulário é passado e um dicionário é aceito.
2. Content-Type: application / json (transferir dados no formato json)
ao transferir dados, use os parâmetros json e aceite um dicionário.
Você também pode usar data = json.dumps () para converter o formato (converter o dicionário em uma string )
Código de status de resposta
O código de status de resposta facilita a verificação do status de nossa resposta. Podemos verificar o código de status de resposta:
r = requests.get ('https://httpbin.org/get')
r.status_code
Se uma solicitação de erro for enviada (a 4XX Client error ou 5XX server error response), podemos
lançar uma exceção por meio de response.raise_for_status ():
r = requests.get ('https://httpbin.org/status/404')
r.status_code # 404
r. raise_for_status () #tray exception
#Exception Error
Traceback (última chamada mais recente):
Arquivo “requests / models.py”, linha 832, em raise_for_status,
levanta http_errorrequests.exceptions.HTTPError: 404 Erro do cliente
Se o status_code de r no exemplo for 200, quando chamamos raise_for_status (), o que obtemos é:
r.raise_for_status () # 200
Nenhum
Verifique o código de status r.status_code 200, que geralmente é usado para julgar se a solicitação foi bem-sucedida
Cabeçalho de resposta
Podemos ver o cabeçalho da resposta do servidor na forma de um dicionário Python
r.headers #O
resultado é
{'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'connection': 'close'}
Mas este dicionário é especial? : É apenas para cabeçalhos HTTP. De acordo com RFC2616 (protocolo HTTP1.1), os cabeçalhos HTTP não diferenciam maiúsculas de minúsculas
Portanto, podemos usar qualquer formulário em maiúsculas para acessar estes campos de cabeçalho de resposta:
r.headers ['Content-Type'] # 'application / json'
r.headers.get ('Content-Type') # 'application / json'
O cabeçalho de resposta r.headers retorna as informações do cabeçalho de resposta em um formato de dicionário e pode ser acessado em um dicionário
Biscoito
Existe esse tipo de site no site atual, que é um site que exige que os usuários se registrem e façam login para acessar, ou que não possam acessar seus dados privados sem fazer login, como Weibo, WeChat, etc.
A forma como o site registra as informações do usuário é através do valor do cookie do cliente. Por exemplo, quando salvamos a conta e a senha no navegador, o navegador salva as informações do usuário em nosso computador e, da próxima vez que visitarmos esta página, será automaticamente carregar informações de cookies para nós
No site que precisa fazer o login, o navegador envia as informações do cookie e o servidor verifica as informações do cookie para confirmar o login. Uma vez que o navegador carrega informações de cookies ao enviar a solicitação, nosso programa também deve carregar informações de cookies
Um cookie é um pedaço de texto armazenado no seu computador quando você visita um determinado site ou uma página específica. Ele é usado para rastrear e registrar os dados relevantes dos visitantes do site, como preferências de pesquisa, cliques de comportamento, números de contas, senhas, etc. .
Normalmente, as informações do valor do cookie podem ser copiadas no navegador e colocadas nos cabeçalhos
headers = { 'Aceitar': 'application / json, text / javascript, / ; q = 0.01', 'Aceitar Codificação': 'gzip, deflate, br', 'Conexão': 'keep-alive''Cookie ': 'xxxxxxxxxxxxxxxxxxxxxxxx' #Copiar no navegador ………………………… } Isso pode ser enviado junto com o cabeçalho da solicitação. Obviamente, as solicitações também fornecem parâmetros de cookies para enviarmos informações de cookies:
import requests
url=xxx
cookies={
'Cookie':'你的cookie值'}
r=request.get(url,cookies=cookies)
Caso de visita da estação B
import requests
url='https://account.bilibili.com/home/userInfo'
r=requests.get(url)
print(r.json())
Histórico de redirecionamento e solicitação
Redirecionar
Redirecionamento é redirecionar uma solicitação de rede para outro local por meio de vários métodos. O possível motivo é que alguns URLs estão obsoletos e não estão prontos para serem usados, etc.
Lidar com redirecionamento
Por padrão, para nossas solicitações GET e POST comumente usadas, etc., as Solicitações tratam automaticamente todos os redirecionamentos. Por exemplo, o Github redireciona todas as solicitações HTTP para HTTPS:
r=requests.get('http://github.com')
r.url #'https://github.com'
r.status_code #200
Se você estiver usando GET, POST, etc., poderá desativar o processamento de redirecionamento por meio do parâmetro allow_redirects:
r=requests.get('http://github.com',allow_redirects=Flase)
r.status_code #301
Você pode usar o método de histórico do objeto de resposta para rastrear redirecionamentos. response.history é uma lista de objetos Response. Esses objetos são criados para concluir a solicitação. A lista de objetos é classificada da solicitação mais antiga até a mais recente.
r=requests.get('http://github.com')
r.history #[<Response[301]>]
tempo esgotado
Às vezes não queremos esperar muito tempo devido ao tempo ou ao site do outro e esperar que a resposta seja retornada. Então podemos adicionar um parâmetro de tempo limite. Se exceder o tempo que definimos e a resposta não tiver retornado, então não esperamos novamente.
Você pode dizer às solicitações para parar de esperar por uma resposta após o número de segundos definido pelo parâmetro de tempo limite. Recomenda-se que todos os códigos de produção usem este parâmetro
request.get (('http: //github.com',timeout=0.001)
Erros e exceções
Ao encontrar problemas de rede (como: falha de consulta DNS, conexão recusada, etc.), Requests lançará uma exceção ConnectionError
1. Se a solicitação HTTP retornar um código de status malsucedido, Response.raise_for_status () lançará uma exceção HTTPError
2. Se a solicitação
atinge o tempo limite, uma exceção de tempo limite será lançada 3. Se a solicitação exceder o número máximo definido de redefinições, uma exceção TooManyRedirects será lançada
Todas as exceções lançadas explicitamente por Requests herdam de request.exceptions.RequestException
Caracteres são o termo geral para vários caracteres e símbolos, incluindo caracteres nacionais, sinais de pontuação, símbolos gráficos, números, etc. Um conjunto de caracteres é uma coleção de vários caracteres. O
conjunto de caracteres inclui: conjunto de caracteres ASCII, conjunto de caracteres GB2313, conjunto de caracteres GB18030, conjunto de caracteres Unicode, etc. O
código ASCII tem 1 byte e o código Unicode geralmente tem 2 bytes
Agente do usuário:
Mozilla / 5.0 (Windows NT 10.0; WOW64) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 70.0.3538.25 Safari / 537.36 Core / 1.70.3866.400 QQBrowser / 10.8.4379.400
XP corresponde ao Windows NT 5.1
Windows 7 corresponde ao Windows NT 6.1
Windows 8 corresponde ao Windows NT 6.3
A solicitação GET refere-se à solicitação de dados do servidor
Agente do usuário:
Mozilla / 5.0 (Windows NT 10.0; WOW64) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 70.0.3538.25 Safari / 537.36 Core / 1.70.3866.400 QQBrowser / 10.8.4379.400
Modificar cabeçalhos
Modificado pelo parâmetro headers de Request
import requests
url='https://www.baidu.com/'
heads={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400'
}
e=requests.get(url,headers=heads)
print(e.status_code)
import json
import urllib.request
import urllib.parse
url='https://www.baidu.com/'
heads={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400'
}
e=urllib.request.Request(url,heads)
print(e)
Modificado pelo método request.add_header ()
import json
import urllib.request
import urllib.parse
url='https://www.baidu.com/'
heads={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400'
}
e=urllib.request.Request(url)
e.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3866.400 QQBrowser/10.8.4379.400')
print(e)