我正在尝试建立一个供个人使用(以及用于实践)的价格比较程序,该程序允许我在不同网站上比较同一商品的价格。我刚刚开始使用Scrapy库,并通过抓取网站来玩耍。每当我抓取新网站时,这些都是我的步骤:
1)查找网站的搜索URL,了解其模式并进行存储。例如,Target的搜索URL由固定的URL =“ https://www.target.com/s?searchTerm=”加上搜索项(在解析的URL中)组成
2)一旦我知道了网站的搜索网址,我就会使用Splash库发送一个SplashRequest。之所以这样做,是因为许多页面上都加载了JS
3)查找结果页面的HTML结构,并确定正确的xpath表达式以解析价格。但是,许多网站根据搜索词或产品类别以不同的格式显示结果页面,从而更改了页面的HTML代码。因此,我必须检查所有可能的结果页面的格式,并提出一个可以解释所有不同格式的xpath
我发现此过程效率极低,缓慢且不准确。例如,在第3步中,即使我具有正确的xpath,我仍然无法抓取页面中的所有价格(有时我还会获得HTML呈现的页面中不存在的商品价格),我无法理解。另外,我不知道网站是否知道我的请求来自机器人,因此可能会向我发送错误或不正确的HTML代码。而且,该过程不能自动化。例如,我必须为每个新网站重复步骤1和2。因此,我想知道是否有更有效的过程,库或方法可以用来帮助我完成此程序。我也听说过有关使用网站API的一些信息,尽管我不太了解它是如何工作的。这是我第一次进行抓取,对网络技术我不太了解,因此非常感谢任何帮助/建议!
答案 0 :(得分:1)
爬网最常见的问题是,总的来说,他们是根据句法确定要刮除的所有内容,而根据自己的经验,在概念化要使用的实体的概念上会有很大帮助。
在一项有关刮削的研究中,我参与了一个结论,即我们需要使用semantic tree。该树应包含代表您所要使用的重要数据的节点,并且父子关系意味着父级将子级封装在HTML,XML或其他层次结构中。
因此,您将需要一些有关如何表示语义树以及如何将其与站点结构映射的概念。如果您的搜索方法允许您使用逻辑或,那么您将能够为多个在线资源定义相同的语义树。
另一方面,如果某些站点的所有者愿意允许您抓取其数据,则可以要求他们定义语义树。
如果给定网站的结构发生了更改,那么在语义树的节点结构保持不变的情况下,如果经常使用语义树,则只需更改几个元素的选择器,您就可以遵守更改。如果某些所有者是允许抓取的伙伴,那么您将能够下载他们的语义树。
如果网站提供了API,则可以使用该API,请阅读REST API的相关信息。但是,这些API可能并不统一。