首页 > 技术文章 > 再说网络爬虫

stlong 2015-04-23 00:09 原文

  现在做网络爬虫很容易,最常使用到的应该莫过于Python,类库丰富开发方便,简单。当然还有其他的,我没有接触的东西也很多,今天就说一下我两年前接触的一个项目中的很小一部分——模仿浏览器访问网站,大名网络机器人。

  其实前一段时间看过一篇文章《在浏览器中输入网址后都发生了什么》,这是一篇很好的文章,过程说的很清楚明白,网络爬虫其实就是最大限度的模仿了浏览器访问web服务器的过程,下面的图能说明简单的过程:

 

  但还是不完整,下面将详细描述一个Http请求的过程:

  • DNS  先获取URL中域名对应的IP地址
  • Socket connect 建立浏览器和web服务器之间的TCP连接
  • Send request 发送Http请求
  • Content Download web服务器返回应答

  根据域名获得IP地址的方法很多,你有可能返回的是很多IP地址,建议缓存起来,这有可能是存在一个一对多的关系。

  获得了IP地址之后发起TCP连接,建议在这个过程中使用不同的IP地址访问,因为大量访问同一个可能产生服务器内部错误5XX等异常。温馨提示Http的默认端口是80,https的默认端口是443。完成连接的过程只是TCP的三次握手。

  发送Http请求就是拼接的报文发送给web服务器,但是拼接报文涉及的东西很复杂,例如:

"GET %s HTTP/1.1\r\n"

"Host: %s\r\n"

"Connection: keep-alive\r\n"

"Cache-Control: max-age=0\r\n"

"Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*\r\n"

"User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0)Gecko/20100101 Firefox/20.0\r\n"

"Accept-Encoding: gzip,deflate\r\n"

"Accept-Language: zh-CN,zh\r\n"

"Accept-Charset: GBK,utf-8\r\n"

"Referer: http://%s/\r\n\r\n"

 

这些"GET %s HTTP/1.1\r\n"的含义:GET方式的请求,%s代表网页的绝对路径,HTTP/1.1说明的是Http协议的版本号。

"Host: %s\r\n"的含义:主机名称。

"Connection: keep-alive\r\n"建立连接之后的连接方式

"Cache-Control: max-age=0\r\n"的含义:缓存控制的最长时间

"Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*\r\n"的含义:接受的文本类型

"User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0)Gecko/20100101 Firefox/20.0\r\n"的含义:浏览器的类型,操作系统,等

"Accept-Encoding: gzip,deflate\r\n"的含义:浏览器接受的加密方式

"Accept-Language: zh-CN,zh\r\n"的含义:浏览器接受的语言

"Accept-Charset: GBK,utf-8\r\n"的含义:编码格式

"Referer: http://%s/\r\n\r\n"的含义:从哪个页面跳转过来

 

  如果是模拟登录应该会涉及cookie的保存和发送的处理,关于cookie放在下一篇中讨论。

 

  终于到了web服务器响应的过程了,这的很不容易的,先返回的是响应的状态码、cookie、传输方式、加密方式等信息,这是报文的头部。

  需要首先解析响应报文才能知道后续的流程要如何处理,根据状态码判断应答是否正确,根据传输方式判断内容的接收方式,根据加密方式判断接收后的报文是否需要解密等等。状态码常见的有200、3XX、4XX、5XX。含义各不相同。200代表正常、3XX代表跳转、4XX代表不存在、5XX代表服务器内部错误。传输方式分为chunked和一般,处理方式不同。加密方式:gzip是一种公用的格式。

  当爬虫正确的拿到报文之后,通信完成,关闭连接,通过TCP的四次挥手完成。之后需要筛选URL和内容,将URL保存以便访问,将内容按需要处理。这两种仅涉及字符串的处理,方式很多没必要仔细的说明。

  更多更详细的Http协议的解释请访问:http://my.huhoo.net/archives/2008/01/http11.html

推荐阅读