2016-02-28 64 views
1

我想使用的網站的搜索功能,使用此代碼結構:使用Python使用網站的搜索功能

<div class='search'> 
<div class='inner'> 
<form accept-charset="UTF-8" action="/gr/el/products" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div> 
<label for='query'>Ενδιαφέρομαι για...</label> 
<fieldset> 
<input class="search-input" data-search-url="/gr/el/products/autocomplete.json" id="text_search" name="query" placeholder="Αναζητήστε προϊόν" type="text" /> 
<button type='submit'>Αναζήτηση</button> 
</fieldset> 
</form> 
</div> 
</div> 

這個python腳本:

import requests 
from bs4 import BeautifulSoup 

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1'} 



payload = { 
    'query':'test' 
} 

r = requests.get('http://www.pharmacy295.gr',data = payload ,headers = headers) 

soup = BeautifulSoup(r.text,'lxml') 
products = soup.findAll('span', {'class':'name'}) 
print(products) 

此代碼之際,在這個網站上廣泛搜索如何做這項任務的結果,但我似乎無法得到任何搜索結果 - 只是網站的主頁。

+1

請詳細介紹一下你試圖達到的目標,你嘗試過的方法以及迄今爲止的結果。這是不是很清楚你要問什麼。 – KWeiss

+0

我只是試圖使用python請求的網站pharmacy295.gr的搜索功能。 – Michail

回答

4

添加products到您的網址,它會正常工作,方法是獲取的形式和形式也顯示的URL。如果您不確定裂開上使用Firefox或Chrome開發者控制檯,您可以看到該請求究竟是如何取得

payload = { 
    'query':'neutrogena', 

} 

r = requests.get('http://www.pharmacy295.gr/products',data = payload ,headers = headers) 

soup = BeautifulSoup(r.text,'lxml') 
products = soup.findAll('span', {'class':'name'}) 
print(products) 

輸出:

[<span class="name">NEUTROGENA - Hand &amp; Nail Cream - 75ml</span>, <span class="name">NEUTROGENA - Hand Cream (Unscented) - 75ml</span>, <span class="name">NEUTROGENA - PROMO PACK 1+1 \u0394\u03a9\u03a1\u039f Lip Moisturizer - 4,8gr</span>, <span class="name">NEUTROGENA - Lip Moisturizer with Nordic Berry - 4.9gr</span>] 

此外,如果你喜歡,你可以得到的數據作爲json:

In [13]: r = requests.get('http://www.pharmacy295.gr/el/products/autocomplete.json',data = payload ,headers = headers) 

In [14]: print(r.json()) 
[{u'title': u'NEUTROGENA - Hand & Nail Cream - 75ml', u'discounted_price': u'5,31 \u20ac', u'photo': u'/system/uploads/asset/data/12584/tiny_108511.jpg', u'brand': u'NEUTROGENA ', u'path': u'/products/7547', u'price': u'8,17 \u20ac'}, {u'title': u'NEUTROGENA - Hand Cream (Unscented) - 75ml', u'discounted_price': u'4,03 \u20ac', u'photo': u'/system/uploads/asset/data/4689/tiny_102953.jpg', u'brand': u'NEUTROGENA ', u'path': u'/products/3958', u'price': u'6,20 \u20ac'}, {u'title': u'NEUTROGENA - PROMO PACK 1+1 \u0394\u03a9\u03a1\u039f Lip Moisturizer - 4,8gr', u'discounted_price': u'3,91 \u20ac', u'photo': u'/system/uploads/asset/data/5510/tiny_118843.jpg', u'brand': u'NEUTROGENA ', u'path': u'/products/4644', u'price': u'4,60 \u20ac'}, {u'title': u'NEUTROGENA - Lip Moisturizer with Nordic Berry - 4.9gr', u'discounted_price': u'2,91 \u20ac', u'photo': u'/system/uploads/asset/data/12761/tiny_126088.jpg', u'brand': u'NEUTROGENA ', u'path': u'/products/7548', u'price': u'4,48 \u20ac'}] 
+0

用json請求很好找!該網站在其HTTP請求中接受的內容非常寬鬆,例如通過'data'參數發送帶'requests.get()'的'GET'將在請求正文中發送查詢參數,而不是URL的查詢字符串。儘管該網站看起來很滿意,但HTTP服務器並不是嚴格要求接受來自HTTP GET主體的參數。爲了安全起見,我建議使用'params'參數而不是'data'。 – mhawke

+0

@ mhawke,表單數據會隨get請求附加到url,所以你可以使用str.format?query = {} .format ...並忘記數據 –

+0

你可以,但是當查詢參數通過'params'' requests.get()'將URL指定爲字典。它們將被傳遞到URL的查詢字符串(正確)而不是請求正文(不正確,但取決於服務器是否會處理它們)。 – mhawke

1

首先,URL是錯誤的。您正在使用http://www.pharmacy295.gr,但您應該使用http://www.pharmacy295.gr/gr/el/products。該URL實際上可以簡化爲http://www.pharmacy295.gr/products

也正在作出GET請求,所以,而不是data=payload,嘗試params=payload

data用於POST請求。

以下是requests.get()的文檔。

+0

仍似乎沒有工作:/。如果我使用params/data或get/post(嘗試每種可能的組合)都無關緊要。 – Michail

+0

檢查我的更新。我認爲你使用了錯誤的URL。表單動作是'/ gr/el/products',所以應該在請求中。 – mhawke

+0

是的,你的編輯是正確的。謝謝。 – Michail

1

做一個r = requests.post('http://www.pharmacy295.gr',data = payload ,headers = headers)

GET請求也忽略了數據...