怎么在获取当前浏览器url里通过url使用POST方法

直接使用POST方法登录网站
浏览器在 POST 数据之后能够自动登录,那么我能不能在代码中直接模拟这个过程呢?
于是我设定了这样的一个流程
1. 设置浏览器的 headers, 设置请求等
2. 使用 httpfox 工具获取post data
3. 将post data 写下来并进行编码
4. 携带 headers 和 data 等信息进行网页请求
这里还是将获取post data 的过程截图出来,首先是登陆界面的网址:http://www.lvye.org/user.php
我们来看看headers和post data
大家可以看到,这里在post的后面还有一个url,这个url很重要,真的很重要,它就是的发送数据的真正网址
好了,这里的post data 也不是很多,我打算把它全部写下去,于是,我写了这样的代码
#!/usr/bin/env python
# -*- coding:UTF-8 -*-
使用post直接登陆
import urllib
import urllib2
url = "http://www.lvye.org/user.php"
user_agent = "Mozilla/5.0 (X11; U Linux x86_64; rv:39.0) Gecko/ Firefox/39.0"
referer = "http://www.lvye.org/user.php"
host = "www.lvye.org"
headers = {'User-Agent':user_agent,
'Referer':referer,
'Host':host}
data = {'uname':'xxxxxxxxxxx',
'xxxxxxxxxx',
'xoops_redirect':''}
post_data = urllib.urlencode(data)
request = urllib2.Request(url,headers=headers)
response = urllib2.urlopen(request,post_data)
print response.read()
然后我满心欢喜的等待输出结果......
这个页面源码是什么鬼,跟我们前面直接使用cookies获取到的页面源码不一样啊,为什么呢?难道我们的程序出错了吗?
其实并没有,我们的程序已经达到我我们想要的效果,它出现了一个我已经登陆的提示,就是图中框出来的那部分,但这又是为什么呢,而且这些字眼我好像在哪里看到过,为了找出这个原因,我又去重新登陆了一次
我们看到网址还是原来的网址,但是界面却是这样的,而且,这里的文字不就是跟源码里面的文字一样吗,那为什么会出现这样的情况呢?
我们知道当你输入用户名密码登陆一个网站的时候,页面会自动跳转到网站的主页或者其他的网页,总之不会停留在登陆的界面,这在浏览器中很容易实现,但是在爬虫代码中就很难实现,因为一发生跳转就是两个界面,也就是两个不同的url,但是在程序中不可能自动帮你跳转,所以必须要进行两次urlopen()操作,那我就在代码中进行两次urlopen()操作不行吗?来实践看看吧
由于 data 是发送给登陆界面的数据(前面已经讲解了怎么找post data 里面说有找对应的url的),所以我们在打开另一个url时不需要再携带data 信息了,只要在前面那段代码的基础上加上两句话就可以了
response2 = urllib2.urlopen("http://www.lvye.org/userinfo.php?uid=409557")
print response2.read()
我们来看输出结果
这还是没有返回登陆后的页面的源码,这是为什么呢?
这里详细讲两个问题
1. 为什么同样是 urlopen(),第一个携带data,而第二个却没有携带
前面我们已经说了,data 是post发送的数据,而这个发送的数据是有一个规定的url的,通过httpfox可以找的到,不是随便向哪个url发送都行的,所以上面那段的第一个url是登陆的网址,data数据要被发送到这个网址,而第二个url是网站里面的其他网址,不需要传入任何数据,所以不用写data参数,但是其实你加上来也不会报错,但是还是不能得出你想要的结果
2. 为什么上面的做法会失败
首先我们可以确定的是,我们post的方法是完全正确的,因为我们已经从源码中看到了现象,但是为什么我们连续使用两个urlopen()却没有成功呢,因为实际上上面的两个urlopen()只是把两个独立的操作合起来而已,这跟你在两个程序中分别打开这两个url的效果是一样的,不管是哪个urlopen(),它们都只是将网址打开,发送数据,然后获取返回的页面源码而已,它们并没有处理任何数据的能力,比如像cookies,我们前面也说过,因为urlopen()没有处理cookies和http验证的能力,所以要使用opener,这就是根本的原因,就像水过鸭背一样,执行完了就完了,并没有对数据进行处理,还是一样白搭,然并卵。
要解决这个问题只能使用cookies,先post数据到登陆的网址,然后使用cookielib获取cookies,再使用这个cookies登陆网站中其他的网页。因为登陆,获取cookies,使用cookies再次登陆这个是在同一个程序中运行的,处理器够快的话,充其量也就是几秒钟的事情,所以cookies的时效性可以不用考虑,好了,结合我们前面讲解的知识,我们将代码完成吧
#!/usr/bin/env python
# -*- coding:UTF-8 -*-
使用post直接登陆
import urllib
import urllib2
import cookielib
# 登陆界面的url
login_url = "http://www.lvye.org/user.php"
# 用户个人界面的url
user_url = "http://www.lvye.org/userinfo.php?uid=409557"
# 设置浏览器的headers信息
user_agent = "Mozilla/5.0 (X11; U Linux x86_64; rv:39.0) Gecko/ Firefox/39.0"
referer = "http://www.lvye.org/user.php"
host = "www.lvye.org"
headers = {'User-Agent':user_agent,
'Referer':referer,
'Host':host}
# 设置post 的数据
data = {'uname':'xxxxxxxxx',
'xxxxxxxxxxxxxx',
'xoops_redirect':''}
# 将数据编码成url查询字符串
post_data = urllib.urlencode(data)
# 初始化一个cookieJar来处理 cookies,CookieJar 这个类是获取cookies并保存
cookieJar = cookielib.CookieJar()
# 给opener加入cookies的处理程序
handler = urllib2.HTTPCookieProcessor(cookieJar)
# 构建一个opener
opener = urllib2.build_opener(handler)
# 构造请求
request = urllib2.Request(login_url,headers=headers)
# 打开登陆界面的url,并将data post出去,
login_response = opener.open(request,post_data)
# 自动携带cookies去访问用户界面的url
response = opener.open(user_url)
print response.read()
好了,现在用我们前面将的判断模拟登陆是否成功的方法来验证吧
没有更多推荐了,博客分类:
在开始讲解之前,我假设你已经对ajax的基本原理有一定的理解,如果还有哪位朋友不怎么了解的话,请点击
首先我们先讲解下post和get发送方式的特点,
GET 方法提交数据不安全,数据置于请求行,客户端地址栏可见;
GET 方法提交的数据大小限制在255 个字符之内。为了验证以上说法,我们接下来做个试验。首先看如下代码:
&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&
&title&test-get_post&/title&
&form name="Login" method="get" action="test.jsp"&
User ID: &input type="text" name="name"&&br&
Password: &input type="password" name="password"&
&input type="HIDDEN" name="from" value="welcome"&
&input type="submit" value="submit"&
接着我们输入一些数据,然后点击submit,如下图:
接下来我们再来看一下提交的这个http请求的详细信息:
由于上图我们可以看出,使用get方式发送的http请求,参数都是直接跟在URL后面清晰可见的,而且我们也不难看出,该http请求的body部分也是空的,只有head部分显示了一个http的基本信息。关于
GET 方法提交的数据大小是否限制在255 个字符之内,这里就不再做实验了,大家可以自己去实验。
接下来我们来看看POST 方法是如何提交数据的,POST方法提交的数据置于消息主体内,客户端不可见,
POST 方法提交的数据大小没有限制。我们对以上html稍做修改如下:
&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&
&title&test-get_post&/title&
&form name="Login" method="Post" action="test.jsp"&
User ID: &input type="text" name="name"&&br&
Password: &input type="password" name="password"&
&input type="HIDDEN" name="from" value="welcome"&
&input type="submit" value="submit"&
接着我们输入一些数据,然后点击submit,如下图:
接下来我们再来看一下提交的这个http请求的详细信息:
由上图我们可以看出,使用post方式发送的http请求,参数不是跟在URL后面的,而是存放在http请求的body部分的,关于请求参数在http请求body中存放的形式类似get方式,见下图:
在简单的讲述了get和post方式的特点后,我们正式进入正题,即如何以post形式向server发送ajax请求,在发送请求之前,第一个我们需要解决的问题就是如何去搜集并组织指定form表单中的数据。
一般来说form中存放数据的控件主要是&input&,而这个&input&type很多,如‘submit’,‘hidden’, ‘password’, ‘text’,‘checkbox’, ‘radio’等。因此第一步我们要做的就是先写一个方法,将将form中各种类型的&input&将数据值给抠出来。具体见如下代码:
//获取指定form中的所有的&input&对象
function getElements(formId) {
var form = document.getElementById(id);
var elements = new Array();
var tagElements = form.getElementsByTagName('input');
for (var j = 0; j & tagElements. j++)
elements.push(tagElements[j]);
接着我们需要获取每个input对象的name-value对,代码如下:
function inputSelector(element) {
if (element.checked)
return [element.name, element.value];
function input(element) {
switch (element.type.toLowerCase()) {
case 'submit':
case 'hidden':
case 'password':
case 'text':
return [element.name, element.value];
case 'checkbox':
case 'radio':
return inputSelector(element);
接着我们就可以将所有这些input对象中的name-value对以图1-5中POSTDATA那样的格式组织起来。代码如下:
function serializeElement(element) {
var method = element.tagName.toLowerCase();
var parameter = input(element);
if (parameter) {
var key = encodeURIComponent(parameter[0]);
if (key.length == 0)
if (parameter[1].constructor != Array)
parameter[1] = [parameter[1]];
var values = parameter[1];
var results = [];
for (var i=0; i&values. i++) {
results.push(key + '=' + encodeURIComponent(values[i]));
return results.join('&');
function serializeForm(formId) {
var elements = getElements(formId);
var queryComponents = new Array();
for (var i = 0; i & elements. i++) {
var queryComponent = serializeElement(elements[i]);
if (queryComponent)
queryComponents.push(queryComponent);
return queryComponents.join('&');
接下来我们来创建一个form表单,里面包含各种input控件,代码如下:
&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&
&%@page import="java.util.Enumeration"%&
&title&test-get_post&/title&
&script src="demo.js" type="text/javascript"&&/script&
&script type="text/javascript"&
var request = getXMLHttpRequest();
function getFormInfo() {
var postBody = serializeForm('Login');
var url = document.getElementById('Login').
request.open("post", url, true);
request.onreadystatechange = updateP
request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
request.send(postBody);
function updatePage() {
if (request.readyState == 4) {
if (request.status == 200) {
var response = request.responseT
alert(response);
alert("status is " + request.status);
&form id="Login" name="Login" method="post" action="result.jsp"&
User ID: &input type="text" name="name"&&br&
Password: &input type="password" name="password"&&br&
sex:&input type="radio" name="sex" value="man"& man &input type="radio" name="sex" value="woman"& woman&br&
interest:&input type="checkbox" name="interest" value="piu"&PIU &input type="checkbox" name="interest" value="dss"&DSS &input type="checkbox" name="interest" value="ddr"&DDR&br&
&input type="hidden" name="from" value="welcome"&&br&
&input type="button" name="submit" value="submit" onclick="getFormInfo();"&
另外值得注意的是,上述代码这句
request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
非常重要,没有这句的话,server就无法正常读取postdata中的任何数据,因为如果在 HTTP 流中传递空白和标点之类的字符,则它们在接收端可能会被错误地解释。URL 编码将 postdata 中不允许使用的字符转换为等效字符实体;URL 解码会反转此编码过程。例如,当嵌入到要在 URL 中传输的文本块中时,字符 & 和 & 分别被编码为 %3c 和 %3e。
接着我看一下接收端result.jsp的代码:
&?xml version="1.0" encoding="ISO-8859-1" ?&
&%@page import="java.util.Enumeration"%&
&%@ page language="java" contentType="text/ charset=ISO-8859-1" pageEncoding="ISO-8859-1"%&
String name = request.getParameter("name");
String pwd = request.getParameter("password");
String sex = request.getParameter("sex");
String[] interest = request.getParameterValues("interest");
String from = request.getParameter("from");
&validation&
&name&&%=name %&&/name&
&password&&%=pwd %&&/password&
&sex&&%=sex %&&/sex&
&interest&&%
for (int i=0; i&interest. i++)
out.print(interest[i] + " ");
%&&/interest&
&from&&%=from %&&/from&
&/validation&
最后,我们点击submit,看一下输出结果:
到这里就差不多结束了,希望这篇文章能给大家带来一些帮助和启发,谢谢大家观赏。最后附上源码:
描述: 示例源码下载
下载次数: 413
浏览 84856
我注意到了3个细节:处理了组件重名,如name="interest";&!--//& //--& 兼容不识别代码的浏览器;result.jsp:&?xml version="1.0" encoding="ISO-8859-1" ?& 告诉浏览器以xml解释内容。& 另外读这篇文章我们可以考虑以Servlet来实现响应。哎,我理解 处理了组件重名,如name="interest" 理解错了,我以为一次性获得name="interest"的所有元素的值哦,结果还是一个一个元素处理的
flyingfish42 写道
请问楼主用的是什么工具?
这个是firefox下的一个小插件 叫tamper data 简单实用说明可看这篇blog
http://.iteye.com/blog/656504
请问楼主用的是什么工具?这个是firefox下的一个小插件 叫tamper data 简单实用说明可看这篇bloghttp://.iteye.com/blog/656504
马背上 写道var request& = obj.是什么意思我运行,提示“target为空或不是对象”lz回的稍微有点晚,我已经试出来啦,不过还是谢谢啦,不过我还是不明白var request& = obj.是什么意思,target指的是什么啊,是form的那个target属性吗,obj对象指的又是什么呢马背上 写道马背上 写道var request& = obj.是什么意思我运行,提示“target为空或不是对象”lz回的稍微有点晚,我已经试出来啦,不过还是谢谢啦,不过我还是不明白var request& = obj.是什么意思,target指的是什么啊,是form的那个target属性吗,obj对象指的又是什么呢其实 在firefox浏览器中 当http响应返回的时候,浏览器端的 XMLHttpRequest对象会调用事先我们设置好的回调方法,在这里我们可以模拟一下这个情形:var request& = getXMLHttpRequest();Object eventObj = new Objct();eventObj.target =设置其他相关属性eventObj.xx=..eventObj.yy=..//当响应抵达浏览器时,浏览器自动调用类似以下代码request.onreadystatechange(eventObj);所以在回调方法中,其实 我们可以用this代替request,因为是request对象调用该回调方法的,所以我们的回调方法可以这么写:function updatePage(obj) {//这里的obj就是我们上面伪代码中的eventObj,因此我们可以obj.target调用 if (this.readyState == 4) { if (this.status == 200) { var response = this.responseT&&&&&&&&&&&&&&&
alert(response); } else
alert("status is " + this.status); }}
var request& = obj.是什么意思
我运行,提示“target为空或不是对象”
lz回的稍微有点晚,我已经试出来啦,不过还是谢谢啦,不过我还是不明白var request& = obj.是什么意思,target指的是什么啊,是form的那个target属性吗,obj对象指的又是什么呢
var request& = obj.是什么意思我运行,提示“target为空或不是对象”这个是我一点疏忽,我只在FF浏览器下做了实验,没考虑到IE,那索性把XMLHttpRequest放全局变量吧,改成这样就可以了var request = getXMLHttpRequest();function getFormInfo() { var postBody = serializeForm('Login'); var url = document.getElementById('Login'). request.open("post", url, true); request.onreadystatechange = updateP // request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); request.send(postBody);}function updatePage() { if (request.readyState == 4) { if (request.status == 200) { var response = request.responseT
alert(response); } else
alert("status is " + request.status); }}
if (element.checked)
element.checked 是什么意思?
因为checkbox 和 radio 等input控件是多选或者单选的 所以我们要取的的是客户选择后的值 也就是 checked后的那些value,所以不能直接像& text hidden等那样直接就去value,不然我们就有可能把用户没有checked的那些value也加进来,这显然是不对的,所以 对于这类控件就需要判断一下用户选择哪些值。
var url = document.getElementById('Login').&&
.action是什么意思?
等同于
&form action="xxx.jsp"&
设置form的action属性
& 上一页 1
传说の黄花菜
浏览: 178838 次
来自: 杭州
强烈顶贴……非常感谢楼主……
好文章,谢谢!~
另外关于Tamper Popup插件,我没有用这个插件。
&div class=&quote_title ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'有接口url地址,POST请求方式,如何取到数据?谢大神
[问题点数:40分,无满意结帖,结帖人guke2012]
本版专家分:0
结帖率 85.71%
CSDN今日推荐
本版专家分:7177
2015年3月 PHP大版内专家分月排行榜第三2015年2月 PHP大版内专家分月排行榜第三
本版专家分:30
本版专家分:0
结帖率 85.71%
匿名用户不能发表回复!|
CSDN今日推荐HTTP 方法:GET 对比 POST
HTTP 方法:GET 对比 POST
两种最常用的 HTTP 方法是:GET 和 POST。
什么是 HTTP?
超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。
HTTP 的工作方式是客户机与服务器之间的请求-应答协议。
web 浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。
举例:客户端(浏览器)向服务器提交 HTTP 请求;服务器向客户端返回响应。响应包含关于请求的状态信息以及可能被请求的内容。
两种 HTTP 请求方法:GET 和 POST
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
/test/demo_form.asp?name1=value1&name2=value2
有关 GET 请求的其他一些注释:
GET 请求可被缓存
GET 请求保留在浏览器历史记录中
GET 请求可被收藏为书签
GET 请求不应在处理敏感数据时使用
GET 请求有长度限制
GET 请求只应当用于取回数据
请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
有关 POST 请求的其他一些注释:
POST 请求不会被缓存
POST 请求不会保留在浏览器历史记录中
POST 不能被收藏为书签
POST 请求对数据长度没有要求
比较 GET 与 POST
下面的表格比较了两种 HTTP 方法:GET 和 POST。
后退按钮/刷新
数据会被重新提交(浏览器应该告知用户数据会被重新提交)。
可收藏为书签
不可收藏为书签
application/x-www-form-urlencoded
application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。
参数保留在浏览器历史中。
参数不会保存在浏览器历史中。
对数据长度的限制
是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。
对数据类型的限制
只允许 ASCII 字符。
没有限制。也允许二进制数据。
与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。
在发送密码或其他敏感信息时绝不要使用 GET !
POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
数据在 URL 中对所有人都是可见的。
数据不会显示在 URL 中。
其他 HTTP 请求方法
下面的表格列出了其他一些 HTTP 请求方法:
与 GET 相同,但只返回 HTTP 报头,不返回文档主体。
上传指定的 URI 表示。
删除指定资源。
返回服务器支持的 HTTP 方法。
把请求连接转换到透明的 TCP/IP 通道。博客分类:
最近在做的一个东西,里面有需求需要在mouseover时间后,向服务端发送一次ajax请求。但最后发现某些浏览器,当鼠标即使停留在dom元素边上某个位置时,竟然连续不断的触发mouseover这个事件,于是干脆对ajax请求做了cache,在一定时间内的同一个url的相同参数的请求,使用以前缓存下来的数据,而不影响服务端。
扩展jQuery的$.post,实现ajax请求缓存的ajaxHelper的代码:
var ajaxHelper = function(){
var _postCache = {};
var _postQueue = {};
post : function( url, data, callback, type, o ){
o = $.extend({
life : 1 // default is 1 second
if ( $.isFunction( data ) ) {
type =// fix the bug in $.post
callback =
data = {};
var key = '{0},{1},{2}'.format(url, type, $.param(data));
var now = +new D
var item = _postCache[key];
// the Javascript Date.getTime() return as millisecond.
if( item && now-item.birthday&o.life*1000 )
console.log('read from cache');
callback(item.data);
console.log('miss cache')
if( _postQueue[key] && _postQueue[key].length&0 ){
_postQueue[key].push(callback);
_postQueue[key] = [callback];
$.post(url, data, function(data){
_postCache[key] = {birthday:now, data:data};
var queue = _postQueue[key],
while( f=queue.shift() )
测试代码:
$(function(){
$('#test').click(function(){
function test(i){
ajaxHelper.post('json.php', function(data){
console.log('The {0} times, and name is {1}'.format(i, data.name));
}, 'json');
for(var i=0;i&3;i++)
HTML页面内容:
&input id="test" type="button" value="测试" /&
测试结果:
POST http://approach.local/json.php
The 0 times, and name is Superman
The 1 times, and name is Superman
The 2 times, and name is Superman
可以看到,虽然调用了3次方法,但实际上只发出了一次请求(默认缓存时间是1s内)。
论坛回复 /
(5 / 3312)
onmouseover 多次触发是由于标签onmouseover后进行了偏移设置,如果鼠标正好处在边界处,就会在偏移的时候失去焦点,触发onmouseout,然后,标签又偏移回去,就这样反复的
onmouseover onmouseout onmouseover .......
确实烦人.
取消onmouseover标签进行偏移是一个简单的方法
不过话说会来,
cache确实是有必要加的.
浏览: 158066 次
来自: 北京
您好,我在用 MariaDB,连接字符串的DSN怎么写?
&div class=&quote_title ...
楼主这样做的话比较麻烦,造成这种情况是因为浏览器缓存的问题(在 ...
表示都进入并均未退出,‘重入’应该更合适一些
&可重入&似乎还真的不太贴切啊,我觉得叫& ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 获取浏览器url 的文章

 

随机推荐