Urllib2.urlopen üzerinde varsayılandan farklı bir kullanıcı aracısına sahip bir web sayfasını nasıl indirebilirim?
Urllib2.urlopen üzerinde varsayılandan farklı bir kullanıcı aracısına sahip bir web sayfasını nasıl indirebilirim?
Yanıtlar:
Herkesin en sevdiği Dive Into Python'dan User-Agent'ı ayarlama .
Kısa hikaye: Bunu yapmak için Request.add_header'ı kullanabilirsiniz .
Dokümanların da belirttiği gibi, İsteğin kendisini oluştururken başlıkları sözlük olarak da iletebilirsiniz :
başlıklar bir sözlük olmalıdır ve
add_header()
her anahtar ve değerle bağımsız değişken olarak çağrılmış gibi ele alınacaktır . Bu genellikleUser-Agent
, bir tarayıcı tarafından kendini tanımlamak için kullanılan üstbilgiyi "aldatmak" için kullanılır - bazı HTTP sunucuları, komut dosyalarından farklı olarak yalnızca genel tarayıcılardan gelen isteklere izin verir. Örneğin, Mozilla Firefox olarak kendini tanımlayabilir"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"
ederken,urllib2
bireyin varsayılan kullanıcı aracısı dizesi"Python-urllib/2.6"
(Python 2.6 üzerine).
Ben cevap bir benzer bir soru birkaç hafta önce.
Orada o Söz konusu örnek kod, ama temelde böyle bir şey yapabilirsiniz: (büyük harf Not User-Agent
itibariyle RFC 2616 ., Bölüm 14.43)
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
User-agent
Aslında olması gerektiğine inanıyorum User-Agent
(A büyük harfle yazılmıştır) Böyle yapıldığında benim için işe yarıyor gibi görünüyor.
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request('www.example.com', None, headers)
html = urllib2.urlopen(req).read()
Veya biraz daha kısa:
req = urllib2.Request('www.example.com', headers={ 'User-Agent': 'Mozilla/5.0' })
html = urllib2.urlopen(req).read()
req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'})
. Bu formu sadece tek bir talepte bulunmak için tercih ediyorum.
html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
Python 3 için urllib 3 modüle bölünmüştür ...
import urllib.request
req = urllib.request.Request(url="http://localhost/", headers={'User-Agent':' Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'})
handler = urllib.request.urlopen(req)
data=b'None'
parametreyi cevaptan kaldırdım . Örnek isteği geçersiz verilerle POST'a dönüştürdü. Muhtemelen sizin durumunuzdaki başarısızlığın nedeni, @Maksim
Tüm bunlar teorik olarak çalışmalıdır, ancak (en azından Windows'ta Python 2.7.2 ile) özel bir Kullanıcı aracısı başlığı gönderdiğinizde, urllib2 bu başlığı göndermez. Bir Kullanıcı aracısı üstbilgisi göndermeye çalışmazsanız, varsayılan Python / urllib2'yi gönderir.
Bu yöntemlerin hiçbiri Kullanıcı aracısı eklemek için işe yaramıyor gibi görünse de diğer başlıklar için çalışırlar:
opener = urllib2.build_opener(proxy)
opener.addheaders = {'User-agent':'Custom user agent'}
urllib2.install_opener(opener)
request = urllib2.Request(url, headers={'User-agent':'Custom user agent'})
request.headers['User-agent'] = 'Custom user agent'
request.add_header('User-agent', 'Custom user agent')
opener.addheaders
muhtemelen olmalı [('User-agent', 'Custom user agent')]
. Aksi takdirde tüm bu yöntemler çalışmalıdır (Python 2.7.3 (Linux) üzerinde test ettim). Sizin durumunuzda, proxy argümanını yanlış kullandığınız için kırılabilir.
İçin urllib
kullanabilirsiniz:
from urllib import FancyURLopener
class MyOpener(FancyURLopener, object):
version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'
myopener = MyOpener()
myopener.retrieve('https://www.google.com/search?q=test', 'useragent.html')
Bunu dene :
html_source_code = requests.get("http://www.example.com/",
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36',
'Upgrade-Insecure-Requests': '1',
'x-runtime': '148ms'},
allow_redirects=True).content
urllib2
ve diğer modülleri tartışmaz .
iki özelliği vardır urllib.URLopener()
:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]
ve
version = 'Python-urllib/1.17'
.
Web sitesini kandırmak için bu değerlerin her ikisini de kabul edilen bir Kullanıcı Aracı olarak değiştirmeniz gerekir. örneğin
Chrome tarayıcısı için: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36'
Google bot: bunun 'Googlebot/2.1'
gibi
import urllib
page_extractor=urllib.URLopener()
page_extractor.addheaders = [('User-Agent', 'Googlebot/2.1'), ('Accept', '*/*')]
page_extractor.version = 'Googlebot/2.1'
page_extractor.retrieve(<url>, <file_path>)
Web sitesi şüpheli bir istek olarak işaretlediği için yalnızca bir mülkün değiştirilmesi işe yaramaz.