2012-01-11 30 views
18

Tôi có tập lệnh python sau và nó hoạt động rất đẹp.Python làm theo các chuyển hướng và sau đó tải xuống trang?

import urllib2 

url = 'http://abc.com' # write the url here 

usock = urllib2.urlopen(url) 
data = usock.read() 
usock.close() 

print data 

tuy nhiên, một số URL tôi cung cấp có thể chuyển hướng nó 2 lần trở lên. Làm thế nào tôi có thể có python chờ cho chuyển hướng để hoàn thành trước khi tải dữ liệu. Ví dụ khi sử dụng đoạn mã trên với

http://www.google.com/search?hl=en&q=KEYWORD&btnI=1 

là equvilant của nhấn nút im may mắn trên tìm kiếm google, tôi nhận được:

>>> url = 'http://www.google.com/search?hl=en&q=KEYWORD&btnI=1' 
>>> usick = urllib2.urlopen(url) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 400, in open 
    response = meth(req, response) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 513, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 438, in error 
    return self._call_chain(*args) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 372, in _call_chain 
    result = func(*args) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 521, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 403: Forbidden 
>>> 

Ive thử (url, dữ liệu, thời gian chờ) tuy nhiên, tôi không chắc chắn nên đặt gì ở đó.

EDIT: Tôi thực sự phát hiện ra nếu tôi không chuyển hướng và chỉ được sử dụng các tiêu đề của liên kết đầu tiên, tôi có thể lấy vị trí của chuyển hướng tới và sử dụng đó là liên kết cuối cùng của tôi

+0

là bạn quen với 'HTTPRedirectHandler' – RanRag

+0

Tôi thì không. Chỉ cần googled nó. Tôi có thể thấy cách làm cho nó KHÔNG tuân theo. Tuy nhiên, tôi không thể bắt buộc phải theo dõi – Cripto

+0

Tôi biết đã lâu rồi, nhưng bạn có thể đào sâu trong hầm nhớ và cho tôi biết cách bạn giải quyết vấn đề này không? cảm ơn! – tmthyjames

Trả lời

15

Bạn có thể được tốt hơn off với thư viện yêu cầu trong đó có các API tốt hơn cho việc kiểm soát chuyển hướng xử lý:

http://docs.python-requests.org/en/latest/user/quickstart/#redirection-and-history

yêu cầu:

http://pypi.python.org/pypi/requests/ (thay thế urllib đối với con người)

+0

Không phải là câu trả lời đúng, nhưng nó đã giúp tôi tìm thấy những gì tôi cần. – Cripto

+3

@ user1048138: Bạn có phiền cho chúng tôi biết những gì bạn đã tìm thấy để giải quyết vấn đề của mình không? –

+0

Tính năng đó chỉ là BLEW tâm trí của tôi. Ngoài ra, điều quan trọng cần lưu ý đối với các yêu cầu khác (như HEAD), bạn phải đặt allow_redirects thành True để hoạt động. – halflings

-2

Bạn hoàn toàn phải làm theo cách đó? Làm thế nào về việc sử dụng một cái gì đó như twill (http://twill.idyll.org/) - làm cho những gì bạn muốn làm rất dễ dàng (và đó là Python).

Các vấn đề liên quan