Python模拟HttpRequest的方法总结
Python可以说是爬网的利器,本文主要介绍了一些python来模拟http请求的一些方法和技巧。
Python处理请求的类库有两个,urllib,urllib2。 这两个类库并不是一个类库的两个不同版本,urllib主要用来处理一些url相关的内容,发送请求的时候,请求对象只能是一个url。urllib2可以用request对象来实现请求,这样就可以实现如伪造头部,设置代理,http get,http post等方法。
阅读本文需要了解http请求的一些基本知识,如:
- 什么是httpwebrequest,httpwebresponse
- 什么是get,post
- 什么是cookie
本文主要介绍模拟请求用到的这些方式:
- 设置代理
- 伪造头部或者Header信息
- 启用cookie
- url参数的处理
使用urllib2.urlopen直接发送
import urllib2 url = 'http://www.baidu.com/'
response = urllib2.urlopen(url) ##urlopen接受传入参数是string或者是request
response_text = response.read()
使用urllib.build_opener
直接发送请求
import urllib2 url = 'http://www.baidu.com/' opener = urllib2.build_opener()
response = opener.open(url)
response_text = response.read()
通过代理访问站点
proxy_handler = urllib2.ProxyHandler({"http" : 'http://localhost:8888'})
opener = urllib2.build_opener(proxy_handler)
response = opener.open(url)
response_text = response.read()
请求中附带request body(http post)
opener = urllib2.build_opener()
response = opener.open(url,'request body')
response_text = response.read()
body中如果是key-value形式的,可以参照下面的url处理部分来处理
启用Cookie
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(url)
response_text = response.read()
使用urllib2.Request
请求中添加自定义的Header信息
request = urllib2.Request(url)
request.add_data('')
request.add_header('User-Agent', 'fake-client')
response = urllib2.urlopen(request)
处理url中的参数信息
无论是使用get方式还是post方式,经常会遇到需要使用参数的形式,处理参数可以使用下面的类库
参数集合转string
para = {'':'','aaa':'bbb'}
encodeurl = urllib.urlencode(para)
输出aaa=bbb&111=222
url参数转dictionary
url = 'https://www.baidu.com/s?wd=python%20url%20querystring&pn=10&oq=python%20url%20querystring&tn=baiduhome_pg&ie=utf-8&usm=1&rsv_idx=2&rsv_pq=d09af93600035cb8&rsv_t=d151qRmNNdybGINHcKbyO360E2%2Fg%2FUs2t0MiKqRQXwhHZuNF3IlKyyStzYuofVZczQA3' splitresult_instance = urlparse.urlsplit(url)
输出对象:
SplitResult(scheme='https', netloc='www.baidu.com', path='/s', query='wd=python%20url%20querystring&pn=10&oq=python%20url%20querystring&tn=baiduhome_pg&ie=utf-8&usm=1&rsv_idx=2&rsv_pq=d09af93600035cb8&rsv_t=d151qRmNNdybGINHcKbyO360E2%2Fg%2FUs2t0MiKqRQXwhHZuNF3IlKyyStzYuofVZczQA3', fragment='')
想转成集合只要
result_dic=urlparse.parse_qs(splitresult.query)
通过这种处理方式,把data信息放在url上来实现http get,放在body中实现http post。
此文同时托管在了 http://simmon.club/blog/Python-HttpRequest/ 上
Python模拟HttpRequest的方法总结的更多相关文章
- python模拟鼠标拖动操作的方法
本文实例讲述了python模拟鼠标拖动操作的方法.分享给大家供大家参考.具体如下: pdf中的书签只有页码,准备把现有书签拖到一个目录中,然后添加自己页签.重复的拖动工作实在无趣,还是让程序帮我实现吧 ...
- 【Python数据分析】Python模拟登录(一) requests.Session应用
最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学 ...
- 菜鸟初识python request属性及方法说明
if request.REQUEST.has_key('键值'): HttpRequest对象的属性 参考: 表 H-1. HttpRequest对象的属性 属性 描述 path 表示提交请求页面完 ...
- python request属性及方法说明
if request.REQUEST.has_key('键值'): HttpRequest对象的属性 参考: 表 H-1. HttpRequest对象的属性 属 性 描述 path 表示提 ...
- python 模拟浏览器
想用python模拟浏览器访问web的方法测试些东西,有哪几种方法呢? 一类:单纯的访问web,不解析其js,css等. 1. urllib2 #-*- coding:utf-8 -* import ...
- [转] python程序的调试方法
qi09 原文 python程序的调试方法 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序 源码例子 例如,有模拟税收计算的程序: #!/usr/bin/python de ...
- 芝麻HTTP:JavaScript加密逻辑分析与Python模拟执行实现数据爬取
本节来说明一下 JavaScript 加密逻辑分析并利用 Python 模拟执行 JavaScript 实现数据爬取的过程.在这里以中国空气质量在线监测分析平台为例来进行分析,主要分析其加密逻辑及破解 ...
- Python模拟登陆万能法-微博|知乎
Python模拟登陆让不少人伤透脑筋,今天奉上一种万能登陆方法.你无须精通HTML,甚至也无须精通Python,但却能让你成功的进行模拟登陆.本文讲的是登陆所有网站的一种方法,并不局限于微博与知乎,仅 ...
- Python模拟弹道轨迹
http://www.itongji.cn/cms/article/articledetails?articleid=5029 最近美国把萨德系统部署到韩国,一时心血来潮就用python模拟最简单的弹 ...
随机推荐
- SGIP、SMGP 长短信发送问题小结
长短信发送问题.1.将信息长度拆开发送.2.为了解决长短信拆分发送,在手机终端,收到的顺序错乱,所以在每一段短信发送完成后,延时5秒,这样在手机终端客户收到的信息,就会按照拆分的顺序发送. //信息总 ...
- Git 版本管理的简单理解
来源:百度知道 现在使用Git版本管理代码的项目非常多.但是Git本身是一条复杂的系统.我从几个简单的点来说明Git的基本功能.希望能帮助初学者快速入门. 工具/原料 Git code dot j ...
- Servlet读取Excel标准化数据库过程记录
完成数据库的连接 获取连接参数 拷贝1.数据库URL 2.驱动程序类 3.用户 编写Servlet 1.创建连接对象 Connection con = null; PreparedStatement ...
- 微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项
<!--禁用微信分享按钮--> <script> function onBridgeReady() { WeixinJSBridge.call('hideOptionMenu' ...
- Git 基本概念及常用命令
一.基本概念 文件的三种状态:(任何一个文件在git中都有以下三种状态) 1) 已提交(committed):表示该文件已经被安全地保存在本地数据库中了. 2) 已修改(modified):表示修改了 ...
- oracle中row_number和rownum的区别和联系(翻译)
http://www.tuicool.com/articles/bI3IBv 附问题:有以下一个SQL语句: SELECT * FROM ( SELECT t.*, row_number() OVER ...
- Java 数列求和
编写程序,显示1+2+3+4+5+6+7+8+9的结果 public class Homework006 { public static void main(String[] args) { int ...
- [翻译svg教程]svg 中的g元素
svg 中的<g>元素用来组织svg元素.如果一组svg元素被g元素包裹了,你可以通过对g元素进行变换(transform),被g元素包裹的元素也将被变换,就好这些被svg包裹的元素是一个 ...
- js 判断浏览器和ie版本号 收集
function testB () { // body... var isOpera = !!window.opera ||!!window.opr|| navigator.userAgent.ind ...
- jquery 获取奇数索引的元素
$(".btn-xs:odd").click(function(){ var $buy_num=$(this).prev("#buy_num").val(); ...