你要如何衡量你的人生

坚持,努力,让好事发生

一般情况下,网站或者广告联盟都会非常想要一种技术方式可以在网络上精确定位到每一个个体,这样可以通过收集这些个体的数据,通过分析后更加精准的去推送广告(精准化营销)或其他有针对性的一些活动。
Cookie技术是非常受欢迎的一种。当用户访问一个网站时,网站可以在用户当前的浏览器Cookie中永久植入一个含有唯一标示符(UUID)的信息,并通过这个信息将用户所有行为(浏览了哪些页面?搜索了哪些关键字?对什么感兴趣?点了哪些按钮?用了哪些功能?看了哪些商品?把哪些放入了购物车等等)关联起来。
但是Cookie可以伪装,在浏览器隐私窗口,不同用户,甚至是爬虫时无法区分。
这个时候,提出一种 “帆布指纹识别”技术 ,这种技术可以避免以上的缺点。

function bin2hex (s) {
  // From: http://phpjs.org/functions
  // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +   bugfixed by: Onno Marsman
  // +   bugfixed by: Linuxworld
  // +   improved by: ntoniazzi (http://phpjs.org/functions/bin2hex:361#comment_177616)
  // *     example 1: bin2hex('Kev');
  // *     returns 1: '4b6576'
  // *     example 2: bin2hex(String.fromCharCode(0x00));
  // *     returns 2: '00'

  var i, l, o = "", n;

  s += "";

  for (i = 0, l = s.length; i < l; i++) {
    n = s.charCodeAt(i).toString(16)
    o += n.length < 2 ? "0" + n : n;
  }

  return o;
}


var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var txt = 'http://security.tencent.com/';
ctx.textBaseline = "top";
ctx.font = "14px 'Arial'";
ctx.textBaseline = "tencent";
ctx.fillStyle = "#f60";
ctx.fillRect(125,1,62,20);
ctx.fillStyle = "#069";
ctx.fillText(txt, 2, 15);
ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
ctx.fillText(txt, 4, 17);


var b64 = canvas.toDataURL().replace("data:image/png;base64,","");
var bin = atob(b64);
var crc = bin2hex(bin.slice(-16,-12));
console.log(crc);

以上代码在chrome浏览器里运行会得到一个结果 3c5c9044 ,在火狐会得到 7e7f4d86,在IE会得到 5ec31ae3
只要用户用同一浏览器,产生的 帆布指纹就不会变。这样就可以达到反爬虫的效果。
缺点是 公司批量购买的电脑,批量安装系统,这些电脑的结果可能会一样。

References

[1] 取代cookie的网站追踪技术:”帆布指纹识别”初探
[2] 帆布指纹识别(CANVAS FINGERPRINTING)
[3] fingerprintJS
[4] browser-uniqueness.pdf
[5] Token 认证的来龙去脉
[6] token认证

Python日志

python确实挺简单,用起来确实挺方便,但是python的日志我真想说一句头疼

只输出到文件

import logging

# 改成对应的日志路径,推荐使用绝对路径
logging.basicConfig(level=logging.INFO,
                    filename='log.log',
                    filemode='a',
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
					

def main():
    #print("hello world")
	logging.info("hello world")


if __name__ == '__main__':
    main()

参考资料

[1] http://python.jobbole.com/81666/
[2] https://www.jianshu.com/p/4f6ff84cb3e9
[3] https://my.oschina.net/leejun2005/blog/126713 python 日志模块 logging 详解
[4] http://logbook.readthedocs.io/en/stable/
[5] https://github.com/getlogbook/logbook
[6] https://github.com/metachris/logzero
[7] https://www.jianshu.com/p/d615bf01e37b python logging日志模块以及多进程日志
[8] http://blog.csdn.net/liuchunming033/article/details/39080457 Python中的logging模块就这么用
[9] https://www.jianshu.com/p/72fb43127c85 Python日志教程

调试时想要打印出httpClient日志

httpClient 4.5.x

Context Logging    上下文日志
   org.apache.http.impl.client
   
Wire Logging    传送和接收的数据日志
   org.apache.http.wire
   
HTTP header Logging    请求头和响应头日志
   org.apache.http.headers

参考httpcomponents-client-4.5.x logging.html

阅读全文 »

对于一张网页,我们往往希望它是结构良好,内容清晰的,这样搜索引擎才能准确地认知它。
而反过来,又有一些情景,我们不希望内容能被轻易获取,比方说电商网站的交易额,教育网站的题目等。因为这些内容,往往是一个产品的生命线,必须做到有效地保护。这就是爬虫与反爬虫这一话题的由来。
但是世界上没有一个网站,能做到完美地反爬虫。
如果页面希望能在用户面前正常展示,同时又不给爬虫机会,就必须要做到识别真人与机器人。因此工程师们做了各种尝试,这些策略大多采用于后端,也是目前比较常规单有效的手段。

反爬手段

  1. User-Agent检测
  2. Referer检测
  3. IP限制频次
  4. 账号及Cookie验证
  5. 验证码
  6. 混淆或者加密js
阅读全文 »

对于neo4j自增id,没有好的办法

  1. 只能用neo4j提供的自增id
  2. 可以设置一个属性用uuid来标识。(记得给这个属性建索引)

neo4j-uuid可以直接用neo4j其中一个作者写的插件https://github.com/graphaware/neo4j-uuid

Reference:
[1] https://stackoverflow.com/questions/29434020/auto-increment-property-in-neo4j
[2] https://github.com/graphaware/neo4j-uuid
[3] http://grokbase.com/t/gg/neo4j/12akdzasym/auto-increment-ids-for-nodes
[4] https://gist.github.com/jacquibo/8012859
[5] https://gist.github.com/jacquibo/8012859
[6] http://grokbase.com/t/gg/neo4j/12ay3p71jr/auto-increment
[7] http://forum.spring.io/forum/spring-projects/data/nosql/121977-neo4j-auto-increment-id-for-node
[8] https://groups.google.com/forum/#!topic/neo4j/_6m-Yu-6q-8

首先提出一个问题:从输入URL到页面加载发生了什么?

仔细思考这个问题,发现确实很深,这个过程涉及到的东西很多。这个问题的回答真的能够很好的考验一个人对知识了解的水平。而且从不同角度/专业看,回答的结果也会不一样。

从网络的角度回答,简略回答如下:
1.DNS域名解析;
2.建立TCP连接;
3.发送HTTP请求;
4.服务器处理请求;
5.返回响应结果;
6.浏览器解析HTML,布局渲染;
7.关闭TCP连接;

计算机网络概述

ISO与TCP/IP

网络协议

需要了解的知识

ISO
TCP
IP
TCP/IP
UDP

在网络体系结构中,包含了众多的网络协议,这篇文章主要围绕 HTTP 协议(HTTP/1.1版本)展开。

互联网的关键技术就是TCP/IP协议。两台计算机之间的通信是通过TCP/IP协议在因特网上进行的。实际上这个是两个协议:

TCP : Transmission Control Protocol 传输控制协议
IP: Internet Protocol  网际协议。

IP:计算机之间的通信

IP协议是计算机用来相互识别的通信的一种机制,每台计算机都有一个IP.用来在internet上标识这台计算机。  IP 负责在因特网上发送和接收数据包。通过 IP,消息(或者其他数据)被分割为小的独立的包,并通过因特网在计算机之间传送。IP 负责将每个包路由至它的目的地。

IP协议仅仅是允许计算机相互发消息,但它并不检查消息是否以发送的次序到达而且没有损坏(只检查关键的头数据)。为了提供消息检验功能,直接在IP协议上设计了传输控制协议TCP.

TCP : 应用程序之间的通信
TCP确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变。TCP在IP地址之上引端口(port),它允许计算机通过网络提供各种服务。一些端口号为不同的服务保留,而且这些端口号是众所周知。

服务或者守护进程:在提供服务的机器上,有程序监听特定端口上的通信流。例如大多数电子邮件通信流出现在端口25上,用于wwww的HTTP通信流出现在80端口上。

当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信,占用两个计算机之间整个的通信线路。TCP 用于从应用程序到网络的数据传输控制。TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达的时候将它们重组。

TCP/IP 就是TCP 和 IP 两个协议在一起协同工作,有上下层次的关系。

TCP 负责应用软件(比如你的浏览器)和网络软件之间的通信。IP 负责计算机之间的通信。TCP 负责将数据分割并装入 IP 包,IP 负责将包发送至接受者,传输过程要经IP路由器负责根据通信量、网络中的错误或者其他参数来进行正确地寻址,然后在它们到达的时候重新组合它们。

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

HTTP是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。

我们在浏览器的地址栏里输入的网站地址叫做URL (Uniform Resource Locator,统一资源定位符)。就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当你在浏览器的地址框中输入一个URL或是单击一个超级链接时,URL就确定了要浏览的地址。浏览器通过超文本传输协议(HTTP),将Web服务器上站点的网页代码提取出来,并翻译成对应的网页。

HTTP 工作过程

就像刚才问的 从输入URL到页面加载发生了什么,其中工作的过程有以下几部分:

网络协议

客户端请求时,数据在各层协议的数据组织

一次HTTP操作称为一个事务,其工作整个过程如下:

1、地址解析,

如用客户端浏览器请求这个页面:http://www.baidu.com/index.html
从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
协议名:http
主机名:www.baidu.com 被解析成 220.181.38.150
端口:80
对象路径:/index.html

在这一步,需要域名系统DNS解析域名www.baidu.com,得主机的IP地址。

2、封装HTTP请求数据包

把以上部分结合本机自己的信息,封装成一个HTTP请求数据包

3、封装成TCP包,建立TCP连接(TCP的三次握手)

在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。

4、客户机发送请求命令

建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。

5、服务器响应

服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

实体消息是服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据

6、服务器关闭TCP连接

一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

HTTP 协议基础

HTTP是一个无状态的协议

HTTP是一个无状态的协议。无状态是指客户机(Web浏览器)和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息.HTTP遵循请求(Request)/应答(Response)模型。客户机(浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有HTTP连接都被构造成一套请求和应答。
这么做为了更快地处理大量事务,确保协议的可伸缩性

Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存Cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

请求 URI 定位资源

HTTP 协议使用 URI 定位互联网上的资源。正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到。

告知服务器意图的 HTTP 方法(HTTP/1.1)

持久连接

HTTP 协议的初始版本中,每进行一个 HTTP 通信都要断开一次 TCP 连接。比如使用浏览器浏览一个包含多张图片的 HTML 页面时,在发送请求访问 HTML 页面资源的同时,也会请求该 HTML 页面里包含的其他资源。因此,每次的请求都会造成无畏的 TCP 连接建立和断开,增加通信量的开销。

为了解决上述 TCP 连接的问题,HTTP/1.1 和部分 HTTP/1.0 想出了持久连接的方法。其特点是,只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。旨在建立一次 TCP 连接后进行多次请求和响应的交互。在 HTTP/1.1 中,所有的连接默认都是持久连接。

谷歌浏览器默认最多打开6个TCP连接

管线化

持久连接使得多数请求以管线化方式发送成为可能。以前发送请求后需等待并接收到响应,才能发送下一个请求。管线化技术出现后,不用等待亦可发送下一个请求。这样就能做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
比如,当请求一个包含多张图片的 HTML 页面时,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术要比持久连接速度更快。请求数越多,时间差就越明显。

HTTP 协议报文结构

HTTP报文

用于 HTTP 协议交互的信息被称为 HTTP 报文。
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。
HTTP有两类报文:请求报文和响应报文。

HTTP请求报文格式

HTTP请求报文主要由请求行、请求头部、请求正文3部分组成。

HTTP请求报文结构

<request-line>
<headers>
<blank line>
[<request-body>]

请求行

请求航由3部分组成,请求方法、URL以及协议版本,之间由空格分隔。

请求方法包括GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE以及扩展方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,处于安全性的考虑也是不可用的

协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1

请求头部

请求头部为请求报文添加了一些附加信息,由“键/值”对组成,每行一对,名和值之间使用冒号分隔。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8
Cache-Control: no-cache
Connection: keep-alive
Cookie: BAIDUID=xx:FG=1; PSTM=1562221918; BIDUPSID=xxx; BD_UPN=xxx; BDUSS=xxx; H_PS_PSSID=xxx; BDORZ=xx; delPer=0; BD_CK_SAM=1; locale=zh; BD_HOME=1; BDRCVFR[S4-dAuiWMmn]=xx; PSINO=7; BDRCVFR[feWj1Vr5u3D]=xx; pgv_pvi=xx; pgv_si=xx; yjs_js_security_passport=xx; COOKIE_SESSION=xx; H_PS_645EC=xx; BDSFRCVID=xx; H_BDCLCKID_SF=xx; sugstore=1
Host: www.baidu.com
Pragma: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
key value
Host 接受请求的服务器地址,可以是IP:端口号,也可以是域名
User-Agent 发送请求的应用程序名称
Connection 指定与连接相关的属性,如Connection:Keep-Alive
Accept-Charset 通知服务端可以发送的编码格式
Accept-Encoding 通知服务端可以发送的数据压缩格式
Accept-Language 通知服务端可以发送的语言

请求头部的最后会有一个空行,表示请求头部结束,接下来为请求正文,这一行非常重要,必不可少。

请求正文

可选部分,比如GET请求就没有请求正文

HTTP响应报文格式

HTTP响应报文主要由状态行、响应头部、响应正文3部分组成。

HTTP响应报文结构

<status-line>
<headers>
<blank line>
[<response-body>]

状态行

状态行由3部分组成,分别为:协议版本、状态码、状态码描述,之间由空格分隔

HTTP/1.1 200 OK
协议版本:HTTP/1.1
状态码:200
状态码描述:OK

协议版本

状态码

状态代码为3位数字,200299的状态码表示成功,300399的状态码指资源重定向,400499的状态码指客户端请求出错,500599的状态码指服务端出错(HTTP/1.1向协议中引入了信息性状态码,范围为100~199)

1XX:信息提示。表示请求已被服务器接受,但需要继续处理,范围为100101。
2XX:请求成功。服务器成功处理了请求。范围为200
206。
3XX:客户端重定向。重定向状态码用于告诉客户端浏览器,它们访问的资源已被移动,并告诉客户端新的资源位置。客户端收到重定向会重新对新资源发起请求。范围为300305。
4XX:客户端信息错误。客户端可能发送了服务器无法处理的东西,比如请求的格式错误,或者请求了一个不存在的资源。范围为400
415。
5XX:服务器出错。客户端发送了有效的请求,但是服务器自身出现错误,比如Web程序运行出错。范围是500~505。

状态码描述

HTTP响应头部

响应头 说明
Server 服务器应用程序软件的名称和版本
Content-Type 响应正文的类型(是图片还是二进制字符串)
Content-Length 响应正文长度
Content-Charset 响应正文使用的编码
Content-Encoding 响应正文使用的数据压缩格式
Content-Language 响应正文使用的语言

响应示例:

HTTP/1.1 200 OK
Bdpagetype: 2
Bdqid: xxx
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Sat, 10 Aug 2019 08:00:56 GMT
Expires: Sat, 10 Aug 2019 08:00:56 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=269; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=xxx; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Transfer-Encoding: chunked
X-Ua-Compatible: IE=Edge,chrome=1

响应正文

对应的响应正文

<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

HTTP请求GET和POST的区别

1.GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据
因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

2.传输数据的大小:

首先声明,HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:
GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
因此对于GET提交时,传输数据就会受到URL长度的限制。
POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

3.安全性:

POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了

References

[1] 一篇文章带你熟悉 TCP/IP 协议(网络协议篇二)
[2] 一篇文章带你详解 HTTP 协议(网络协议篇一)
[3] Http 和 Socket 到底是哪门子亲戚
[4] 你必须知道的HTTP基本概念
[5] 你必须知道的HTTP基本概念
[6] 一文读懂OSI七层模型与TCP/IP四层的区别/联系
[7] 前端经典面试题: 从输入URL到页面加载发生了什么?
[8] 从输入 URL 到页面加载完成的过程中都发生了什么事情?
[9] OSI模型的通俗理解以及和TCP-IP模型的区别
[10] HTTP详解(1)-工作原理
[11] HTTP请求报文和HTTP响应报文
[12] HTTP请求、响应报文格式

OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。为了更好的使网络应用更为普及,推荐使用这个规范来控制网络。

网络协议

OSI七层网络模型

OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。

OSI七层网络模型 OSI各层功能
应用层(Application) 为应用程序提供服务,文件传输、电子邮件、文件服务、虚拟终端
表示层(Presentation) 数据格式转换、数据加密
会话层(Session) 建立、管理和维护会话
传输层(Transport) 建立、管理和维护端到端的连接
网络层(Network) IP选址及路由选择
数据链路层(Data Link) 提供介质访问和链路管理,传输有地址的帧以及错误检测功能
物理层(Physical) 物理层、以二进制数据形式在屋里媒体上传输数据

OSI各层的功能

网络通信其实和现实中寄信的通信方式相似

以书信的方式进行通信为例。

1、物理层:提供为建立、维护和拆除物理链路所需要的机械的、电气的、功能的和规程的特性;有关的物理链路上传输非结构的位流以及故障检测指示(信件的运输工具,比如火车、汽车)

2、数据链路层:在网络层实体间提供数据发送和接收的功能和过程;提供数据链路的流控(相当于货物核对单,表明里面有些什么东西,接受的时候确认一下是否正确(CRC检验))。

3、网络层:控制分组传送系统的操作、路由选择、拥护控制、网络互连等功能,它的作用是将具体的物理传送对高层透明(相当于邮政局或快递公司地址(IP地址),能正确到达对方)

4、传输层:提供建立、维护和拆除传送连接的功能;选择网络层提供最合适的服务;在系统之间提供可靠的透明的数据传送,提供端到端的错误恢复和流量控制(相当于信封(TCP协议是挂号信,是可靠的;UDP协议是平信,尽力送到对方,不保证一点送到对方))

5、会话层:提供两进程之间建立、维护和结束会话连接的功能;提供交互会话的管理功能,如三种数据流方向的控制,即一路交互、两路交替和两路同时会话模式(相当于邮票,优质邮票寄一封信,相当与一个会话)

6、表示层:代表应用进程协商数据表示;完成数据转换、格式化和文本压缩(你用普通话还是用方言?或者是英语?)

7、应用层:提供OSI用户服务,例如事务处理程序、文件传送协议和网络管理等(信件的内容)

OSI封装过程

描述一下封装过程

1,你应该有需要表达的内容,信的内容(应用层)
2,你需要有一种合适的表达语言,中文、英文(表示层)
3,你要把信纸装进一个信封,贴上一张邮票(一封信就是一个会话)
4,你要选择什么方式寄信(挂号信或平信,TCP或UDP)
5,选择一个快递公司或邮政局,告诉地址,邮政局根据地址选择运输方式(根据IP地址选择路由)
6,邮政局对货物进行再包装,写上装箱单,供接收地的邮政局核对(货物总是先送到对方邮政局,对方邮政局的地址就相当于MAC地址,装箱单就相当于CRC校验码)
7,货物通过具体的运输根据(汽车、汽车、飞机等)

OSI网络体系结构各层协议

一、应用层:TELNET、FTP、TFTP、SMTP、SNMP、HTTP、BOOTP、DHCP、DNS 等

二、表示层:
文本:ASCII,EBCDIC
图形:TIFF,JPEG,GIF,PICT
声音:MIDI,MPEG,QUICKTIME

三、会话层:

四、传输层:TCP、UDP、SPX

五、网络层:IP、IPX、ICMP、RIP、OSPF(Open Shortest Path First开放式最短路径优先)

六、数据链路层:SDLC、HDLC、PPP、STP(Spanning Tree Protocol)、帧中继

七、物理层:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45

OSI七层网络模型 TCP/IP四层概念模型
应用层(Application) 应用层
表示层(Presentation)
会话层(Session)
传输层(Transport) 传输层
网络层(Network) 网络层
数据链路层(Data Link) 数据链路层
物理层(Physical)

OSI模型和TCP-IP模型的区别

OSI七层和TCP/IP四层的关系

OSI引入了服务、接口、协议、分层的概念
TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。

OSI先有模型,后有协议,先有标准,后进行实践;
TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型。

OSI是一种理论下的模型
TCP/IP已被广泛使用,成为网络互联事实上的标准。

TCP/IP他是一个协议簇;而OSI(开放系统互联)则是一个模型,且TCP/IP的开发时间在OSI之前。

TCP/IP是由一些交互性的模块做成的分层次的协议,其中每个模块提供特定的功能;OSi则指定了哪个功能是属于哪一层的。

TCP/IP是五层结构,而OSI是七层结构。OSI的最高三层在TCP中用应用层表示。

TCP:transmission control protocol 传输控制协议
UDP:user data protocol 用户数据报协议

服务器常用端口

端口 服务 说明
21 FTP FTP 服务器所开放的端口,用于上传、下载
22 SSH 22 端口就是 ssh 端口,用于通过命令行模式远程连接 Linux 系统服务器
25 SMTP SMTP 服务器所开放的端口,用于发送邮件
80 HTTP 用于网站服务例如 IIS、Apache、Nginx 等提供对外访问
110 POP3 110 端口是为 POP3(邮件协议 3)服务开放的
137/138/139 NETBIOS 其中 137、138 是 UDP 端口,当通过网上邻居传输文件时用这个端口。而 139 端口:通过这个端口进入的连接试图获得 NetBIOS/SMB 服务。这个协议被用于 windows 文件和打印机共享和 SAMBA
143 IMAP 143 端口主要是用于“Internet Message AccessProtocol”v2(Internet 消息访问协议,简称 IMAP),和 POP3 一样,是用于电子邮件的接收的协议
443 HTTPS 网页浏览端口,能提供加密和通过安全端口传输的另一种 HTTP
1433 SQL Server 1433 端口,是 SQL Server 默认的端口,SQL Server 服务使用两个端口:TCP-1433、UDP-1434。其中 1433 用于供 SQL Server 对外提供服务,1434 用于向请求者返回 SQL Server 使用了哪个 TCP/IP 端口
3306 MySQL 3306 端口,是 MySQL 数据库的默认端口,用于 MySQL 对外提供服务
3389 Windows Server Remote Desktop Services 3389 端口是 Windows 远程桌面的服务端口,可以通过这个端口,用 “远程桌面” 等连接工具来连接到远程的服务器
8080 代理端口 8080 端口同 80 端口,是被用于 WWW 代理服务的,可以实现网页浏览,经常在访问某个网站或使用代理服务器的时候,会加上 “:8080” 端口号。另外 Apache Tomcat web server 安装后,默认的服务端口就是 8080

References

[1] 一文读懂OSI七层模型与TCP/IP四层的区别/联系
[2] OSI模型的通俗理解以及和TCP-IP模型的区别

No permitted “Access-Control-Allow-Origin” header.

net.sourceforge.htmlunit.corejs.javascript.WrappedException: Wrapped java.lang.RuntimeException: No permitted "Access-Control-Allow-Origin" header.
	at net.sourceforge.htmlunit.corejs.javascript.Context.throwAsScriptRuntimeEx(Context.java:2052) ~[htmlunit-core-js-2.23.jar:na]
	
Caused by: java.lang.RuntimeException: No permitted "Access-Control-Allow-Origin" header.
	... 9 common frames omitted

java.security.ProviderException: java.security.KeyException

Caused by: java.security.ProviderException: java.security.KeyException
  
Caused by: java.security.KeyException

我的JDK环境是sun的1.8.0,操作系统CentOS 6.5

运行如下linux命令后程序可以完美运行,BUG解决:yum upgrade nss

java.net.SocketException: Permission denied: connect

java.net.SocketException: Permission denied: connect
	at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_111]

被墙了

阅读全文 »

裁判文书爬取只写了思路,有部分内容没公开。这篇文章只提供思路,不提供实现。仅供参考。

如果经济允许,可以直接购买裁判文书网的文书,一年10万元,和爬虫工程师开销和代理费用来说,10万元很划算了。

如果做实验使用,可以邮件或者加qq群在群里要,数量在百万以下一般会直接给。也免得增加文书网服务器的压力。

文书网已经放弃使用瑞数,现在使用的是免费的sojson加密

2019-04-09 文书网停服更新

2019-01-31 疯狂封ip

2018-08-07 增加7道爬虫防御,增加反爬难度,文书列表页返回的docId加密

2018-01-31 修改获取vl5x的js 还是eval函数,原理没变,换了换字符

2017-06-23 更新反爬策略 增加反爬难度 用的瑞数的产品 每一次请求翻页都要过一次验证码,加密一次密钥,带密钥访问下一个页面

谨以此文献给在我生命中留下回忆的非结构化团队。谢谢领导给了我充足的时间研究裁判文书网。

(1) 2019-06版 爬取裁判文书

首先找获取数据的页面。

页面请求参数

页面返回内容

浏览器 F12 很快就可以找到返回数据的list页面 http://wenshu.court.gov.cn/List/ListContent ,不过返回的数据是加密的。

用的是Post请求,请求参数有 Param Index Page Order Direction vl5x number guid ,cookie里的参数有 _gscu_2116842793 Hm_lvt_d2caefee2de09b8a6ea438d74fd98db2 _gscbrs_2116842793 ASP.NET_SessionId vjkl5 Hm_lpvt_d2caefee2de09b8a6ea438d74fd98db2 _gscs_2116842793,用于反爬参数的有3个,vl5x、number、guid 。

ctrl + F 搜索 guid number vl5x 发现
guid 是通过js生成。
number 第一页默认是 wens 后面的是数字
vl5x 通过混淆加密的js获得。在获取时要另获取vjkl5参数才能计算出vl5x

data: { "Param": listparam, "Index": index, "Page": page, "Order": order, "Direction": direction, "vl5x": getKey(), "number": yzm1, "guid": guid1 },

Lawyee.CPWSW.JsTree.js
Lawyee.CPWSW.List.js
Lawyee.CPWSW.ListExtend.js
pako.min.js

阅读全文 »
0%