使用 PHP 或 Python 的网页抓取技术

Posted

技术标签:

【中文标题】使用 PHP 或 Python 的网页抓取技术【英文标题】:Webscraping Techniques using PHP or Python 【发布时间】:2011-06-02 21:33:27 【问题描述】:

我需要抓取大约 100 个网站,它们提供的内容非常相似。

我的第一个疑问。应该可以编写一个通用脚本来抓取所有 100 个网站,或者在抓取技术中只能为特定网站编写脚本。 (愚蠢的问题。)。我想我应该问一下哪种可能性更容易。为每个网站编写 100 个不同的脚本很困难。

第二个问题。我的主要语言是 php,但是在 *** 上搜索后,我发现最先进的爬虫之一是 Python 中的“Beautiful Soup”。应该可以在 PHP 中调用 Python 中的“Beautiful Soup”吗?还是最好用 Python 编写所有脚本?

给我一​​些关于我应该怎么走的线索。

对不起我的英语不好。

最好的问候,

【问题讨论】:

Python 将是您工具带的一个很好的补充,甚至可以改进您编写 PHP 的方式。如果脚本将从 crontab 运行,Python 是一个不错的选择 - 还可以查看 SqlSoup 进行数据库访问。 我怀疑您在帖子中指的是“BeautifulSoup”,而不是“Beautiful Soap” 【参考方案1】:

1.) 100 个网站的刮板?这取决于您的要求。如果您只需要特定信息,则需要考虑 100 个不同的网站及其布局。不过,可以共享一些通用功能。

2.) BeautifulSoup 是一个 html/XML 解析器,而不是一个屏幕抓取工具。如果刮板是用 python 编写的,这将是该任务的首选。从php调用python是可以的,但是肯定不如单语言解决方案那么干净。这就是为什么我建议你为了原型而研究 python 和 BeautifulSoup。

旁注:http://scrapy.org/是另一个python库,特别设计

抓取网站并从其页面中提取结构化数据。

【讨论】:

【参考方案2】:

因为我更喜欢 PHP 而不是 Python,所以我曾经使用phpQuery 从网站上抓取数据。它工作得很好,我很快就想出了一个 scaper,使用 CSS 选择器(在 SelectorGadget 的帮助下)选择元素并获取它的 ->text()

但我发现它有点慢(因为我不得不抓取数千页),所以最后我将它改为使用正则表达式来抓取数据。 D:

【讨论】:

【参考方案3】:

我已经通过几种方式做到了这一点。

1:使用 grep、sed 和 awk。这与 2: regex 大致相同。这些方法非常直接,但只要网站的 HTML 结构发生变化就会失败。

3:PHP 的 XML/HTML 解析器 DomDocument。这比正则表达式可靠得多,但我发现使用它很烦人(我讨厌 PHP 数组和对象的混合)。如果你想使用 PHP,PHPQuery 可能是一个不错的解决方案,正如 Thai 所建议的那样。

4:Python 和 BeautifulSoup。关于 BeautifulSoup,我不能说足够多的好话,这是我推荐的方法。我发现我的代码在 Python 中感觉更干净,而且 BeautifulSoup 使用起来非常简单高效。文档也很好。

您必须为每个站点专门编写脚本。这取决于您希望提取的信息类型。如果它是像body title 这样的标准,当然您不必更改任何内容,但您想要的信息可能更具体?

【讨论】:

【参考方案4】:

我们使用 Python 对 RSS 提要进行类似这样的操作——我们使用 ElementTree,因为 RSS 通常保证格式正确。 Beautiful Soup 可能更适合解析 HTML。

就处理 100 个不同的站点而言,请尝试编写一个适用于其中大多数站点的抽象,并将页面转换为您可以使用的通用数据结构。然后重写部分抽象来处理与规范不同的各个站点。

Scraper 通常受 I/O 限制——查看诸如 eventlet 或 gevent 之类的协程库以利用一些 I/O 并行性并加快整个过程。

【讨论】:

以上是关于使用 PHP 或 Python 的网页抓取技术的主要内容,如果未能解决你的问题,请参考以下文章

请教网页里的特定数据怎么抓取?

使用PHP的cURL库进行网页抓取

python如何抓取新浪微博的微博内容

puppeteer + nodejs 抓取网页内容

感谢网页使用python或pyspark抓取多个页面

如何通过 Python 抓取动态网页