在这种情况下,提取数据的最有效方法是什么?

时间:2016-05-10 13:27:20

标签: python json web-scraping

所以,我正在开发一个python web应用程序,它是体育用品(运动服装,工具......等)的搜索引擎。基本上它应该在多个商店中搜索给定的关键字并比较结果以返回20个最佳结果。

我认为最好和最简单的方法是编写一个json文件,其中包含有关如何在每个网站上提取数据的刮刀规则。例如:

[{"www.decathlon.com" : { "rules" : { "productTag" : "div['.product']", 
"priceTag" : "span[".price"]" } }]

对于十项全能,为了获得产品项目,我们使用产品类搜索div标签。

我有一个大约10到15个网站的清单。因此,对于每个网站,它都转到rules.json,查看相关规则并使用它们来提取数据。

此方法的优点: 非常容易编写,我们需要一个最小的python脚本,用于如何读取和映射URL到他们的规则的逻辑,并通过BeautifulSoup提取数据+它也很容易添加,删除新的URL及其规则。

此方法的缺点:对于每次搜索,我们都会向每个网站发起请求,因此同时发出大约10个请求,然后比较结果,这样如果20个用户同时搜索我们将有大约200个请求,这将大大减慢我们的应用程序!

另一种方法:

我认为我们可以有一个庞大的关键字列表,然后在00:00,脚本启动请求列表中每个关键字的所有网址,比较它们,然后将结果存储在CouchDB中,以便通过这一天,它将每天更新。这种方法的唯一问题是几乎不可能拥有所有可能关键字的列表。

所以,请帮助我如何处理这个问题?鉴于我没有太多时间。

2 个答案:

答案 0 :(得分:1)

HTTP请求可能非常昂贵。这就是为什么你要确保你并行化你的请求,为此你可以使用像Celery这样的东西。这样您就可以减少到响应时间最慢的网站的总时间。 如果其中一个网站没有响应您的请求,将请求超时设置为更短的时间(5秒?)可能是个好主意。 能够将域标记为“关闭/不响应”并能够处理这些异常。

其他优化是在每次搜索后存储页面内容一段时间,以防相同的搜索关键字进入,这样您就可以跳过昂贵的请求。

答案 1 :(得分:1)

与“关键字”列表一致:可能您可以根据搜索关键字的频率维护关键字的优先级队列,而不是保留所有可能关键字的列表。遇到新关键字时,将其添加到列表中,否则每次搜索时都会更新它的重要性。启动一个脚本,每天请求最多30个关键字的网址(或多或少取决于搜索字词的频率和您想要做的事情)。

这并不一定能解决您提出过多请求的问题,但可能会降低出现问题的可能性。