首先需要2个软件来抓包。

fiddler : http 代理软件可以分析,抓包,重放。

wireshark : 全能抓包分析软件。

RFC 提供了非常好的设计描述。

https://tools.ietf.org/html/rfc7230

https://tools.ietf.org/html/rfc7231

安装好
Fiddler2
Tools ->Fiddler Options…-> Connections
Allow remotecomputers toconnect
需要重启 Fiddler2 后生效

Wireshark
设置好抓包规则
tcp.port == 8888

全部设置好后,使用另外一台电脑,配置好浏览器,打开下面的测试地址:
https://www.baidu.com/img/bd_logo1.png

最好是,在2台电脑上进行,有IP 地址比较好分辩(没有2台电脑的用VM 也行)。

本机为 192.168.1.127 , Fiddler 为 192.168.1.121。

可以看到,本地在发送了一个 请求头后,直接和 192.168.1.121 进行了 TLS 协商。

可见 HTTPS 代理也是非常容易实现。

TCP 流:

或者使用 curl 进行测试,firefox 自带了很多垃圾请求,不太好分辨包。

可见 百度用的是 apache 的服务器。

建立一个 连接到目标站点的 https socket。

回复 HTTP/1.1 200 Connection Established

浏览器发过来 client hello ,转发给 https socket

普通的 HTTP 是 请求 响应模式。
而 HTTPS 是有可能 HTTPS 也会主动发送 tcp 数据包过来,如 server hello 。
所以实现上,还需要用到 select 来实现 fd 的检查工作。

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. import socket
  4. import sys
  5. import re
  6. import os
  7. import time
  8. import select
  9. import threading
  10.  
  11. HEADER_SIZE = 4096
  12.  
  13. host = '0.0.0.0'
  14. port = 8000
  15.  
  16. #子进程进行socket 网络请求
  17. def http_socket(client, addr):
  18. #创建 select 检测 fd 列表
  19. inputs = [client]
  20. outputs = []
  21. remote_socket = 0
  22. print("client connent:{0}:{1}".format(addr[0], addr[1]))
  23. while True:
  24. readable, writable, exceptional = select.select(inputs, outputs, inputs)
  25. try:
  26. for s in readable:
  27. if s is client:
  28. #读取 http 请求头信息
  29. data = s.recv(HEADER_SIZE)
  30. if remote_socket is 0:
  31. #拆分头信息
  32. host_url = data.split("\r\n")[0].split(" ")
  33. method, host_addr, protocol = map(lambda x: x.strip(), host_url)
  34. #如果 CONNECT 代理方式
  35. if method == "CONNECT":
  36. host, port = host_addr.split(":")
  37. else:
  38. host_addr = data.split("\r\n")[1].split(":")
  39. #如果未指定端口则为默认 80
  40. if 2 == len(host_addr):
  41. host_addr.append("")
  42. name, host, port = map(lambda x: x.strip(), host_addr)
  43. #建立 socket tcp 连接
  44. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  45. sock.connect((host, int(port)))
  46. remote_socket = sock
  47. inputs.append(sock)
  48. if method == "CONNECT":
  49. start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
  50. s.sendall("HTTP/1.1 200 Connection Established\r\nFiddlerGateway: Direct\r\nStartTime: {0}\r\nConnection: close\r\n\r\n".format(start_time))
  51. continue
  52. #发送原始请求头
  53. remote_socket.sendall(data)
  54. else:
  55. #接收数据并发送给浏览器
  56. resp = s.recv(HEADER_SIZE)
  57. if resp:
  58. client.sendall(resp)
  59. except Exception as e:
  60. print("http socket error {0}".format(e))
  61.  
  62. #创建socket对象
  63. http_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  64. try:
  65. http_server.bind((host, port))
  66. except Exception as e:
  67. sys.exit("python proxy bind error {0}".format(e))
  68.  
  69. print("python proxy start")
  70.  
  71. http_server.listen(1024)
  72.  
  73. while True:
  74. client, addr = http_server.accept()
  75. http_thread = threading.Thread(target=http_socket, args=(client, addr))
  76. http_thread.start()
  77. time.sleep(1)
  78.  
  79. #关闭所有连接
  80. http_server.close()
  81. print("python proxy close")

python urllib2 支持 自定义cookie的更多相关文章

  1. python urllib2模块携带cookie

    今天干活遇到一个事.有一些网站的一些操作非得要求你登陆才能做,比如新浪微博,你要随便看看吧,不行,非得让你登陆了才能看,再比如一些用户操作,像更改自己的资料啦,个人的隐私啦巴拉巴拉的.想抓取这样的ur ...

  2. python之路-----django 自定义cookie签名

    1.默认自定义cookie 在使用扩展签名时,会根据settings 配置中的  SIGNING_BACKEND 来运行加密方法,默认使用 django.core.signing.TimestampS ...

  3. python urllib2使用细节

    刚好用到,这篇文章写得不错,转过来收藏.    转载自 道可道 | Python 标准库 urllib2 的使用细节 Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节 ...

  4. python urllib2 模拟网站登陆

    python urllib2 模拟网站登陆 1. 可用浏览器先登陆,然后查看网页源码,分析登录表单 2. 使用python urllib2,cookielib 模拟网页登录 import urllib ...

  5. python urllib2详解及实例

    urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件.他以urlopen函数的形式提供了一个非常简单的接口, 这是具有利用不同协议获取URLs的能 ...

  6. python urllib2介绍

    urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件.他以urlopen函数的形式提供了一个非常简单的接口, 这是具有利用不同协议获取URLs的能 ...

  7. python urllib2使用心得

    python urllib2使用心得 1.http GET请求 过程:获取返回结果,关闭连接,打印结果 f = urllib2.urlopen(req, timeout=10) the_page = ...

  8. Python urllib2写爬虫时候每次request open以后一定要关闭

    最近用python urllib2写一个爬虫工具,碰到运行一会程序后就会出现scoket connection peer reset错误.经过多次试验发现原来是在每次request open以后没有及 ...

  9. Python爬虫入门:Cookie的使用

    大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...

随机推荐

  1. TF-IDF算法

    转自:http://www.cnblogs.com/eyeszjwang/articles/2330094.html TF-IDF(term frequency–inverse document fr ...

  2. Set

    package lis0924; //生成器导包 import java.util.HashSet; import java.util.Iterator; import java.util.Set; ...

  3. win7 、win10连接l2tpvpn

    win7:  修改vpn连接选项: win10: 参考连接: http://service.njaf.gov.cn/26970/26971/201510/t20151024_3621861.html ...

  4. 转 状态压缩DP

    引入 首先来说说“状态压缩动态规划”这个名称,顾名思义,状态压缩动态规划这个算法包括两个特点,第一是“状态压缩”,第二是“动态规划”. 状态压缩: 从状态压缩的特点来看,这个算法适用的题目符合以下的条 ...

  5. 判断pc端还是移动,并给移动加上其它的样式文件方法

      所有移动端PC端 按 640 进行排版 body, html { width: %; height: %; overflow: hidden; background-color: #; } bod ...

  6. php内网探测脚本&简单代理访问

    <?php $url = isset($_REQUEST['u'])?$_REQUEST['u']:null; $ip = isset($_REQUEST['i'])?$_REQUEST['i' ...

  7. spring security使用数据库管理用户权限

    <authentication-provider> <user-service> <user name="admin" password=" ...

  8. 布朗语料库中条件概率分布函数ConditionalFreqDist使用

    布朗语料库中使用条件概率分布函数ConditionalFreqDist,可以查看每个单词在各新闻语料中出现的次数.这在微博情感分析中非常有用,比如判断feature vector中代表positive ...

  9. BizTalk开发系列(二十一) Mapping 扩展开发

    BizTalk Map编辑器提供了常用的功能块,比如数据库,字符串,数字计算等功能.可在设计Map时直接使用这些功能块进行扩展.除此之外对于进行复杂的Map处 理,Map 编辑器提供了扩展XSLT,扩 ...

  10. logback使用总结

    filter: http://aub.iteye.com/blog/1110008 http://aub.iteye.com/blog/1101222 Logback Log4j的创始人Ceki Gü ...