什么是用于网络爬虫的理想编程语言?

6
我需要构建一个内容收集程序,只需简单地读取指定网页上的数字,并保存数据以供以后分析。我不需要它搜索链接或相关数据,只需从每天都会更改内容的网站收集所有数据。
我几乎没有编程经验,希望这对学习有好处。速度不是一个很大的问题,我估计爬虫最多一天需要加载4000个页面。
谢谢。
编辑:有没有办法事先测试我收集数据的网站是否受到爬虫的保护?
7个回答

9

可能是Python或Perl。

Perl有一个非常好的LWP (Perl中的WWW库),Python有urllib2。

两者都是易于编写脚本的语言,可在大多数操作系统上使用。

我已经用Perl做过爬虫很多次了,只需要一个晚上就可以完成。

不过,除了使用某种CAPTCHA之外,它们实际上无法真正保护自己免受爬虫的攻击 - 其他所有方法都比设置更容易破解。

关于Java有一点要注意:Java很好。它更冗长,并且需要一些开发环境设置:所以您可能不会在一个晚上完成,可能需要一周时间。 对于提问者指出的小任务来说,这可能有些过度。 另一方面,有非常有用的库,如linttagsoup(用于遍历随机HTML)和lucene(全文索引和搜索),因此您可能需要Java进行更严肃的项目。 在这种情况下,我建议使用Apache commons-httpclient库进行网络爬虫(或者如果您很疯狂,可以使用nutch)。

另外:还有一些货架式产品可以监视指定网站上的更改并以有用的方式呈现它们,因此您可能只需要抓取其中一个。


5
网站无法自我保护免受爬虫的侵害,但是爬虫有义务遵守机器人排除协议 - 而客户有义务遵守任何网站的服务条款。 - Dan Davies Brackett
网络上大多数关于编写网络爬虫的内容都会提到Java。Java是否过于复杂?或者说有什么问题吗? - Alex
3
Python也拥有Beautiful Soup。 - Lucas Jones
我无法描述我不知道的东西。 - alamar
11
大约一年后:我现在精通Python。强烈推荐Python给初学者,因为其语法很吸引人,而这也是我在学习编程时遇到的最大问题。Python一生推荐。 - Alex
lxml is a faster solution though more complicated than bs4 - rassa45

7

你最熟悉的语言很可能是使用的最好的语言。

我几乎没有编程经验。

你可能会发现网络爬虫对于你来说有点困难,需要构建一些其他更琐碎的应用程序来熟悉你选择的语言(如果适用,还需了解框架)。

祝你好运!


3
我曾经创建过一个网络爬虫,但是它是用来搜索其他网站链接并跟踪这些链接的。它需要记住这些链接,并确保我不会重复访问一个网站,因此我需要一种非常快速的方法来检查重复的URL。为此,我在Delphi 2007中创建了自己的哈希表。通过对Internet Explorer COM接口的进一步了解,我设法在短时间内读取了相当多的页面。
我使用Delphi编写此爬虫,因为我想要更好的性能,而且也选择了Delphi,因为它是我最舒适的语言,并帮助我学习了很多关于编写自己的哈希表算法等有趣话题。此外,对于像我这样经验丰富的程序员来说,这是一个非常有趣的挑战。
我的建议已经提供:使用你最熟悉的工具。

2
有没有办法事先测试一下我收集数据的网站是否受到了爬虫的保护?
除了 CAPTCHA 之外,如果存在 robots.txt 文件,尊重其内容是良好的礼仪。

1
Perl或Python是显而易见的选择,这取决于您自己最适合哪种语言。两者都不难,但通常情况下,如果您发现您更喜欢流畅的语言并且具有高度的灵活性,则Perl可能更适合您;如果您发现自己更喜欢一种更加严格的语言,并且具有更多数学思维方式(特别是相信只有一种正确的做法),则您可能会更喜欢Python。其他编程语言也可以胜任工作,但由于可移植性以及在CLI脚本任务方面的强大表现,尤其是在文本操作方面,这两种语言是显而易见的选择。它们还是流行的Web开发语言,同时也拥有大量用于Web导向任务的有用模块(提供了php的好处,但没有php对客户端的负面影响)。如果对于有大量有用的模块可用来说是一个优点,那么在CPAN上,Perl比任何其他语言都拥有更多的模块(供此类任务使用),在决定使用哪种语言之前,先检查一下是否有可以重复使用的代码,这可能很值得一试。在某些领域,其中一种语言比另一种语言更快(例如Python通常在复杂的数学计算方面表现优异,而Perl通常可以更快地处理文本,但这取决于如何实现)。

还有其他语言选择,编译语言不太便携,因此在服务器上设置起来通常更麻烦,但执行速度更快。脚本语言通常比编译语言更容易处理文本和文件,尽管并非总是如此。我更喜欢perl,所以我会使用它,但我这么说并不是你应该做出决定的依据,找出哪个拥有更多可用资源,哪个更符合你的口味(阅读一些代码,看看哪种风格更有意义),然后再决定。

哦,orielly有一本针对初学者的编程集体智能书籍,我从未阅读过,但据说相当不错,在商店里翻翻它,考虑一下,因为它主要涉及网络爬虫算法...它使用python作为示例。


1
如果你是初学者,我建议使用像 REBOL 这样的“简单”语言。在 REBOL 中,一个用于检查一堆维基百科页面是否有修改的基本脚本看起来像下面的代码。显然,“简单”是主观的,你仍然需要对这段代码进行一些基本更改以满足你的要求。

记录:load %records.txt
;(records.txt文件的内容如下-缩进不重要)
[
    [en.wikipedia.org/wiki/Budget_deficit
    "美国预算赤字(维基百科)"
    {<li id="lastmod">此页面上次修改于}
    "2009年6月1日11:26。"]

    [en.wikipedia.org/wiki/List_of_U.S._states_by_unemployment_rate
    "美国失业率(维基百科)"
    {<li id="lastmod">此页面上次修改于}
    "2009年5月25日20:15。"]
]

;现在循环遍历记录并检查网页更改
foreach rec records [
   html: read rec/1   ; 在此添加错误检查以处理404或超时
    parse/all html [any [thru rec/3 copy curr-mod-date to </li>]]
       unless rec/4 = curr-mod-date [
          print ["检测到更改:" rec/2]
          ;再次解析以收集和保存特定页面数据
          ;使用更新的时间戳更新%records.txt文件
     ]
]

REBOL并不是很知名,但它很友好、非常小巧、跨平台且支持图形用户界面。我用它写快速脚本时非常成功。


-3
我会选择PHP。它是一种面向Web的语言,意味着有很多库函数来处理你在这样的项目中需要做的各种小事情。它内置了一个很好的库(CURL)来完成这个任务,而且这是一种非常简单易学的语言。如果你继续在其中编程,你会比较快地掌握它,但对于像这样简单的任务,它是一个不错的选择。

1
我不建议使用PHP进行客户端脚本编写。虽然它是可行的,但这种方法已经过时了。 - alamar
1
我做了这件事,不得不说它很糟糕。缺乏线程在编写高效的爬虫时造成了很多麻烦。 - Lothar
我已经做了多个 PHP 爬虫,它还可以,但有时它会拒绝从某些 URL 获取元素,但相信我 Python 是最好的选择,我没有使用 Perl,但是拜托,Python 是 Google 使用的语言! - amdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接