- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关闭。这个问题是opinion-based .它目前不接受答案。
想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.
7年前关闭。
Improve this question
我需要从网站中提取内容,但该应用程序不提供任何应用程序编程接口(interface)或其他机制来以编程方式访问该数据。
我找到了一个有用的第三方工具,名为 Import.io它提供了用于抓取网页和构建数据集的点击即走功能,唯一的问题是我想将我的数据保存在本地,我不想订阅任何订阅计划。
这家公司使用什么样的技术来抓取网页并构建他们的数据集?我发现了一些网页抓取框架 pjscrape & Scrapy他们可以提供这样的功能吗
最佳答案
你肯定想从一个好的网页抓取框架开始。稍后您可能会认为它们太有限了,您可以将自己的库组合在一起,但是如果没有很多抓取经验,您的设计将比 pjscrape 或 scrapy 差得多。
注意:我在这里使用的术语爬行和抓取基本上可以互换。这是我对你的 Quora 问题的回答的副本,它很长。
工具
根据您的首选浏览器,熟悉 Firebug 或 Chrome 开发工具。当您浏览要从中提取数据的站点并确定哪些 url 包含您正在查找的数据以及哪些数据格式构成响应时,这将是绝对必要的。
您将需要良好的 HTTP 和 HTML 工作知识,并且可能希望在中间代理软件中找到一个像样的人。您需要能够检查 HTTP 请求和响应,并了解 cookie 和 session 信息以及查询参数是如何传递的。 Fiddler ( http://www.telerik.com/fiddler ) 和 Charles Proxy ( http://www.charlesproxy.com/ ) 是流行的工具。我经常使用 mitmproxy ( http://mitmproxy.org/ ),因为我更喜欢键盘侠而不是鼠标手。
某种控制台/shell/REPL 类型的环境,您可以在其中尝试具有即时反馈的各种代码片段,这将是非常宝贵的。像这样的逆向工程任务需要大量的反复试验,因此您需要一个可以简化此过程的工作流程。
语言
PHP 基本上已经过时了,它不太适合这项任务,而且这方面的库/框架支持很差。 Python(Scrapy 是一个很好的起点)和 Clojure/Clojurescript(非常强大和高效,但学习曲线很大)是解决这个问题的好语言。由于您不想学习一门新语言并且您已经知道 Javascript,我绝对建议您坚持使用 JS。我没有使用过 pjscrape,但从快速阅读他们的文档来看,它看起来相当不错。它非常适合并实现了我在下面描述的问题的出色解决方案。
关于正则表达式的说明:
不要使用正则表达式来解析 HTML。
许多初学者这样做是因为他们已经熟悉正则表达式。这是一个巨大的错误,使用 xpath 或 css 选择器来导航 html 并且只使用正则表达式从 html 节点内的实际文本中提取数据。这对你来说可能已经很明显了,如果你尝试一下,它很快就会变得明显,但是很多人出于某种原因浪费了很多时间走这条路。不要害怕 xpath 或 css 选择器,它们比正则表达式更容易学习,并且它们旨在解决这个确切的问题。
Javascript 密集型网站
在过去,您只需要发出一个 http 请求并解析 HTML 响应。现在,您几乎肯定必须处理由标准 HTML HTTP 请求/响应和目标站点的 javascript 部分发出的异步 HTTP 调用混合而成的站点。这是您的代理软件和 firebug/devtools 的网络选项卡非常方便的地方。对这些的响应可能是 html 或者它们可能是 json,在极少数情况下它们会是 xml 或其他东西。
有两种方法可以解决这个问题:
低级方法:
您可以找出网站 javascript 正在调用的 ajax url 以及这些响应的样子,然后自己发出相同的请求。所以你可以从 http://example.com/foobar 拉取 html并提取一条数据,然后必须从 http://example.com/api/baz?foo=b 中提取 json 响应...获取另一条数据。您需要注意传递正确的 cookie 或 session 参数。这是非常罕见的,但有时 ajax 调用所需的一些参数是在站点的 javascript 中进行的一些疯狂计算的结果,逆向工程这可能很烦人。
嵌入式浏览器方法:
为什么你需要弄清楚 html 中有哪些数据,哪些数据来自 ajax 调用?管理所有 session 和 cookie 数据?当您浏览网站时,您不必这样做,浏览器和网站 javascript 会这样做。这就是重点。
如果您只是将页面加载到像 phantomjs 这样的 headless 浏览器引擎中,它将加载页面,运行 javascript 并告诉您所有 ajax 调用何时完成。如有必要,您可以注入(inject)自己的 javascript 以触发适当的点击或触发站点 javascript 加载适当数据所需的任何内容。
您现在有两个选择,让它吐出完成的 html 并解析它,或者将一些 javascript 注入(inject)到页面中进行解析和数据格式化并吐出数据(可能是 json 格式)。您也可以自由混合这两个选项。
哪种方法最好?
这取决于,您肯定需要熟悉并适应低级方法。嵌入式浏览器方法适用于任何事情,实现起来会容易得多,并且会使抓取中一些最棘手的问题消失。它也是一个相当复杂的机器,您需要了解它。这不仅仅是 HTTP 请求和响应,它是请求、嵌入式浏览器呈现、站点 javascript、注入(inject)的 javascript、您自己的代码以及与嵌入式浏览器进程的双向交互。
由于渲染开销,嵌入式浏览器在规模上也慢得多,但这几乎可以肯定无关紧要,除非您正在抓取许多不同的域。在单个域的情况下,您需要对请求进行速率限制将使渲染时间完全可以忽略不计。
速率限制/机器人行为
你需要非常清楚这一点。您需要以合理的速度向目标域发出请求。在抓取网站时,您需要编写一个表现良好的机器人,这意味着尊重 robots.txt,而不是用请求来敲打服务器。这里的错误或疏忽是非常不道德的,因为这可以被视为拒绝服务攻击。可接受的速率取决于你问的人,1req/s 是谷歌爬虫运行的最大值,但你不是谷歌,你可能不像谷歌那样受欢迎。保持合理的速度。我建议每个页面请求之间间隔 2-5 秒。
使用标识您的机器人的用户代理字符串来识别您的请求,并为您的机器人提供一个解释其用途的网页。此 url 位于代理字符串中。
如果该站点想要阻止您,您将很容易被阻止。一个聪明的工程师可以轻松识别机器人,而他们端的几分钟工作可能会导致数周的工作改变你端的抓取代码,或者只是让它变得不可能。如果这种关系是对立的,那么目标站点的聪明工程师可以完全阻止编写爬虫的天才工程师。抓取代码本质上是脆弱的,这很容易被利用。无论如何,几乎可以肯定会引起这种 react 的东西是不道德的,所以编写一个表现良好的机器人,不要担心这一点。
测试
不是单元/集成测试人员?太糟糕了。你现在必须成为其中一员。站点经常更改,您将经常更改代码。这是挑战的很大一部分。
抓取现代网站涉及很多事件部分,良好的测试实践将有很大帮助。您在编写此类代码时会遇到的许多错误都是静默返回损坏数据的类型。如果没有良好的测试来检查回归,您会发现您已经将无用的损坏数据保存到数据库中一段时间而没有注意到。这个项目会让你非常熟悉数据验证(找到一些好的库来使用)和测试。需要综合测试和很难测试的问题并不多。
测试的第二部分涉及缓存和更改检测。在编写代码时,您不想无缘无故地为同一页面一遍又一遍地敲打服务器。在运行单元测试时,您想知道测试失败是因为您破坏了代码还是因为网站已经重新设计。针对所涉及的 url 的缓存副本运行单元测试。缓存代理在这里非常有用,但很难正确配置和使用。
您也确实想知道该站点是否已更改。如果他们重新设计了站点并且您的爬虫损坏了,您的单元测试仍然会通过,因为它们是针对缓存副本运行的!您将需要另一组较小的集成测试集,这些测试很少针对实时站点运行,或者在爬行代码中进行良好的日志记录和错误检测,以记录确切的问题,提醒您注意问题并停止爬行。现在您可以更新缓存、运行单元测试并查看需要更改的内容。
法律问题
如果你做愚蠢的事情,这里的法律可能会有点危险。如果涉及到法律,您将与那些经常将 wget 和 curl 称为“黑客工具”的人打交道。你不想要这个。
这种情况的道德现实是,使用浏览器软件请求 url 并查看一些数据与使用您自己的软件请求 url 并查看一些数据之间没有区别。谷歌是世界上最大的抓取公司,他们因此受到喜爱。在用户代理中识别您的机器人名称并公开您的网络爬虫的目标和意图将在此有所帮助,因为法律了解 Google 是什么。如果您正在做任何可疑的事情,例如创建虚假用户帐户或访问您不应该访问的站点区域(被 robots.txt “阻止”或由于某种授权漏洞),请注意您正在做一些不道德的事情而法律对技术的无知在这里会格外危险。这是一个荒谬的情况,但这是一个真实的情况。
作为一个正直的公民,尝试和建立一个新的搜索引擎,在你的软件中犯错误或有错误并被视为黑客,这实际上是可能的。考虑到当前的政治现实,这不是你想要的。
无论如何,我是谁来写这堵巨大的文字墙?
在我的生活中,我写了很多网络爬虫相关的代码。作为顾问、员工和初创公司创始人,我从事与网络相关的软件开发已有十多年了。早期是编写 perl 爬虫/爬虫和 php 网站。当我们在 Jesse James Garrett 将其命名为 ajax 之前,在 XMLHTTPRequest 成为一个想法之前,嵌入隐藏的 iframe 将 csv 数据加载到网页中以执行 ajax。在 jQuery 之前,在 json 之前。我已经 30 多岁了,这显然被认为是这项业务的古老时期。
我已经编写过两次大型爬网/抓取系统,一次是为一家媒体公司的一个大团队(使用 Perl)编写的,最近一次是为一个作为搜索引擎初创公司 CTO 的小团队编写的(使用 Python/Javascript)。我目前是一名顾问,主要使用 Clojure/Clojurescript(一种很棒的专家语言,并且拥有使爬虫/爬虫问题成为乐趣的库)进行编码
我也写过成功的反爬虫软件系统。如果您想要或识别和破坏您不喜欢的机器人,那么编写几乎无法抓取的站点非常容易。
我比任何其他类型的软件都更喜欢编写爬虫、爬虫和解析器。它具有挑战性,有趣,可用于创造惊人的事物。
关于api - 从网站上抓取数据的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22168883/
我有这个网站,这个特定页面是安全的,但是当它回发时,它回发到一个不安全的页面。如何解决? 我正在使用 ASP.NET 向导。我有这个页面 - checkout.aspx,页面包含这个控件 checko
我有 2 个 azure 网站 - 两个独立的项目 我现在有 2 个网址: myazurewebsite.azurewebsites.net myazureblog.azurewebsites.net
我有 2 个 azure 网站 - 两个独立的项目 我现在有 2 个网址: myazurewebsite.azurewebsites.net myazureblog.azurewebsites.net
环境: 旧网站: React 托管在 Heroku URL( http://sameurl.com ) 新网站: Java 托管在 Heroku URL ( http://sameurl.com )
我已在 Windows Azure 上注册了一个测试帐户来对其进行测试。我构建了一个 Hello world ASP.NET Web 应用程序 + 数据库只是为了测试。 我安装了 Visual Stu
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
这个问题在这里已经有了答案: Software keyboard resizes background image on Android (16 个答案) 关闭 8 年前。 我有一个类似的问题:So
这个问题似乎很常见,但我真的无法根据现有答案解决问题。 我有一个简单的 maven 项目,没有任何复杂的部署配置等,并且想在点击“mvn site”时生成一个 Maven CheckStyle 报告。
有没有人看过有关何时进行横向扩展与纵向扩展的最佳选择的任何分析或信息。什么时候一个比另一个更有意义。 目前,在标准模式和基本模式下,2 个小型实例的费用与 1 个中型实例的费用相同。 拥有 2 个小型
有没有办法找到 azure 网站何时停止? (我通过门户网站停止了网站,但我不记得是什么时候......) 我正在寻找一些日志,但没有找到任何有用的内容。 谢谢。 最佳答案 您拥有的最接近的是 azu
我目前在 Azure VM 的 IIS 中拥有一个网站。我已将该站点复制到 2 个可用区域中的 2 个虚拟机上。 这可以保护网站免遭停机。 我需要为高负载时刻实现一些可扩展性。这似乎就是创建音阶集的目
我有一个托管在 Azure 上的网站 ( http://mike-ward.azurewebsites.net/ )。我从 Azure 门户设置了一个指向(引用?)我的网站的 Azure CDN。根据
我有一个 Azure 网站(不是 Web 角色),有 2 个槽:生产和暂存。 我只想为生产插槽启用 CDN,而不是为登台启用,问题是我找不到识别主机插槽的方法。 RoleEnvironment 不可用
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 4年前关
我们正在考虑将一些网站从 Azure 云服务迁移到 Azure 网站(事情似乎就是这样进行的)。显然,我们被明确告知云服务不会保留文件系统状态,因为它们会在机器故障时重新部署。 我假设网站是基于 Bl
我有一个 Azure 网站,需要使用在 VM 上运行的 Elasticsearch 服务。 虽然我需要能够锁定对 Elasticsearch 的访问,以便只有 Azure 网站可以访问它,但我似乎无法
我有一个 azure 网站,位于 yis3.azurewebsites.net - 我已将其提升为“共享”网站,以便我可以使用自定义域。我拥有从 123-reg.co.uk 购买的域名 yorkshi
我正在使用 abcPDF 动态创建 PDF。 我想保存这些 PDF,以便客户随时检索。最简单的方法(也是我现在在当前服务器上所做的方法)是将完成的 PDF 保存到文件系统。 看来我一直坚持使用 blo
我们正在尝试了解 Windows Azure 管理 API 为 Azure 网站(而非 Webroles)返回的监控数据的复杂性 例如,下图描述了为 CPUTime 检索的数据点。它似乎表明,在晚上
看起来真的很愚蠢,因为我找不到它: 门户网站似乎不太直观,我如何为一个“网站”付费并在其中运行最多 500 个网站?我想当我通过单击左下角的加号添加“网站”时,我添加了整个虚拟机而不是子站点。如何仅添
我是一名优秀的程序员,十分优秀!