6

我需要构建一个内容收集程序,该程序将简单地读取指定网页上的数字,并保存该数据以供以后分析。我不需要它来搜索链接或相关数据,只需从每天都会更改内容的网站收集所有数据。

我的编程经验很少,我希望这对学习有好处。速度不是什么大问题,我估计爬虫一天最多要加载 4000 个页面。

谢谢。

编辑:是否有任何方法可以提前测试我从中收集数据的网站是否受到爬虫的保护?

4

7 回答 7

9

Python 可能,或者 Perl。

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

两者都是大多数操作系统上可用的简单脚本语言。

我已经用 Perl 做了很多次爬虫,这是一个晚上的工作。

不,他们不能真正保护自己免受爬虫的侵害,除了使用 CAPTCHA 之类的——其他一切都比设置更容易破解。

关于 Java 有一点:Java 很好。它更冗长并且需要一些开发环境设置:所以你不会在一个晚上完成它,可能是一个星期。对于作者指出的一项小任务,这可能是矫枉过正。另一方面,有一些非常有用的库lint,例如tagsoup(随机 HTML 的 DOM 遍历)和lucene(全文索引和搜索),因此您可能需要 Java 用于更严肃的项目。在这种情况下,我会推荐Apache commons-httpclient用于网络爬取的库(或者nutch如果你疯了 :)。

另外:有一些货架产品可以监控指定网站上的变化并以有用的方式展示它们,所以你可能只需要一个。

于 2009-06-10T19:16:49.283 回答
7

您最熟悉的语言不仅仅是最适合使用的语言。

我的编程经验很少

您可能会发现网络爬虫有点像火的洗礼,您需要构建一些其他更琐碎的应用程序来熟悉您选择的语言(和框架,如果适用)。

祝你好运!

于 2009-06-10T19:33:11.403 回答
3

我确实创建了一个网络爬虫,但创建它是为了在站点中搜索更多指向其他站点的链接并遵循这些链接。它必须记住这些链接并确保我不会访问一个站点两次,因此我需要一种非常快速的方法来检查重复的 URL。为此,我在 Delphi 2007 中创建了自己的哈希表。有了一些关于如何使用 Internet Explorer COM 接口的额外知识,我设法在短时间内阅读了相当多的页面。我使用 Delphi 编写了这个爬虫,因为我想要很多性能。

再说一次,我也选择了 Delphi,因为它是我最熟悉的语言,而且它帮助我学习了很多有趣的主题,包括如何编写自己的哈希表算法。此外,对于像我这样有经验的程序员来说,这是一个非常有趣的挑战。

我的建议已经提供:使用您最熟悉的工具。

于 2009-06-10T20:54:57.823 回答
2

有什么方法可以提前测试我从中收集数据的网站是否受到爬虫的保护?

除了验证码之外,尊重robots.txt文件(如果存在)的内容是一种很好的礼仪。

于 2009-06-10T19:29:38.353 回答
1

Perl 或 python 是显而易见的选择,这取决于最终什么最适合您。两者都不是那么困难,但总的来说,如果你发现你更喜欢一种真正灵活的流动语言 perl 会更适合你,好像你发现你更喜欢一种更严格的语言和更数学的思维方式(尤其是相信只有一种做正确事情的方法)那么你可能会在 python 中感觉更自在。其他语言可以很好地完成这项工作,但这两种语言是显而易见的选择,因为它具有可移植性,并且是 CLI 脚本任务的强大语言,尤其是文本操作,以及强大的 webdev 语言,导致大量有用的模块可用于面向 web 的任务(给出了提到的 php 的好处,但没有 php 对客户端的负面影响)。如果大量可用的有用模块对您来说是专业的,那么 perl 比任何其他语言(在 CPAN 上)具有更多的此类任务,那么在使用之前检查是否有可以重用的代码可能是值得的深入研究使用哪种语言。在某些领域,一个比另一个快(python 通常擅长复杂的数学运算,perl 通常可以更快地处理文本,但这取决于您如何操作)。

其他语言选择已经存在,编译语言的可移植性较差,因此在服务器上设置它通常更痛苦,但执行速度更快。脚本语言通常被设计为比编译语言更容易操作文本和文件,尽管并非总是如此。我对 perl 感觉更舒服,所以我会使用它,但我说这不是你应该做出决定的基础,找出你可以使用的更多资源,以及你更喜欢哪种感觉(阅读一些代码看看哪种风格对你更有意义)然后决定。

哦,奥利利有一本针对该主题初学者的集体智慧编程书,我从未读过它,但它应该很好,在商店里翻阅它并考虑它主要是关于网络爬虫算法的。 ..它以python为例。

于 2009-06-10T20:00:29.943 回答
1

如果您是初学者,我建议您使用一种“简单”的语言,例如REBOL。在 REBOL 中,检查一堆维基百科页面是否有修改的基本脚本如下面的代码所示。显然,“简单”是主观的,您仍然需要对此代码进行一些基本更改以满足您的要求。

记录:加载 %records.txt
;(records.txt 文件的内容看起来像这样 - 缩进不重要)
[
    [en.wikipedia.org/wiki/Budget_deficit
    "US Budget Deficit (wikipedia)"
    {<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。"]
]

; 现在遍历记录并检查网络是否对
每个记录记录进行了更改 [
   html: read rec/1 ; 在这里为 404 或超时添加错误检查
    parse/all html [any [thru rec/3 copy curr-mod-date to </li>]]
       除非 rec/4 = curr-mod-date [
          print ["CHANGE DETECTED:" rec/2]
          ; 再次解析以收集并保存此处的特定页面数据
          ;使用更新的时间戳更新 %records.txt 文件
     ]
]

REBOL 并不为人所知,但它非常友好、非常小巧、跨平台且支持 GUI。对于快速而肮脏的脚本,我已经取得了很大的成功。

于 2009-06-10T22:29:22.390 回答
-3

我会说PHP。它是一种面向 Web 的语言,这意味着许多库函数可以完成您在这样的项目中需要做的所有奇怪的小事情。它有一个很好的内置库(CURL),而且它是一种简单的语言。如果您继续在其中进行编程,您将相对快速地超越它,但是对于像这样简单的事情,这是一个不错的选择。

于 2009-06-10T19:17:40.217 回答