Làm cách nào để tải xuống trang web có tác nhân người dùng khác với tác nhân mặc định trên urllib2.urlopen?
Làm cách nào để tải xuống trang web có tác nhân người dùng khác với tác nhân mặc định trên urllib2.urlopen?
Câu trả lời:
Đặt User-Agent từ Dive Into Python yêu thích của mọi người .
Câu chuyện ngắn: Bạn có thể sử dụng Request.add_header để làm điều này.
Bạn cũng có thể chuyển các tiêu đề làm từ điển khi tạo Yêu cầu, như tài liệu lưu ý :
tiêu đề phải là một từ điển và sẽ được coi như thể
add_header()
được gọi với mỗi khóa và giá trị dưới dạng đối số. Điều này thường được sử dụng để "giả mạo"User-Agent
tiêu đề, được sử dụng bởi trình duyệt để nhận dạng chính nó - một số máy chủ HTTP chỉ cho phép các yêu cầu đến từ các trình duyệt phổ biến chứ không phải tập lệnh. Ví dụ: Mozilla Firefox có thể tự nhận dạng là"Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"
, trong khiurllib2
chuỗi tác nhân người dùng mặc định là"Python-urllib/2.6"
(trên Python 2.6).
Tôi đã trả lời một câu hỏi tương tự cách đây vài tuần.
Có mã ví dụ trong câu hỏi đó, nhưng về cơ bản bạn có thể làm như sau: (Lưu ý cách viết hoa User-Agent
của RFC 2616 , phần 14.43.)
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
User-agent
trên thực tế phải là User-Agent
(Chữ A được viết hoa) Có vẻ hiệu quả với tôi khi làm như vậy.
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request('www.example.com', None, headers)
html = urllib2.urlopen(req).read()
Hoặc ngắn hơn một chút:
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'})
. Tôi thích biểu mẫu này vì chỉ đưa ra một yêu cầu duy nhất.
html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
Đối với python 3, urllib được chia thành 3 mô-đun ...
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'
thông số khó hiểu khỏi câu trả lời. Nó đã chuyển đổi yêu cầu mẫu thành POST với dữ liệu không hợp lệ. Có thể là lý do của sự thất bại trong trường hợp của bạn, @Maksim
Tất cả những điều này về lý thuyết sẽ hoạt động, nhưng (với Python 2.7.2 trên Windows ít nhất) bất kỳ khi nào bạn gửi tiêu đề Tác nhân người dùng tùy chỉnh, urllib2 sẽ không gửi tiêu đề đó. Nếu bạn không cố gắng gửi tiêu đề Tác nhân người dùng, nó sẽ gửi Python / urllib2 mặc định
Dường như không có phương pháp nào trong số này hoạt động để thêm Tác nhân người dùng nhưng chúng hoạt động với các tiêu đề khác:
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
có lẽ nên được [('User-agent', 'Custom user agent')]
. Nếu không, tất cả các phương pháp này sẽ hoạt động (Tôi đã thử nghiệm trên Python 2.7.3 (Linux)). Trong trường hợp của bạn, nó có thể bị hỏng do bạn sử dụng sai đối số proxy.
Đối với urllib
bạn có thể sử dụng:
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')
Thử cái này :
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
chứ không phải các mô-đun khác.
có hai thuộc tính urllib.URLopener()
cụ thể là:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]
và
version = 'Python-urllib/1.17'
.
Để đánh lừa trang web, bạn cần thay đổi cả hai giá trị này thành Tác nhân người dùng được chấp nhận. ví dụ:
trình duyệt Chrome: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36'
Google bot: 'Googlebot/2.1'
như thế này
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>)
chỉ thay đổi một thuộc tính không hoạt động vì trang web đánh dấu đó là một yêu cầu đáng ngờ.