爬虫如何从网站抓取所需数据?

我们日常在工作中,因为现实需求,可能需要从某一个特定的网站上提取内容,但没有相应的应用程序可以提供API或其他机制来访问这些数据。此时,我们应该怎么做呢?本文将为您提供一些有效的方法。

使用工具

首先根据浏览器的开发工具(比如Chrome开发者工具),你需要确定目标站点的哪些 url 包含您需要收集的数据。

你需要了解关于 HTTP协议 和 HTML语言的知识,找到一个高效的中间代理软件也是必不可少的。分析HTTP请求和响应,并了解cookies和会话信息以及查询参数是如何被传递的。Fiddler(http://www.telerik.com/fiddler)和Charles Proxy(http://www.charlesproxy.com/)是流行的工具。最为推荐的是mitmproxy (http://mitmproxy.org/)。

某种控制台/Shell/REPL类型的环境,你可以尝试各种代码,并得到即时反馈,这是非常有帮助的。像这样的逆向工程任务需要大量的试验,所以有一个可交互的REPL十分有用。

编写代理爬虫程序

PHP、C、Golang、Java等语言都不合适,要么过于基础,要么语言过于繁琐。Python是编写代理ip爬虫的利器。但由于大多数人比较熟知,接下来我将用Javascript来举例。

关于正则表达式的注意事项:不要使用正则表达式来解析 HTML。许多初学者这样做是因为他们已经熟悉正则表达式,但这种做法极其低效。使用 xpath 或 css 选择器来解析 html,并且只使用正则表达式从 html 节点内的文本中提取数据。 xpath / css 选择器比正则表达式更容易学习,它们就是为了解析html而发明的。

在过去,你只需要发出一个http请求并解析HTML回复。现在,你几乎肯定要处理那些由标准的HTML HTTP请求/响应和由目标网站的javascript部分进行的异步HTTP调用组成的网站。这时,你的爬虫代理软件和Firebug/devtools就非常有用了。这些响应可能是html,也可能是json,在极少数情况下,它们会是xml或其他东西。

在解决这类问题时,我们对于具体使用 JS 的网站,如下所示:

  1. 直接解析协议
    1. 弄清楚网站的javascript调用了哪些ajax urls,以及这些响应是什么样子的,然后自己做这些同样的请求。
    2. 因此,你可能从http://example.com/foobar,提取一个数据,然后从http://example.com/api/baz?foo=b,提取json响应……以获得另一个数据。
    3. 你需要注意传递正确的cookies或会话参数。
    4. 这种情况非常少见,但偶尔有些ajax调用所需的参数会是网站javascript中的一些疯狂计算的结果,逆向工程会让人厌烦。
  2. 模拟渲染
    1. 为什么你需要搞清楚哪些数据在html中哪些数据来自ajax调用?
    2. 管理所有的会话和cookie数据?
    3. 当你浏览一个网站时,你不需要这样做,但浏览器和网站的javascript会做这些。这就是问题的关键。

如果你把页面加载到一个无头浏览器中,如phantomjs,它将加载页面,运行javascript,并告诉你所有的ajax调用已经完成。如果有必要,你可以注入自定义的javascript,通过模拟点击来加载适当的数据。

你现在有两个选择,让它直接输出html并解析它,或者在页面中注入一些javascript,进行解析和数据格式化并输出数据(可能是json格式)。两种方式都可以。

哪种方法是最好的?

毫无疑问,你需要学会并掌握方法一(使用工具),这是基础。嵌入浏览器的方法适用于任何情况,它将更容易实现,并能解决湖区数据中的系列棘手问题。需要注意的是,方法二(编写爬虫程序)它不仅仅是HTTP请求和响应,它是请求、嵌入式浏览器渲染、网站javascript、注入的javascript、你自己的代码以及与嵌入式浏览器进程的双向互动。