2016-02-28 65 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请求也忽略了数据...