Soru Python'un urllib2'si: Neden bir Vikipedi sayfasını çektiğimde 403 hatası alıyorum?


Çalışırken garip bir hatam var urlopen Vikipedi'den belirli bir sayfa. Bu sayfa:

http://en.wikipedia.org/wiki/OpenCola_(drink)

Bu kabuk oturumu:

>>> f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
Traceback (most recent call last):
  File "C:\Program Files\Wing IDE 4.0\src\debug\tserver\_sandbox.py", line 1, in <module>
    # Used internally for debug sandbox under external interpreter
  File "c:\Python26\Lib\urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "c:\Python26\Lib\urllib2.py", line 397, in open
    response = meth(req, response)
  File "c:\Python26\Lib\urllib2.py", line 510, in http_response
    'http', request, response, code, msg, hdrs)
  File "c:\Python26\Lib\urllib2.py", line 435, in error
    return self._call_chain(*args)
  File "c:\Python26\Lib\urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "c:\Python26\Lib\urllib2.py", line 518, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden

Bu, farklı kıtalardaki iki farklı sistemde başıma geldi. Bunun neden olduğu hakkında bir fikri olan var mı?


44
2017-07-26 15:53


Menşei


Bu parantezleri URL kodlamak isteyebilirsiniz. Yine de 403'e karşı yardım etmeyecek. - Thomas
Ayrıca wikimedia api bağlantılarını da kullanabilirsiniz mediawiki.org/wiki/API:Main_page - chackerian


Cevaplar:


Wikipedi duruşu:

Veri alımı: Botlar kullanılamaz   herhangi bir kullanım için toplu içerik almak için   doğrudan onaylanmış bir   bot görevi. Bu dinamik olarak içerir   sayfaları başka bir web sitesinden yüklemek   Web sitesiyle sonuçlanabilir   kara listeye alınmış ve kalıcı olarak reddedildi   erişim. İndirmek isterseniz   toplu içerik veya bir projeyi yansıtmak,   lütfen indirerek veya barındırarak yapın   Veritabanımızın kendi kopyası.

Bu yüzden Python engellendi. Yapman gerekiyordu veri dökümü indir.

Neyse, böyle sayfaları Python 2'de okuyabilirsiniz:

req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) 
con = urllib2.urlopen( req )
print con.read()

Veya Python 3'te:

import urllib
req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"}) 
con = urllib.request.urlopen( req )
print con.read()

106
2017-07-26 16:15



"Bu yüzden Python engellendi." Bu cümlenin anlamı ne anlama geliyor? Ancak, ben 'Kullanıcı-Aracı' bir listesini yaptım ve bir url inşa etmek için rastgele birini seçin, web sitesi bana "urllib2.URLError: <urlopen error [Errno 10060]>" veya sadece ip benim ziyaret engellendi kendi web sitesi. Bana daha fazla fikir verebilir misin? Çok teşekkürler. - MaiTiano
Onlar da engellemek çok saçma HEAD faydalı olan talep örn. Bir kullanıcı tarafından gönderilen tüm bağlantıları doğrulamak için. - ThiefMaster♦
Bu yaklaşım benim için bir 403 döndüren bir HTTPS sayfası için de çalışıyor. Neden çalışıyor? urllib2.urlopen() Bir 403 ile sonuçlanır? - Pyderman
Ayrıca, bir api ile çalışırken 403 hatası alıyorsanız, yukarıda açıklanan çözümü kullanmalısınız. - Luis Cabrera Benito


Bunu hata ayıklamak için, bu özel durumu ele geçirmeniz gerekir.

try:
    f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
except urllib2.HTTPError, e:
    print e.fp.read()

Çıkan mesajı yazdığımda, aşağıdakileri içerir

"İngilizce

Sunucularımız şu anda yaşıyor   teknik bir problem. Bu muhtemelen   geçici ve yakında düzeltilmelidir.   Lütfen birkaç dakika içinde tekrar deneyin. "


10
2017-07-26 16:05





Çoğu zaman web siteleri, tanınmış bir kullanıcı aracısı tarafından erişilip erişilmediğini kontrol ederek erişimi filtreleyecektir. Wikipedia sadece senaryonuzu bir bot gibi ele alıyor ve reddediyor. Tarayıcı olarak aldatmayı deneyin. Aşağıdaki link, size nasıl gösterileceğini gösteren bir makale alır.

http://wolfprojects.altervista.org/changeua.php


5
2017-07-26 16:03





Bazı web siteleri, urllib gönderen başlıklarını okuyarak sunucularının 'gereksiz' kullanımını önlemek için komut dosyalarından erişimi engelleyecektir. Bunu bilmiyorum ve neden wikipedia bunu yapar / yapmaz, ama başlıklarınızı aldatmayı denediniz mi?


1
2017-07-26 16:01



meta.wikimedia.org/wiki/Bot_policy - Thomas Wouters


Jochen Ritzel'in bahsettiği gibi, Vikipedi botları bots.

Ancak PHP api kullanıyorlarsa botlar engellenmez. "Aşk" başlıklı Wikipedia sayfasını almak için:

http://en.wikipedia.org/w/api.php?format=json&action=query&titles=love&prop=revisions&rvprop=content


1
2017-08-24 07:01





Gerekli olan site tarafından engellenmeyen php kullanarak bunun için bir geçici çözüm yaptım.

Bu gibi erişilebilir:

path='http://phillippowers.com/redirects/get.php? 
file=http://website_you_need_to_load.com'
req = urllib2.Request(path)
response = urllib2.urlopen(req)
vdata = response.read()

Bu size html kodunu döndürecek


0
2017-12-18 18:38