Mengubah agen pengguna di urllib2.urlopen

99

Bagaimana cara mengunduh halaman web dengan agen pengguna selain yang default di urllib2.urlopen?


sumber

Jawaban:

61

Mengatur User-Agent dari Dive Into Python favorit semua orang .

Cerita pendeknya: Anda dapat menggunakan Request.add_header untuk melakukan ini.

Anda juga dapat meneruskan header sebagai kamus saat membuat Permintaan itu sendiri, sebagai catatan dokumen :

header harus berupa kamus, dan akan diperlakukan seolah-olah add_header()dipanggil dengan setiap kunci dan nilai sebagai argumen. Ini sering digunakan untuk "memalsukan" User-Agentheader, yang digunakan oleh browser untuk mengidentifikasi dirinya sendiri - beberapa server HTTP hanya mengizinkan permintaan yang datang dari browser umum, bukan dari skrip. Misalnya, Mozilla Firefox dapat mengidentifikasi dirinya sebagai "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", sedangkan urllib2string agen pengguna default adalah "Python-urllib/2.6"(pada Python 2.6).

Paolo Bergantino
sumber
117

Saya menjawab sebuah pertanyaan serupa beberapa minggu yang lalu.

Ada kode contoh dalam pertanyaan itu, tetapi pada dasarnya Anda dapat melakukan sesuatu seperti ini: (Perhatikan kapitalisasi User-Agentpada RFC 2616 , bagian 14.43.)

opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
Jason Coon
sumber
8
Metode itu berfungsi untuk tajuk lain, tetapi bukan Agen-Pengguna - setidaknya tidak di instalasi 2.6.2 saya. Agen-Pengguna diabaikan karena beberapa alasan.
Nathan
3
Saya percaya User-agentseharusnya User-Agent(Huruf A dalam huruf besar ) Sepertinya berhasil untuk saya ketika dilakukan.
KriiV
1
Nama header peka huruf besar kecil.
Nicolás
100
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request('www.example.com', None, headers)
html = urllib2.urlopen(req).read()

Atau, sedikit lebih pendek:

req = urllib2.Request('www.example.com', headers={ 'User-Agent': 'Mozilla/5.0' })
html = urllib2.urlopen(req).read()
Paolo
sumber
4
Dengan parameter bernama Anda dapat melakukan ini dalam dua baris. Hapus baris pertama dan mengganti kedua dengan ini: req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'}). Saya lebih suka formulir ini untuk membuat satu permintaan saja.
Iain Samuel McLean Elder
Atau bahkan lebih pendek, dalam satu baris:html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
pengguna
13

Untuk python 3, urllib dibagi menjadi 3 modul ...

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)
Jay Dave
sumber
Ini sangat membantu. Saya tidak mengerti mengapa saya perlu request.Request dan kemudian ulangi urllib.request.urlopen di mana versi lama hanya akan melakukan urllib.urlopen (req) baik-baik saja tetapi bagaimanapun juga, ini berfungsi dan saya tahu cara menggunakannya di python 3 sekarang .
jamescampbell
Saya masih mendapatkan Kesalahan 404 :(
Maksim Kniazev
Saya telah menghapus data=b'None'parameter yang membingungkan dari jawabannya. Ini mengubah contoh permintaan menjadi POST dengan data yang tidak valid. Mungkin alasan kegagalan dalam kasus Anda, @Maksim
pengguna
9

Semua ini seharusnya bekerja secara teori, tetapi (setidaknya dengan Python 2.7.2 di Windows) setiap kali Anda mengirim header User-agent kustom, urllib2 tidak mengirim header itu. Jika Anda tidak mencoba mengirim tajuk Agen-pengguna, itu mengirim Python / urllib2 default

Tidak satu pun dari metode ini yang tampaknya berfungsi untuk menambahkan Agen-pengguna tetapi metode tersebut berfungsi untuk tajuk lain:

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')
fijiaaron
sumber
2
opener.addheadersmungkin seharusnya [('User-agent', 'Custom user agent')]. Jika tidak, semua metode ini akan berfungsi (saya telah menguji Python 2.7.3 (Linux)). Dalam kasus Anda, ini mungkin rusak karena Anda menggunakan argumen proxy yang salah.
jfs
Bagi saya, panggilan build_opener kembali dengan User-Agent default yang sudah ditentukan di header. Jadi menambahkan hanya akan membuat header User-Agent lain, yang sebagai ke-2 akan diabaikan. Itu sebabnya sol @ jcoon's bekerja.
Vajk Hermecz
6

Untuk urllibAnda dapat menggunakan:

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')
CONvid19
sumber
5

Solusi lain di urllib2dan Python 2.7:

req = urllib2.Request('http://www.example.com/')
req.add_unredirected_header('User-Agent', 'Custom User-Agent')
urllib2.urlopen(req)
OH2GBA
sumber
2
Saya mendapatkan kesalahan 404 untuk halaman yang ada jika url dimasukkan melalui browser saya
Yebach
2

Coba ini :

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
akash karothiya
sumber
1
Pertanyaannya secara eksplisit membahas urllib2dan bukan modul lainnya.
Ron Klein
2

ada dua sifat urllib.URLopener()yaitu:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]dan
version = 'Python-urllib/1.17'.
Untuk menipu situs web, Anda perlu mengubah kedua nilai ini menjadi Agen-Pengguna yang diterima. untuk misalnya
browser Chrome: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36'
bot Google: 'Googlebot/2.1'
seperti ini

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

mengubah satu properti saja tidak akan berfungsi karena situs web menandainya sebagai permintaan yang mencurigakan.

twitu
sumber