zoukankan      html  css  js  c++  java
  • 再说网络爬虫

      现在做网络爬虫很容易,最常使用到的应该莫过于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 "

    "Host: %s "

    "Connection: keep-alive "

    "Cache-Control: max-age=0 "

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

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

    "Accept-Encoding: gzip,deflate "

    "Accept-Language: zh-CN,zh "

    "Accept-Charset: GBK,utf-8 "

    "Referer: http://%s/ "

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

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

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

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

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

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

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

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

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

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

      如果是模拟登录应该会涉及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

  • 相关阅读:
    用CSS3实现上下左右箭头
    让input框只能输入数字
    给内联元素设置宽高的几种方式
    当文本溢出包含的元素时加省略号之text-overflow
    通过box盒子模型给元素内容设置居中
    CSS3中的字体rem
    封装一个取消事件冒泡的方法
    HTML5 web workes实现多线程
    通过imeMode禁用键盘只能输入数字
    jquery的children方法和css3选择器配合使用
  • 原文地址:https://www.cnblogs.com/stlong/p/4449109.html
Copyright © 2011-2022 走看看