Conhecimento básico do módulo Request

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, httplib2e outros módulos. Mas atualmente o módulo Requests é o mais popular. E também é um bom módulo

enviar pedido:

O Requestsenvio 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
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

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

Insira a descrição da imagem aqui

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
Insira a descrição da imagem aqui

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
Insira a descrição da imagem aqui

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)

Insira a descrição da imagem aqui

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)

Insira a descrição da imagem aqui

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)

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/CSNN2019/article/details/114537245
Recomendado
Clasificación