【问题标题】:best library to do web-scraping进行网络抓取的最佳图书馆
【发布时间】:2023-04-11 03:15:01
【问题描述】:

我想从不同的网页获取数据,例如餐厅地址或给定位置的不同活动的日期等。我可以用来从一组给定的站点中提取这些数据的最佳库是什么?

【问题讨论】:

标签: language-agnostic class-library web-crawler


【解决方案1】:

我认为 watir 或 selenium 是最好的选择。大多数其他提到的库实际上是 HTML 解析器,这不是你想要的......你正在抓取,如果网站的所有者希望你获取他的数据,他会转储他的数据库或网站一个洪流,避免所有的 http 请求和昂贵的流量。

基本上,您需要解析 HTML,但更重要的是自动化浏览器。这可以移动鼠标并单击,基本上是在模仿用户。您需要使用屏幕捕获程序来获取验证码并将它们发送到 decaptcha.com(以几分之一的成本解决它们)以规避这种情况。忘记通过解析html而不在浏览器中呈现它'应该看到'来保存该验证码文件。您是屏幕抓取,而不是 httprequestscraping。

watir 结合 autoitx(用于移动鼠标和在字段中输入键 -> 有时这是设置正确的 javascript 事件所必需的)和用于验证码的简单屏幕捕获实用程序为我做了这个伎俩。这样你会最成功,编写一个很棒的 html 解析器来发现站点的所有者已经将一些文本变成了图形是没有用的。 (有问题?不,只需获取一个 OCR 库并输入 jpeg,将返回文本)。此外,我很少看到他们走那么远,尽管在中文网站上,图形中有很多文字。

Xpath 一直在拯救我,它是一种很棒的领域特定语言(恕我直言,我可能错了),您可以访问页面中的任何标签,尽管有时您需要对其进行调整。

我确实错过了“反向模板”(selenium 的机器人框架有这个)。 Perl 在 CPAN 模块 Template::Extract 中有这个,非常方便。

html 解析或 DOM 的创建,我会留给浏览器,是的,它不会那么快,但它会一直工作。

此外,伪装成 Useragent 的库也无用,如今网站受到保护以防被抓取,并且通常需要在真实屏幕上呈现网站以超越验证码,而且还需要触发 javascript 事件以获取信息出现等。

Watir,如果你喜欢 Ruby,我会说 Selenium。 “人类模拟器”(或俄罗斯的 Web 模拟器)确实是为这种抓取而设计的,但话说回来,它又是来自一家毫不掩饰其意图的公司的俄罗斯产品。

我还认为,在这几周里,Wiley 出版了一本关于抓取的新书,应该很有趣。祝你好运……

【讨论】:

    【解决方案2】:

    某人说了什么。

    使用任何语言。

    只要你有一个好的解析器库和http库,你就搞定了。

    树的东西比较慢,然后只使用一个好的解析库。

    【讨论】:

      【解决方案3】:

      我个人觉得 http://github.com/shuber/curl/tree/masterhttp://simplehtmldom.sourceforge.net/ 非常适合用于我的 PHP 爬取/抓取项目。

      【讨论】:

      • 许多网站不允许 curl。它给出了一个权限被拒绝的错误。
      【解决方案4】:

      已经有很多答案推荐 Perl Mechanize,但我认为 Ruby Mechanize(与 Perl 的版本非常相似)更好。它在语法上以更简洁的方式处理诸如表单之类的事情。此外,还有一些前端在 Ruby Mechanize 之上运行,这让事情变得更加简单。

      【讨论】:

        【解决方案5】:

        如果使用 python,请查看 Beautiful Soup (http://crummy.com/software/BeautifulSoup)。

        功能强大的库,让抓取变得轻而易举。

        【讨论】:

          【解决方案6】:

          我认为这里的一般答案是使用任何语言 + http 库 + html/xpath 解析器。我发现使用 ruby​​ + hpricot 提供了一个很好的干净解决方案:

          require 'rubygems'
          require 'hpricot'
          require 'open-uri'
          
          sites = %w(http://www.google.com http://www.stackoverflow.com)
          
          sites.each do |site|
            doc = Hpricot(open(site))
          
            # iterate over each div in the document (or use xpath to grab whatever you want)
            (doc/"div").each do |div|
              # do something with divs here
            end
          end
          

          有关 Hpricot 的更多信息,请参阅http://code.whytheluckystiff.net/hpricot/

          【讨论】:

            【解决方案7】:

            我个人喜欢使用 WWW::Mechanize Perl 模块来处理这类任务。它为您提供了一个以典型 Web 浏览器为模型的对象(即,您可以跟踪链接、填写表单或通过调用其上的方法来使用“后退按钮”)。

            对于实际内容的提取,您可以将其连接到HTML::TreeBuilder 以将您当前访问的网站转换为HTML::Element 对象的树,并提取您想要的数据(look_down() HTML::Element的方法特别有用)。

            【讨论】:

              【解决方案8】:

              .net 程序员的 HTML 敏捷包非常棒。它将网页转换为可以使用 XPath 查询的 XML 文档。

              HtmlDocument doc = new HtmlDocument();
              doc.Load("file.htm");
              foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a@href")
              {
              HtmlAttribute att = link"href";
              att.Value = FixLink(att);
              }
              doc.Save("file.htm");
              

              你可以在这里找到它。 http://www.codeplex.com/htmlagilitypack

              【讨论】:

                【解决方案9】:

                我会使用 LWP(Perl 的 Libwww)。这是一个很好的小指南:http://www.perl.com/pub/a/2002/08/20/perlandlwp.html

                WWW::Scraper 在这里有文档:http://cpan.uwinnipeg.ca/htdocs/Scraper/WWW/Scraper.html 它可以作为一个有用的基础,您可能想要创建自己的模块来满足您的餐厅采矿需求。

                LWP 将为您提供一个基本的爬虫供您构建。

                【讨论】:

                  【解决方案10】:

                  我推荐BeautifulSoup。它不是最快的,但在处理大多数解析器窒息的 (X)HTML 页面的非良好格式方面表现得非常好。

                  【讨论】:

                    【解决方案11】:

                    Perl WWW::Mechanize 库非常适合执行与网站交互以访问您需要的实际页面的笨拙工作。

                    【讨论】:

                      【解决方案12】:

                      您可以使用tidy 将其转换为 XHTML,然后使用您选择的语言可用的任何 XML 处理工具。

                      【讨论】:

                        【解决方案13】:

                        你想用什么语言?

                        curl with awk 可能就是你所需要的。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2018-10-30
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2011-11-03
                          相关资源
                          最近更新 更多