适合级别:入门,中级

关键字   :python, http, GET, POST, 安全, 模拟, 浏览器, 验证码,图片识别, google

1 此文不是关于黑客或安全话题的!

2 使用脚本程序发送GET或POST,这是最简单也是最常见最频繁的事情之一;那为什么我还要YY一遍呢? 因为不只是熟能生巧,熟还能生出好多东西来呢,就看是和谁生!

3 我想有必要再次温习一遍HTTP协议及GET/POST请求相应内容与格式等基础知识的;不过我不会在此简述,希望你去看看那些诸如“当你使用浏览器打开一个URL,究竟发生了哪些事”这样的文章吧!

4 python发送GET/POST可能涉及的lib:  urllib, urllib2, cookielib ;至于其他的诸如处理HTML等不在本话题范围内:)

5 请求google.com的首页:

  1. >>> import urllib2
  2. >>> print urllib2.urlopen('http://google.com').read()

以上是hello world级别了;但geek程序员往往会通过此发现,打印出的东西,因URL而异 --- 废话,当然不是说内容,是指风格!!!  优秀的站点,其源码往往也在各个方面高一个水准,包括unicode编码、安全、性能等等方面。

下载GOOGLE的LOGO文件

  1. open('d:\\temp\\google-logo.gif','wb').write(urllib2.urlopen('http://www.google.com/images/logo_sm.gif').read())

6 模拟浏览器打开某个登录URL,并通过POST成功登录:

(1 这个问题的情况比较特殊,所以我打算写一个稍微全面点的,以尽可能涵盖常见情况,包括但不限于:cookies ,密码加密发送,https,简单验证码,ip限制,充分假装浏览器等等。

(2 POST请求发送的最小形式:

  1. >>> import urllib
  2. >>> import urllib2
  3. >>> import cookielib
  4. >>> cj = cookielib.CookieJar()
  5. >>> opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
  6. >>> opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')]
  7. >>> urllib2.install_opener(opener)
  8. >>> req = urllib2.Request("http://xxoo.com",urllib.urlencode({"username":"root","password":"ROOTXXOO"}))
  9. >>> req.add_header("Referer","http://xxoo.com")
  10. >>> resp = urllib2.urlopen(req)
  11. >>> print resp.read()

(3 一些注意事项或最佳实践:

A 是否因为cookie的问题而POST失败,最好使用真的浏览器登录,然后使用firebug这样的调试工具来查看实际的请求与响应头信息,以及cookie数据!

B 除了cookie之外,还有很多其他方法来达到一些安全或其他目的;cookie能保存的数据就4k,而且对客户端完全开放。

C 其实第一件重要的事情是阅读源码,肉眼解析出form及其action和参数等;搞清楚逻辑,再去模拟;但这一步往往是最开始的斗智斗勇阶段;有些程序员 总是使用小把戏来调戏你,比如追加无意义参数,追加随机数并命名为看上去像业务数据的变量等,还有人喜欢玩数学,比如搞质数运算等。

D 验证码问题:分很多种,有的程序员比较嫩,所以你可以分析下绕过;而一般的安全验证码,则需要你自己多请求一些验证码回来建库,做特征识别;至于很变态的验证码,建议你放弃这个思路,不要非去识别不可!

E 网上流传的discuz!模拟登录,其实都大多是理论;真正的程序都在那些专业发帖公司那里。

F 我本来想贴一个真实的代码出来,但是担心和谐问题,所以还是作罢!

7 熟练地掌握这些东西可以做什么?

答:这只是一种方式和途径,或者说一种小伎俩;做什么是你自己的事哦,能做什么就是方法本身的事了!!!低调地说,我用这个干过:刷票(投票的,刷 人气的,耍点击率的,抽奖的...);突破限制完全下载整站数据(区别于爬虫哦);专业数据库的数据COPY;其他不和谐的勾当。。。

8 其实只要你够geek,几乎能用curl搞定大多数问题。不过往往,我们更应该将精力放在解决问题上,而不是解决问题的工具上!

2011-6-7 更新

关于验证码的问题:

1 有很多很多的人都想搞这个验证码,比如想破解,比如想写机器人,等等

2 验证码的问题我觉得就两张思路: 绕过,识别; 其中绕过的条件是机制本身有漏洞,识别又分自动识别和人工识别

3 不是所有场合都一定需要破解验证码才能继续,比如有的时候只需要人工识别即可: 一个半自动化的机器人,在需要填写验证码时,把验证码图片给出(甚至可以发送到email或者手机上),人工识别并返回,机器人提交并继续工作 - 这是很理想也很底代价的方式之一 。

当然,如果你非要破解验证码不可,那就搞特征库并比对识别喽。具体思路也很简单,而且个人建议不要重头来写,用开源的即可:

1 大量读取验证码图片,建立原始数据库;

2 分析并提取特征,比如有的验证码图片很简单,就几个数字而已,你抓2W个图片拿下来分析一下,基本八九不离十了,都可以识别出;

3 程序里遇到验证码的时候,拿图片去特征数据库比对,得到结果。

4 主意事项:比如图片中字符的分隔,比如容错,比如干扰因素的排除,比如对于类似google验证码的那种扭曲等变换,就要麻烦了。。。

python发送GET或POST请求以便干一些趣事的更多相关文章

  1. python发送post和get请求

    python发送post和get请求 get请求: 使用get方式时,请求数据直接放在url中. 方法一. import urllib import urllib2 url = "http: ...

  2. python 发送post和get请求

    摘自:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201231085444250/ 测试用CGI,名字为test.py,放在ap ...

  3. 用python发送GET和POST请求

    GET请求: python2.7: import urllib,urllib2 url='http://192.168.199.1:8000/mainsugar/loginGET/' textmod ...

  4. Python发送get、post请求

    import json import requests #获取北京天气 # #url= "https://wis.qq.com/weather/common?source=xw&we ...

  5. [原创]利用python发送伪造的ARP请求

    #!/usr/bin/env python import socket s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW) s.bind((&qu ...

  6. python用httplib模块发送get和post请求

    在python中,模拟http客户端发送get和post请求,主要用httplib模块的功能. 1.python发送GET请求 我在本地建立一个测试环境,test.php的内容就是输出一句话: 1 e ...

  7. python发送HTTP POST请求

    1. 127.0.0.1和0.0.0.0 127.0.0.1是一个回送地址,指本地机,一般用来本机测试使用,使用127.0.0.1启的服务只能在本地机器上访问,使用0.0.0.0启的服务可以在其他机器 ...

  8. Python接口测试实战2 - 使用Python发送请求

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  9. Python发送http请求时遇到问题总结

    1.报错信息为“ERROR 'str' object has no attribute 'endwith'”,排查发现endswith方法名写错了,少了s,写成了 'endwith' if inter ...

随机推荐

  1. mybatis、ibatis 和spring集成

    mybatis是ibatis的升级版,spring也有自带mybatis的orm.所以,搭建ibatis的框架也会有多种方式(我这里mybatis是3.0的,ibatis是2.3的,spring是3. ...

  2. Python入门教程 超详细1小时学会Python

    Python入门教程 超详细1小时学会Python 作者: 字体:[增加 减小] 类型:转载 时间:2006-09-08我要评论 本文适合有经验的程序员尽快进入Python世界.特别地,如果你掌握Ja ...

  3. boa 服务的启动

    使用 buildroot 添加 boa 服务后,通过命令 boa 不能启动该服务,就研究了一下boa.conf的配置. etc/boa/boa.conf # 更改user 和Group 为root. ...

  4. [shell]system和execlp简单示例

    shell脚本:hello.sh #!/bin/bash echo "i am in shell script" echo "param 1 is $1" ec ...

  5. Android——Bundle savedInstanceState的作用

    写过Android程序的都知道Activity中有一个名称叫onCreate的方法.该方法是在Activity创建时被系统调用,是一个Activity生命周期的开始.可是有一点容易被忽视,就是onCr ...

  6. elasticsearch安装与使用(2)-- centos7 安装测试的集群工具elasticsearch head

    elasticsearch-head是elasticsearch(下面称ES)比较普遍使用的可监控.测试等功能的集群管理工具,是由H5编写的单独的网页程序.使用方法网上很多,这里教大家一个超简单安装h ...

  7. MongoDB(一):关系型数据库和非关系型数据库

    一.关系型数据库 1.概念 关系型数据库:是指采用了关系模型来组织数据的数据库,是目前各类数据库中使用最为广泛的数据库系统.简单的说,关系模型指的就是二维表格模型,一个关系型数据库就是由二维表及其之间 ...

  8. jquery1.7+里不能用checked获得checkbox的属性

    jquery1.7+以后用.attr('checked')得到的,都是undefined. 结论就是.attr()不能用于普通对象,数组,窗口,文档.要重新获取改变的dom属性,需要用.prop()方 ...

  9. android onTouchEvent

    触摸屏幕时,没搞懂每个事件的启动顺序.本文记录onTouchEvent发生时,每个事件启动的顺序. 测试代码 @Override public boolean onTouchEvent(MotionE ...

  10. 【cf492】D. Vanya and Computer Game(二分)

    http://codeforces.com/contest/492/problem/D 有时候感觉人sb还是sb,为什么题目都看不清楚? x per second, y per second... 于 ...