2016-12-15 62 views
2

所以我試圖發送一個請求到一個網頁並閱讀它的迴應。我做了一個比較請求和頁面的代碼,我不能得到相同的頁面文本。我是否正確使用「請求」? 我真的認爲我誤解了請求函數的工作原理以及它的作用。有人能幫助我嗎?請求函數的功能是什麼?

import requests 
import urllib 

def search(): 
     pr = {'q':'pink'} 
     r = requests.get('http://stackoverflow.com/search',params=pr) 
     returntext = r.text 
     urllibtest(returntext) 

def urllibtest(returntext): 
     connection = urllib.urlopen("http://stackoverflow.com/search?q=pink") 
     output = connection.read() 
     connection.close() 
     if output == returntext: 
       print("ITS THE SAME PAGE") 
     else: 
       print("ITS NOT THE SAME PAGE") 

search() 
+0

'urllib.urlopen'應該是'urllib.request.urlopen' – Barmar

+0

@Barmar沒有在Python 2 –

+0

偉大的第一個問題! –

回答

1

首先,沒有理由期望兩個不同的堆棧溢出搜索返回完全相同的響應。

有一個合乎邏輯的區別就在這裏過,請求自動爲您輸出解碼:

>>> type(output) 
str 
>>> type(r.text) 
unicode 

可以使用content代替,如果你不希望它做解碼,並使用一個更可預測源代碼才能看到相同的內容返回 - 例如:

>>> r1 = urllib.urlopen('http://httpbin.org').read() 
>>> r2 = requests.get('http://httpbin.org').content 
>>> r1 == r2 
True 
+0

我打算髮布這個答案,但我實際上是看着'urllib.request.urlopen'的解碼輸出(我在python 3上),這對我來說不同於我從'requests.get '。不知道該怎麼做。 –

+0

那麼,你可能已經擊中了CAPTCHA或其他東西。沒有理由期望來自兩個'StackOverflow'搜索的響應在兩個不同的時間返回相同的內容。 – wim

+0

確實如此,實際上,我認爲這就是發生了什麼事:'人類驗證 - 堆棧溢出' –