python urllib2 支持 自定义cookie
首先需要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 的检查工作。
#!/usr/bin/env python
#coding:utf-8
import socket
import sys
import re
import os
import time
import select
import threading HEADER_SIZE = 4096 host = '0.0.0.0'
port = 8000 #子进程进行socket 网络请求
def http_socket(client, addr):
#创建 select 检测 fd 列表
inputs = [client]
outputs = []
remote_socket = 0
print("client connent:{0}:{1}".format(addr[0], addr[1]))
while True:
readable, writable, exceptional = select.select(inputs, outputs, inputs)
try:
for s in readable:
if s is client:
#读取 http 请求头信息
data = s.recv(HEADER_SIZE)
if remote_socket is 0:
#拆分头信息
host_url = data.split("\r\n")[0].split(" ")
method, host_addr, protocol = map(lambda x: x.strip(), host_url)
#如果 CONNECT 代理方式
if method == "CONNECT":
host, port = host_addr.split(":")
else:
host_addr = data.split("\r\n")[1].split(":")
#如果未指定端口则为默认 80
if 2 == len(host_addr):
host_addr.append("")
name, host, port = map(lambda x: x.strip(), host_addr)
#建立 socket tcp 连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, int(port)))
remote_socket = sock
inputs.append(sock)
if method == "CONNECT":
start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
s.sendall("HTTP/1.1 200 Connection Established\r\nFiddlerGateway: Direct\r\nStartTime: {0}\r\nConnection: close\r\n\r\n".format(start_time))
continue
#发送原始请求头
remote_socket.sendall(data)
else:
#接收数据并发送给浏览器
resp = s.recv(HEADER_SIZE)
if resp:
client.sendall(resp)
except Exception as e:
print("http socket error {0}".format(e)) #创建socket对象
http_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
http_server.bind((host, port))
except Exception as e:
sys.exit("python proxy bind error {0}".format(e)) print("python proxy start") http_server.listen(1024) while True:
client, addr = http_server.accept()
http_thread = threading.Thread(target=http_socket, args=(client, addr))
http_thread.start()
time.sleep(1) #关闭所有连接
http_server.close()
print("python proxy close")
python urllib2 支持 自定义cookie的更多相关文章
- python urllib2模块携带cookie
今天干活遇到一个事.有一些网站的一些操作非得要求你登陆才能做,比如新浪微博,你要随便看看吧,不行,非得让你登陆了才能看,再比如一些用户操作,像更改自己的资料啦,个人的隐私啦巴拉巴拉的.想抓取这样的ur ...
- python之路-----django 自定义cookie签名
1.默认自定义cookie 在使用扩展签名时,会根据settings 配置中的 SIGNING_BACKEND 来运行加密方法,默认使用 django.core.signing.TimestampS ...
- python urllib2使用细节
刚好用到,这篇文章写得不错,转过来收藏. 转载自 道可道 | Python 标准库 urllib2 的使用细节 Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节 ...
- python urllib2 模拟网站登陆
python urllib2 模拟网站登陆 1. 可用浏览器先登陆,然后查看网页源码,分析登录表单 2. 使用python urllib2,cookielib 模拟网页登录 import urllib ...
- python urllib2详解及实例
urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件.他以urlopen函数的形式提供了一个非常简单的接口, 这是具有利用不同协议获取URLs的能 ...
- python urllib2介绍
urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件.他以urlopen函数的形式提供了一个非常简单的接口, 这是具有利用不同协议获取URLs的能 ...
- python urllib2使用心得
python urllib2使用心得 1.http GET请求 过程:获取返回结果,关闭连接,打印结果 f = urllib2.urlopen(req, timeout=10) the_page = ...
- Python urllib2写爬虫时候每次request open以后一定要关闭
最近用python urllib2写一个爬虫工具,碰到运行一会程序后就会出现scoket connection peer reset错误.经过多次试验发现原来是在每次request open以后没有及 ...
- Python爬虫入门:Cookie的使用
大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...
随机推荐
- 学习bootstrap心得
Bootstrap 使用了一些 HTML5 元素和 CSS 属性.为了让这些正常工作,您需要使用 HTML5 文档类型(Doctype). 因此,请在使用 Bootstrap 项目的开头包含下面的代码 ...
- [LintCode] Longest Consecutive Sequence 求最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. H ...
- Hibernate反向工程在javaweb下的操作配置
1.在javaEE下新建项目,在WEB-INF的lib文件夹下添加所用到的jar包. 2.创建Hibernate 主配置文件 文件----新建----其他下的Hibernate目录,如图: 下一步,注 ...
- Centos 安装了 Wkhtmltopdf 却依旧显示 无法打印pdf
Odoo里判断wkhtmlpdf是否安装的代码在 openerp/tools/misc.py 文件中: def find_in_path(name): path = os.environ.get('P ...
- Spark Kill Application
yarn application -kill <applicationId>
- Javascript杂记(一)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 复选框,:checked
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- SQL,LINQ,Lambda语法对照图(转载)
如果你熟悉SQL语句,当使用LINQ时,会有似曾相识的感觉.但又略有不同.下面是SQL和LINQ,Lambda语法对照图 SQL LINQ Lambda SELECT * FROM HumanReso ...
- php课程---数组建立表单
<?php $nation = array( array('n001','汉族'), array('n002','汉族'), array('n003','满族'), array('n004',' ...
- 【转】解决jsp参数传递乱码的问题
解决jsp参数传递乱码的问题 计算机生于美国,英语是他的母语,而英语以外的其它语言对他来说都是外语.他跟我们一样,不管外语掌握到什么程度,也不会像母语那样使用得那么好,时常也会出一些“拼写错误”问题. ...