是否需要为它们所针对的每个站点编写爬虫程序?

Posted

技术标签:

【中文标题】是否需要为它们所针对的每个站点编写爬虫程序?【英文标题】:Do scrapers need to be written for every site they target? 【发布时间】:2015-02-24 14:59:15 【问题描述】:

我是新手。我写了一个scraper,它将刮掉Maplin 商店。我使用 Python 作为语言并使用 BeautifulSoup 来抓取商店。

我想问一下,如果我需要爬取其他电子商务商店(例如 Amazon、Flipkart),我是否需要自定义我的代码,因为它们具有不同的 html 架构(idclass 名称不同,另外其他事情也是如此)。所以,我写的刮板不适用于其他电子商务商店。

我想知道比价网站如何从所有在线商店中抓取数据?他们对不同的在线商店有不同的代码还是有一个通用的代码?他们是否研究过每个在线商店的 HTML 架构?

【问题讨论】:

他们研究每个网页的 HTML 架构 @sputnick- 那么不同的在线商店有不同的代码吗? 他们通常会使用某种路径规范(xpath 或 CSS 选择器)编写一个相当容易为不同商店定制的刮板,以查找感兴趣的数据。可能需要一些最少的代码。 好吧,在这种情况下,我猜这样的代码很容易在网页更改时变得无效,即使是轻微的更改。我应该如何编写不易受这些变化影响的爬虫? 要求第三方网站公开 REST API 【参考方案1】:

我需要自定义我的代码吗

是的,当然。这不仅仅是因为网站有不同的 HTML 模式。它还涉及加载/呈现页面所涉及的机制:一些网站使用 AJAX 加载页面的部分内容,其他网站让 javascript 填写页面上的占位符,这使得抓取变得更加困难 - 可能有很多很多的差异。其他人会使用反网络抓取技术:检查您的标题、行为、在频繁访问网站后禁止您等。

我还看到了将价格保留为图像或被“噪音”混淆的情况 - 彼此之间使用不同技术隐藏的不同标签,例如 CSS 规则、类、JS 代码、“显示:无”等等 - 对于浏览器中的最终用户来说,数据看起来很正常,但对于网络抓取“机器人”来说,它是一团糟。

想知道比价网站如何从所有在线商店中抓取数据?

通常,他们会尽可能使用 API。但是,如果没有,网页抓取和 HTML 解析始终是一种选择。


一般的高级想法是将抓取代码分成两个主要部分。静态的是一种通用的网络抓取蜘蛛(逻辑),它读取传入的参数或配置。动态的——注释器/网站特定配置——通常是特定于字段的 XPath 表达式或 CSS 选择器。

Scrapinghub 提供的Autoscraping tool 为例:

Autoscraping 是一种无需任何编程即可抓取网站的工具 知识。你只是在视觉上注释网页(用一个点和 单击工具)以指示每个字段在页面上的位置以及 自动抓取将从网站上抓取任何类似页面。

而且,仅供参考,研究 Scrapinghub 提供的内容和文档 - 有很多有用的信息和一组不同的独特网络抓取工具。


我个人参与了一个项目,我们正在构建一个通用的Scrapy 蜘蛛。据我记得,我们有一个“目标”数据库表,其中记录由浏览器扩展(注释器)插入,字段注释保存在 JSON 中:


    "price": "//div[@class='price']/text()",  
    "description": "//div[@class='title']/span[2]/text()"

通用蜘蛛接收到一个目标 id 作为参数,读取配置,然后抓取网站。

我们在保持通用方面遇到了很多问题。一旦网站涉及到 javascript 和 ajax,我们就开始编写特定于网站的逻辑来获取所需的数据。

另见:

Creating a generic scrapy spider Using one Scrapy spider for several websites What is the best practice for writing maintainable web scrapers?

【讨论】:

我发现了另一个与这个问题有点相关的 SO 链接,因此想到了分享。无论如何谢谢:) 请多了解一些知识。报废在线商店时,报废者是否会报废每件产品?我的意思是亚马逊上有 10+ 百万种产品上市,Flipkart 上有 1+百万种产品,等等。我听说比价网站每天都会抓取/报废商店。他们会报废每一种产品吗?报废所有产品不是需要很长时间吗?请您的意见 @user1162512 它确实取决于网络抓取商店/服务。如果您考虑使用多个服务器上的多个scrapyd 实例并行化 Web 抓取,这没什么大不了的,将数据存储在分片的 mongodb 服务器等中 - 这基本上是一个扩展问题,最终通常取决于多少你有钱:)。不幸的是,我不能给你任何信息,因为我没有足够的经验每天进行大规模的网络抓取..【参考方案2】:

对于很多定价比较爬虫,当用户表示他们希望跟踪某物的价格时,他们会在供应商网站上进行产品搜索。一旦用户选择了他们感兴趣的东西,它就会被添加到产品的全局缓存中,然后可以定期抓取,而不必总是频繁地拖网整个网站

【讨论】:

以上是关于是否需要为它们所针对的每个站点编写爬虫程序?的主要内容,如果未能解决你的问题,请参考以下文章

爬虫小案例:多协程工作

python爬虫入门---第二篇:获取2019年中国大学排名

编写一个爬虫驱动——想法

一个站点的诞生02--用Scrapy抓取数据

从python基础到爬虫的书有啥值得推荐?

爬虫-Jupyter Notebook使用