2016-02-22 102 views
0

我需要檢測的URL發生變化時商店有,我使用請求firesale沒有運氣LIB即使firesale是它仍然會返回No deals on today和校驗值仍然[u'http:', u'', u'www.dealwebsite.co', u'Electroshop']檢測的URL變化

主要店鋪網址 http://www.dealwebsite.com/coolshop

如果firesale交易是在主店網址更改這個像一個重定向 http://www.dealwebsite.com/coolshop/firesale

import requests 

headers = { 
'User-Agent': 'Mozilla\/5.0 (Windows NT 6.1; WOW64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/45.0.2454.101 Safari\/537.36' 
} 

select_shop = 'Electroshop' 

url = 'http://www.dealwebsite.co/' + select_shop 
r = requests.get(url, headers=headers, timeout=3) 

check = r.url.split('/') 

if len(check) != 5: 
    print 'No deals on today' 
    exit() 
else: 
    print 'Firesale Deals on NOW!' 
+0

'check'的值是多少? –

+0

check ='[u'http:',u'',u'www.dealwebsite.co',u'Electroshop']' – linski

+0

這樣的查詢的預期輸出是什麼?另外,爲什麼你不能檢查r.status_code的響應代碼和r.text()或r.json()的結果數據? r.url爲您提供請求URL,並且不會提供服務器提供的響應。 –

回答

1

看來你可以track redirection。例如:

requests.get(url, headers=headers, timeout=3, allows_redirect=True) 
>>> r.url 
'url' 

>>> r.status_code 
200 

>>> r.history 
[<Response [301]>] # means that there was a redirect on the way 

事實上,你可以只使用一個HEAD請求驗證的行爲 - 只有當你不需要解析結果(作爲HEAD響應主體是空的)。

>>> r = requests.head(url, headers=headers, timeout=3, allow_redirects=True) 

>>> r.url 
'..something...' 

>>> r.history 
[<Response [301]>] 

理論上,您也可以完全阻止重定向,並檢查響應狀態。

>>> r = requests.get(url, headers=headers, timeout=3, allow_redirects=False) 

>>> r.status_code 
301 

>>> r.history 
[] 

現在,301可能意味着重定向到firesale或其他地方 - 你不知道。

更新1

與periscope.tv一個例子(似乎OP具有這樣的網站問題):

>>> example = requests.get("https://periscope.tv/couchmode", allow_redirects=True) 
>>> example.status_code 
200 
>>> example.history 
[<Response [307]>] 
>>> example.history[0].url 
u'https://periscope.tv/couchmode' 
>>> example.url 
u'https://periscope.tv/w/aZwcYHNlcnZpY2V8MURYeHl6WUFaUWdLTerSfgniRKoRgIPbfxxlbAGofYQNBd8WZZTEelJ0KavI?mode=couch' 

正如你所看到的,example.history [0] .url告訴你什麼是返回307臨時重定向的URL。

+0

試試這個,並沒有工作,它似乎像網址在瀏覽器中更新沒有重定向status_code,我已經看到很多與SPA做這樣的twitter和facebook。例如轉到潛望鏡用戶頁面,如果用戶活着,它會更新帶有標記'periscope.tv/username' - >'periscope.tv/username/token'的URL,它仍然試圖確定它是如何工作的,可能必須使用Javascript路由在這個問題上:( – linski

+0

@林斯基:看看更新 – Markon

+0

嘗試用戶配置文件,你會看到我在說什麼。 – linski

0

這樣做的一種方法是使用urllib2並覆蓋HTTPRedirectHandler的redirect_request()方法。可能有一個更優雅的方式來與Requests做這件事,但我不熟悉這個包。

import urllib2 

class FindRedirect(urllib2.HTTPRedirectHandler): 
    def redirect_request(self, req, fp, code, msg, hdrs, newurl): 
     print('Sale has started!!') 
     return urllib2.HTTPRedirectHandler.redirect_request(self, req, fp, code, msg, hdrs, newurl) 

opener = urllib2.build_opener(FindRedirect) 
opener.open('http://googel.com')