Ich habe versucht, eine Website zum Üben zu verschrotten, aber ich habe immer wieder den HTTP-Fehler 403 erhalten (glaubt ich, ich bin ein Bot)?
Hier ist mein Code:
#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 = []
Der Fehler, den ich bekomme, ist:
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
für mehrereurlopen
Anrufe sicher ist .Error 404: Access denied
Auf jeden Fall blockiert es aufgrund Ihrer Verwendung von urllib basierend auf dem Benutzeragenten. Das gleiche passiert mir mit OfferUp. Sie können eine neue Klasse namens AppURLopener erstellen, die den Benutzeragenten mit Mozilla überschreibt.
Quelle
quelle
"Dies liegt wahrscheinlich an mod_security oder einer ähnlichen Server-Sicherheitsfunktion, die bekannte Blöcke blockiert
Benutzeragenten (urllib verwendet so etwas wie Python urllib / 3.3.0, es ist leicht zu erkennen) "- wie bereits von Stefano Sanfilippo erwähnt
Das web_byte ist ein vom Server zurückgegebenes Byte-Objekt, und der auf der Webseite vorhandene Inhaltstyp ist meistens utf-8 . Daher müssen Sie web_byte mithilfe der Decodierungsmethode dekodieren.
Dies löst das komplette Problem, während ich versucht habe, mit PyCharm von einer Website zu verschrotten
PS -> Ich benutze Python 3.4
quelle
Da die Seite im Browser funktioniert und nicht beim Aufrufen innerhalb des Python-Programms, scheint die Web-App, die diese URL bereitstellt, zu erkennen, dass Sie den Inhalt nicht vom Browser anfordern.
Demonstration:
und der Inhalt in r.txt hat Statuszeile:
Versuchen Sie, den Header 'User-Agent' zu veröffentlichen, der den Webclient fälscht .
HINWEIS: Die Seite enthält einen Ajax-Aufruf, der die Tabelle erstellt, die Sie wahrscheinlich analysieren möchten. Sie müssen die Javascript-Logik der Seite überprüfen oder einfach den Browser-Debugger (wie die Registerkarte Firebug / Net) verwenden, um festzustellen, welche URL Sie aufrufen müssen, um den Inhalt der Tabelle abzurufen.
quelle
Sie können es auf zwei Arten versuchen. Das Detail finden Sie in diesem Link .
1) Über Pip
2) Wenn es nicht funktioniert, versuchen Sie, einen Cerificates.command auszuführen, der im Lieferumfang von Python 3 enthalten ist. * Für Mac: (Gehen Sie zu Ihrem Python-Installationsort und doppelklicken Sie auf die Datei.)
quelle
Basierend auf der vorherigen Antwort,
Dies funktionierte für mich, indem das Timeout verlängert wurde.
quelle
Wenn Sie sich schuldig fühlen, den User-Agent als Mozilla vorgetäuscht zu haben (Kommentar in der Top-Antwort von Stefano), könnte dies auch mit einem Nicht-Urllib-User-Agent funktionieren. Dies funktionierte für die Websites, auf die ich verweise:
Meine Anwendung besteht darin, die Gültigkeit zu testen, indem bestimmte Links, auf die ich in meinen Artikeln verweise, entfernt werden. Kein generischer Schaber.
quelle
Basierend auf früheren Antworten hat dies bei mir mit Python 3.7 funktioniert
quelle