Bagaimana cara mengunduh halaman web dengan agen pengguna selain yang default di urllib2.urlopen?
Bagaimana cara mengunduh halaman web dengan agen pengguna selain yang default di urllib2.urlopen?
Jawaban:
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-Agent
header, 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"
, sedangkanurllib2
string agen pengguna default adalah"Python-urllib/2.6"
(pada Python 2.6).
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-Agent
pada RFC 2616 , bagian 14.43.)
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
User-agent
seharusnya User-Agent
(Huruf A dalam huruf besar ) Sepertinya berhasil untuk saya ketika dilakukan.
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()
req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'})
. Saya lebih suka formulir ini untuk membuat satu permintaan saja.
html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
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)
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
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')
opener.addheaders
mungkin 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.
Untuk urllib
Anda 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')
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
urllib2
dan bukan modul lainnya.
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.