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

  • 相关阅读:
    TCP/IP协议栈概述及各层包头分析
    Maven:Non-resolvable parent POM: Failure to find错误
    mysql alter 用法,修改表,字段等信息
    PowerDesigner16 设置导出sql文件的编码
    linux iptables开放/关闭端口命令
    Enterprise Architect 13 : 需求建模 自动命名并计数
    Enterprise Architect 13 : 将绘制的图形导出成图片 或者 拷贝到剪贴板中
    Enterprise Architect 13 : 设置默认代码环境
    使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,报异常的解决方法
    PowerDesigner16 修改表或表的字段Name的时候不让Code不自动跟着变
  • 原文地址:https://www.cnblogs.com/stlong/p/4449109.html
Copyright © 2011-2022 走看看