Thay đổi tác nhân người dùng trên urllib2.urlopen


99

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:


61

Đặ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-Agenttiê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 khi urllib2chuỗi tác nhân người dùng mặc định là "Python-urllib/2.6"(trên Python 2.6).


117

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

8
Phương pháp đó hoạt động với các tiêu đề khác, nhưng không phải Tác nhân người dùng - ít nhất là không trong cài đặt 2.6.2 của tôi. Tác nhân người dùng bị bỏ qua vì một số lý do.
Nathan

3
Tôi tin rằng User-agenttrê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.
KriiV

1
Tên tiêu đề không phân biệt chữ hoa chữ thường.
Nicolás

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

4
Với các tham số được đặt tên, bạn có thể thực hiện việc này trong hai dòng. Di chuyển dòng đầu tiên và thay thế thứ hai với điều này: 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.
Iain Samuel McLean Elder

Hoặc ngắn hơn nữa, trong một dòng:html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
người dùng

13

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

Điều này đã giúp tuyệt vời. Tôi không hiểu tại sao tôi cần request.Request và sau đó lặp lại urllib.request.urlopen trong đó phiên bản cũ sẽ chỉ làm được urllib.urlopen (req) nhưng cách này hoạt động và tôi biết cách sử dụng nó trong python 3 ngay bây giờ .
jamescampbell

Tôi vẫn nhận được Lỗi 404 :(
Maksim Kniazev

Tôi đã xóa 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
người dùng

9

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

2
opener.addheaderscó 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.
jfs 20/09/12

Đối với tôi, lời gọi build_opener trả về với User-Agent mặc định đã được xác định trong tiêu đề. Vì vậy, việc bổ sung sẽ chỉ tạo ra một tiêu đề Tác nhân người dùng khác, tiêu đề thứ 2 sẽ bị bỏ qua. Đó là lý do tại sao sol của @ jcoon đang hoạt động.
Vajk Hermecz

6

Đối với urllibbạ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')

5

Một giải pháp khác trong urllib2và Python 2.7:

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

2
Tôi nhận được một lỗi 404 cho một trang mà tồn tại nếu url vào máng trình duyệt của tôi
Yebach

2

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

1
Câu hỏi thảo luận rõ ràng urllib2chứ không phải các mô-đun khác.
Ron Klein

2

có hai thuộc tính urllib.URLopener()cụ thể là:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]
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ờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.