Eu estava tentando descartar um site para praticar, mas continuei recebendo o erro HTTP 403 (ele acha que sou um bot)?
Aqui está o meu código:
#import requests
import urllib.request
from bs4 import BeautifulSoup
#from urllib import urlopen
import re
webpage = urllib.request.urlopen('http://www.cmegroup.com/trading/products/#sortField=oi&sortAsc=false&venues=3&page=1&cleared=1&group=1').read
findrows = re.compile('<tr class="- banding(?:On|Off)>(.*?)</tr>')
findlink = re.compile('<a href =">(.*)</a>')
row_array = re.findall(findrows, webpage)
links = re.finall(findlink, webpate)
print(len(row_array))
iterator = []
O erro que recebo é:
File "C:\Python33\lib\urllib\request.py", line 160, in urlopen
return opener.open(url, data, timeout)
File "C:\Python33\lib\urllib\request.py", line 479, in open
response = meth(req, response)
File "C:\Python33\lib\urllib\request.py", line 591, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Python33\lib\urllib\request.py", line 517, in error
return self._call_chain(*args)
File "C:\Python33\lib\urllib\request.py", line 451, in _call_chain
result = func(*args)
File "C:\Python33\lib\urllib\request.py", line 599, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
req
em váriasurlopen
chamadas.Error 404: Access denied
Definitivamente, ele está bloqueando por causa do uso do urllib com base no agente do usuário. A mesma coisa está acontecendo comigo com OfferUp. Você pode criar uma nova classe chamada AppURLopener que substitui o agente do usuário pelo Mozilla.
Fonte
fonte
"Isso é provavelmente devido ao mod_security ou algum recurso de segurança de servidor semelhante que bloqueia
agentes de usuário (urllib usa algo como python urllib / 3.3.0, é facilmente detectado) "- como já mencionado por Stefano Sanfilippo
O web_byte é um objeto de byte retornado pelo servidor e o tipo de conteúdo presente na página da web é principalmente utf-8 . Portanto, você precisa decodificar o web_byte usando o método de decodificação.
Isso resolve o problema completo enquanto eu tentava fazer um scrap de um site usando PyCharm
PS -> Eu uso python 3.4
fonte
Uma vez que a página funciona no navegador e não ao chamar dentro do programa python, parece que o aplicativo da web que serve esse url reconhece que você não solicita o conteúdo pelo navegador.
Demonstração:
e o conteúdo em r.txt tem linha de status:
Tente postar o cabeçalho 'User-Agent' que falsifica o cliente da web.
NOTA: A página contém uma chamada Ajax que cria a tabela que você provavelmente deseja analisar. Você precisará verificar a lógica javascript da página ou simplesmente usar o depurador do navegador (como a guia Firebug / Net) para ver qual url você precisa chamar para obter o conteúdo da tabela.
fonte
Você pode tentar de duas maneiras. O detalhe está neste link .
1) Via pip
2) Se não funcionar, tente executar um Cerificates.command que vem junto com o Python 3. * para Mac: (Vá para o local de instalação do python e clique duas vezes no arquivo)
fonte
Com base na resposta anterior,
Isso funcionou para mim estendendo o tempo limite.
fonte
Se você se sentir culpado por fingir que o user-agent é Mozilla (comentário na primeira resposta de Stefano), isso poderia funcionar com um User-Agent não urllib também. Isso funcionou para os sites que referi:
Minha aplicação é para testar a validade raspando links específicos aos quais me refiro, em meus artigos. Não é um raspador genérico.
fonte
Com base em respostas anteriores, isso funcionou para mim com Python 3.7
fonte