Urllib2.urlopen üzerinde kullanıcı aracısını değiştirme


100

Urllib2.urlopen üzerinde varsayılandan farklı bir kullanıcı aracısına sahip bir web sayfasını nasıl indirebilirim?

Yanıtlar:


61

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 genellikle User-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, urllib2bireyin varsayılan kullanıcı aracısı dizesi "Python-urllib/2.6"(Python 2.6 üzerine).


118

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-Agentitibariyle 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')

8
Bu yöntem diğer başlıklar için çalışır, ancak User-Agent için geçerli değildir - en azından benim 2.6.2 kurulumumda değil. User-Agent bazı nedenlerden dolayı göz ardı edilir.
Nathan

3
User-agentAslı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.
KriiV

1
Üstbilgi adları büyük / küçük harfe duyarlıdır.
Nicolás

100
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()

4
Adlandırılmış parametreler ile bunu iki satırda yapabilirsiniz. İlk satırı çıkarın ve bununla ikinci değiştirin: req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'}). Bu formu sadece tek bir talepte bulunmak için tercih ediyorum.
Iain Samuel McLean Elder

Veya daha da kısa, tek satırda:html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
kullanıcı

13

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)

Bu çok yardımcı oldu. Neden request.Request'e ihtiyacım olduğunu anlamıyorum ve sonra urllib.request.urlopen'i tekrarlayın, burada eski sürüm sadece urllib.urlopen (req) iyi olur, ancak her iki durumda da bu işe yarıyor ve şimdi python 3'te nasıl kullanılacağını biliyorum .
jamescampbell

Hala Hata 404 alıyorum :(
Maksim Kniazev

Kafa karıştırıcı 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
kullanıcı

9

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')

2
opener.addheadersmuhtemelen 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.
jfs

Benim için build_opener çağrısı, başlıklarda önceden tanımlanmış bir varsayılan Kullanıcı Aracısı ile geri döner. Yani eklemek sadece başka bir User-Agent başlığı oluşturacaktır ve bu başlık 2. olarak göz ardı edilecektir. Bu yüzden @ jcoon'un çözümü çalışıyor.
Vajk Hermecz

6

İçin urllibkullanabilirsiniz:

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')

5

urllib2Python 2.7'de başka bir çözüm :

req = urllib2.Request('http://www.example.com/')
req.add_unredirected_header('User-Agent', 'Custom User-Agent')
urllib2.urlopen(req)

2
Tarayıcımdan url girildiyse var olan bir sayfa için 404 hatası alıyorum
Yebach

2

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

1
Soru açıkça tartışılır urllib2ve diğer modülleri tartışmaz .
Ron Klein

2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.