如何使网络爬虫的解析器可维护
How to make a parser for a web crawler maintainable
我写了一个 Ruby 网络爬虫,可以从第三方网站检索数据。我正在使用 Nokogiri 提取基于特定 CSS div 和特定字段的信息(访问我提取的节点的子节点和元素)。
第三方网站的结构有时会发生变化,从而破坏爬虫(element[1].children[2]
可能需要更改为 element[2].children[0]
)。
到目前为止,我有一个实用程序可以打印我提取的节点的结构,这使我可以在结构发生变化时快速修复解析器。我还有一个自动化流程来控制它可以提取 "some" 个值。
我想知道是否有更优雅的方式来处理这个问题。如何编写一个易于维护的爬虫?
你应该尽量使用网页的数据和元数据来找到你关心的元素,而不是像你现在这样使用元素索引号。
"class" 和 "id" 属性是一个很好的方法。 Nokogiri 具有 XPath 功能,应该可以轻松地 select 基于这些的元素。如果那不可能,您可以尝试查看元素周围的页面内容,例如如果您要查找权重并且知道它在 table 中,则可以搜索以 "kg" 结尾的字符串。在没有看到您正在解析的文档的情况下,很难给出超级具体的提示。
我建议您的爬虫应该检查正在检索的数据,如果数据看起来有误则引发异常(或显示警告)。
使用CSS。
例如,产品的价格几乎总是:
page.at('#price, .price').text
网站可以更改布局(主题),这仍然有效。
我写了一个 Ruby 网络爬虫,可以从第三方网站检索数据。我正在使用 Nokogiri 提取基于特定 CSS div 和特定字段的信息(访问我提取的节点的子节点和元素)。
第三方网站的结构有时会发生变化,从而破坏爬虫(element[1].children[2]
可能需要更改为 element[2].children[0]
)。
到目前为止,我有一个实用程序可以打印我提取的节点的结构,这使我可以在结构发生变化时快速修复解析器。我还有一个自动化流程来控制它可以提取 "some" 个值。
我想知道是否有更优雅的方式来处理这个问题。如何编写一个易于维护的爬虫?
你应该尽量使用网页的数据和元数据来找到你关心的元素,而不是像你现在这样使用元素索引号。
"class" 和 "id" 属性是一个很好的方法。 Nokogiri 具有 XPath 功能,应该可以轻松地 select 基于这些的元素。如果那不可能,您可以尝试查看元素周围的页面内容,例如如果您要查找权重并且知道它在 table 中,则可以搜索以 "kg" 结尾的字符串。在没有看到您正在解析的文档的情况下,很难给出超级具体的提示。
我建议您的爬虫应该检查正在检索的数据,如果数据看起来有误则引发异常(或显示警告)。
使用CSS。 例如,产品的价格几乎总是:
page.at('#price, .price').text
网站可以更改布局(主题),这仍然有效。