python3 爬虫 登录爬虫模拟登录是什么意思

2728人阅读
ExTJS(167)
原文:作者:可能要处理的情况:success(成功)——Ext处理failure(失败),由于通讯问题——Ext处理failure(失败),由于服务器端异常——开发人员人员必须处理的响应失败……解决方案一:在应用程序控制器中编写以下方法: //Ajax Response Error Handler
Ext.Ajax.on('requestexception', function(conn, response, options, eOpts) {
var error = response.status + ' - ' + response.statusT
console.log('Ajax Request Exception! '+error);
if (response.status != 200) {
var errorData = Ext.JSON.decode(response.responseText);
console.log('ajax req error:'+errorData.message);
console.log('Ajax request Error', response.status);
});解决方案二:当在服务器端发生异常时,可以将500作为响应标头,原因作为HTML内容发送回客户端。store.on('loadexception',
function(a,conn,resp) {
if (resp.status == '304') {
Ext.Msg.alert('Content has not changed');
}else if(resp.status == '200') {
//Do nothing
}else if (resp.status == '401') {
Ext.Msg.alert('Authentication required - You need to Login');
}else if (resp.status == '302') {
errorDialog.body.update('Session Has Expired');
errorDialog.show();
}else if(resp.status == '500') {
errorDialog.body.update(resp.responseText);
errorDialog.show();
errorDialog.body.update('An uncaught exception has occured');
errorDialog.show();
}解决方案三:当发送Ajax或REST请求时,Ext JS 4代理通常会预期返回的信息包括参数:data、success和message。参数message是可选的,不过当需要将请求结果显示给用户的时候,它就可派上用场了。function requestMessageProcessor(proxy, response) {
if (response && proxy) {
var responseData = proxy.reader.getResponseData(response);
if (responseData.message) {
var messageDescription = 'Information'; // title of the alert box
var messageIcon = ;
if (!responseData.success)
var messageDescription = 'Error';
var messageIcon = Ext.MessageBox.ERROR;
Ext.MessageBox.show({
title: messageDescription,
msg: responseData.message,
buttons: Ext.MessageBox.OK,
icon: messageIcon
catch(err) {
// Malformed response most likely
console.log(err);
And here’s the part which should reside in proxy:
listeners: {
exception: function(proxy, response, options) {
requestMessageProcessor(proxy, response);
afterRequest: function(request, success) {
requestMessageProcessor(request.scope, request.operation.response);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1437716次
积分:16026
积分:16026
排名:第566名
原创:143篇
转载:28篇
译文:100篇
评论:2163条
(已升级)
阅读:17137
文章:22篇
阅读:78331
文章:29篇
阅读:132996
(1)(1)(4)(1)(1)(1)(1)(2)(7)(7)(7)(3)(2)(1)(2)(3)(2)(3)(4)(5)(3)(9)(5)(2)(4)(6)(3)(2)(1)(1)(3)(3)(4)(7)(2)(4)(4)(8)(4)(12)(2)(4)(8)(2)(3)(2)(2)(1)(3)(3)(3)(1)(1)(4)(7)(8)(5)(3)(8)(2)(1)(2)(1)(1)(1)(1)(2)(4)(1)(1)(2)(2)(2)(2)(4)(1)(3)(1)(5)(4)(1)(1)(1)(1)(1)(1)(1)(2)(1)(3)关于SharePoint REST中的授权的研究 - 博客频道 - CSDN.NET
专注.NET SharePoint
分类:SharePoint fragment
当我们开发SharePoint APP需要调用REST服务时,可以使用OAuth完成授权,也可以使用跨域库。以下是微软专家的一段注解。如果是从无法以独占方式使用客户端代码(HTML 和 JavaScript)的远程托管应用程序调用 SharePoint,且 SharePoint 与应用程序之间没有防火墙阻隔,则可使用 OAuth 2.0 令牌(使用 Microsoft 访问控制服务 (ACS) 作为安全令牌服务器)。如果客户端代码和登录到 SharePoint 的用户的权限足够,则 JavaScript 跨域库 () 将是一个很好的 OAuth 替代品。&另外,当进程调用需要穿过防火墙时,跨域库也是替代 OAuth 的一个好选择。&MSDN 库文章“SharePoint 2013 数据访问选项”() 详细介绍了这些选项。但是这些主要都是针对SharePoint App来说的,当我们在我们自己的应用(如第三方网站、移动设备等)中要通过REST获取sharepoint的内容时,要如何做呢?笔者做了以下一些研究,但是没有得出最终解决方案,前一阵请教过Jason Huang,后来也没有音信了。欢迎大牛能进行指点,也欢迎大家多多讨论。我先描述一下大致的场景:远程SharePoint网站,采用NTLM协议的认证。我要做的就是通过调用REST服务来获取数据。本文以命令行程序作为示例,访问SharePoint的内容。一.&采用网络请求(WebRequest)的方式HttpWebRequest request = (HttpWebRequest)WebRequest.Create(&https://ap.2013./_api/web/&);
request.Accept = &application/odata=verbose&;
NetworkCredential myCredential = new NetworkCredential(&Justin.Liu1&, &3QF0\&gn&, &EXT&);
request.Credentials = myC
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string content = sr.ReadToEnd();这个方式获得了我需要的数据,抓包可以看到网络请求的过程如下:基本的流程大致如下:先去敲门,远程SharePoint回应“我在”;然后用提供的凭据去进行验证,验证通过后返回认证通过的编码串;通过这个编码串再去请求需要的数据,远程SharePoint认证通过会返回请求的数据。二.&采用客户端对象模型CSOM的方式NetworkCredential myCredential = new NetworkCredential(&Justin.Liu1&, &3QF0\&gn&, &EXT&);
ClientContext ctx = new ClientContext(&https://ap.2013./&);
ctx.Credentials = myC
Web web = ctx.W
ctx.Load(web);
ctx.ExecuteQuery();
string title = web.T这种方式也获得了我需要的数据,来看一下抓包得到的过程:从中我们可以看到,CSOM实际上是封装了SharePoint的WebService。三.&采用调用SharePoint WebService的方式//Site URL: https://ap.2013.
//Username: EXT\Justin.Liu1
//Password: 3QF0&gn
var soapEnv = string.Format(@&&?xml version=&&1.0&& encoding=&&utf-8&&?&
&soap:Envelope xmlns:xsi=&&http://www.w3.org/2001/XMLSchema-instance&& xmlns:xsd=&&http://www.w3.org/2001/XMLSchema&& xmlns:soap=&&http://schemas.xmlsoap.org/soap/envelope/&&&
&soap:Body&
&Login xmlns=&&/sharepoint/soap/&&&
&username&{0}&/username&
&password&{1}&/password&
&/soap:Body&
&/soap:Envelope&&,&EXT\\Justin.Liu1&,&3QF0\&gn&);
byte[] data = Encoding.UTF8.GetBytes(soapEnv);
HttpWebRequest loginRequest = (HttpWebRequest)WebRequest.Create(&https://ap.2013./_vti_bin/Authentication.asmx&);
loginRequest.Headers[&SOAPAction&] = &/sharepoint/soap/Login&;
loginRequest.Method = &POST&;
loginRequest.ContentType = &text/ charset=utf-8&;
loginRequest.ContentLength = data.L
Stream requestStream = loginRequest.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
WebResponse loginResponse = loginRequest.GetResponse();
Stream loginStream = loginResponse.GetResponseStream();
StreamReader lsr = new StreamReader(loginStream);
string loginContent = lsr.ReadToEnd();
requestStream.Close();该方式并没有成功,报出401未授权的错误:&我为什么尝试第三种方式,因为在移动设备中应该是无法应用前两种方式的。以上便是之前研究的总结,由于有其他事情暂且搁置在此并分享出来,希望对朋友们能起到抛砖引玉的作用,也欢迎共同探讨解决方案。
排名:第3726名
专注于.NET, 尤其是SharePoint平台的技术
(10)(1)(13)(26)(17)(24)(23)(54)(4)(5)(1)(1)(11)(16)(20)关于 Extjs 版权问题的认识 - 快乐的牛? - ITeye技术网站
1.extjs作为一个js类库,采用gpl协议显然是不太合理的。因为只要你的代码继承了一个类,就算你修改了源代码,你的继承类的代码就必须公开:
The following are examples of modifications:
Modify Ext JavaScript, Java or CSS source file
Extend Ext class or override any Ext functions or methods
Modifying an Ext API
来自 extjs open source faq
继承对于OOP来说,是很重要的。看看jquery,支持MIT协议,多么友好。
2.开源社区将不会积极贡献代码、bug、翻译文档等等给extjs,因为你努力贡献给他,他却拿去卖钱了,因为他可以给别人商业授权。--而你,到头来还得向他买许可。因此主要的开发人员是extjs公司自己。你用它的代码,就得按它的规矩来,这没什么好说的。他们觉得这是更好的生存之道,但是对extjs产品来说,得不到开源社区的支持,将来的发展很有挑战。
3.对于国内大部分开发人员来说,我觉得不是很重要。给别人定制开发一套系统,你就把代码给他看吧,注释全部去掉,开发文档也不给他,一般没什么的。
4.假如你的公司开发了一款商业软件,很牛,建议前后台封装好,比如extjs只是用来画界面的,这部分代码,跟后台交互全部用rest的方式,将它开源出去,免费。后台代码再单独销售。这样就没问题了。
5.假如你开发了一款产品,如operamasks之类的,本来主要功能就是做界面的,你可以开源出来,做技术支持挣钱;或者付给extjs授权费,然后向你的客户收钱。--这样的产品基本上不会存在,extjs基本上不需要这样的封装。
6.开发供公司内部使用的系统,不受gpl限制,可以随便使用。就好像你只是学习extjs,开发软件自己用,没有人会限制你。
浏览: 52629 次
多谢楼主,参考后个人写的实例:http://www.itdat ...
强大,学习了。
配置Http Server时,Publishing Direc ...上次发了Easyui Datagrid的增删改查的使用学习记录后一直想整理下基于Extjs4.2的Grid学习使用记录。苦于抽不出时间,一直拖到现在。不得不说,Extjs确实很强大,新版的Neptune风格也很入我眼,但毕竟没怎么用过,第一次用,也不敢上来就搞什么自定义组件,也就纯粹的model+store+panel声明式创建表格了。
抛开分页,抛开排序,今天只简单讲一下最近使用中总结出来的rest形式增删改查数据的方式。发现这种方式挺不错的,故而分享下。
代码Example如下:
Ext.define('Person', {
extend: 'Ext.data.Model',
fields: [{name: 'id',
type: 'int',
useNull: true
}, 'email', 'first', 'last'],
validations: [{ type: 'length',
field: 'email',
}, {type: 'length',
field: 'first',
}, {type: 'length',
field: 'last',
构造store、创建panel
var store = Ext.create('Ext.data.Store', {
autoLoad: true,
autoSync: true,
model: 'Person',
type: 'ajax',
read: 'url/read',//查询
create: 'url/create',//创建
update: 'url/update',//更新
destroy: 'url/destroy'//删除
type: 'json',
root: 'data'
type: 'json'
listeners: {
write: function(store, operation){
var record = operation.getRecords()[0],
name = Ext.String.capitalize(operation.action),
if (name == 'Destroy') {
record = operation.records[0];
verb = 'Destroyed';
verb = name + 'd';
Ext.example.msg(name, Ext.String.format(&{0} user: {1}&, verb, record.getId()));
var rowEditing = Ext.create('Ext.grid.plugin.RowEditing', {
listeners: {
cancelEdit: function(rowEditing, context) {
// Canceling editing of a locally added, unsaved record: remove it
if (context.record.phantom) {
store.remove(context.record);
var grid = Ext.create('Ext.grid.Panel', {
renderTo: document.body,
plugins: [rowEditing],
width: 400,
height: 300,
frame: true,
title: 'Users',
store: store,
iconCls: 'icon-user',
columns: [{
text: 'ID',
width: 40,
sortable: true,
dataIndex: 'id'
text: 'Email',
sortable: true,
dataIndex: 'email',
xtype: 'textfield'
header: 'First',
width: 80,
sortable: true,
dataIndex: 'first',
xtype: 'textfield'
text: 'Last',
width: 80,
sortable: true,
dataIndex: 'last',
xtype: 'textfield'
dockedItems: [{
xtype: 'toolbar',
text: 'Add',
iconCls: 'icon-add',
handler: function(){
// empty record
store.insert(0, new Person());
rowEditing.startEdit(0, 0);
itemId: 'delete',
text: 'Delete',
iconCls: 'icon-delete',
disabled: true,
handler: function(){
var selection = grid.getView().getSelectionModel().getSelection()[0];
if (selection) {
store.remove(selection);
grid.getSelectionModel().on('selectionchange', function(selModel, selections){
grid.down('#delete').setDisabled(selections.length === 0);
很简单,使用api的方式,包括有增删查改,在前台的操作都会被extjs记录下来,再执行sync的时候就可以自动根据状态请求相应的url了。
下面是使用中遇到的一些小问题总结。
1、删除多行数据
例子里使用的是var selection = grid.getView().getSelectionModel().getSelection()[0];注意是加了个[0]的,所以要删除多行,直接取消这个[0],然后执行store即可,前提是你的表格没有限制只能选取一行,默认情况下,cellmodel的mode值为SINGLE,使用checkboxmodel就可以显示checkbox的同时实现多选了。
2、增删查改的同时进行传参
这个一开始同事懒得研究就直接在url里拼上去了,我觉得这样不妥,就查了下相关文章,最终得到两种实现方法
方法一:仅在查询时可用,设置store的autoload为false,手动载入store.load({//to do something});,这样使用查询是可以但是修改删除或者更新时就不好用了。于是有了方法二;
方法二:添加事件监听,在store里面设置linstener,监听beforeload时执行方法,设置Param,如:
listeners: {
beforeload: function(proxy, response, operation){
3、后台动态构造表头不能设置renderer
由于业务特殊性,我们在后台构造json对象包装extjs grid所需的fields、columns,也正因此,不能在后台设置renderer等调用js函数的属性,我的解决方式是,后台添加固定标识,数据到前台后遍历添加所需renderer函数或者特殊编辑器等
与后台的交互在一开始还是纠结了半天,没看清楚extjs的实现,原来使用这种方式的请求除了扩展参数以外,表格数据都是通过流交互的。这个在后台是不能直接使用request.getParamter("xxx");获取的,因为是使用流,所以需要通过get请求的流来读取数据,又因为是文本数据,所以直接request.getReader().readLine();获取到的就是json格式的字符串了,接下来就需要自己根据需要进行转换了,个人还是使用json.simple,当然了,具体情况具体对待,如果你的数据有其他的比如文件上传之类的,就需要先获取inputstream再解析了。
就总结这么多了,有任何问题,欢迎留言交流
固定链接:
文章标签:,,,,,,
扫二维码:
版权所有:除"转载分享"分类外,未经注明,均为原创、整理,转载请注明出处。
Extjs 4.2 Grid增删改及后台交互(Java)
支付宝打赏2730人阅读
ExTJS(167)
原文:作者:可能要处理的情况:success(成功)——Ext处理failure(失败),由于通讯问题——Ext处理failure(失败),由于服务器端异常——开发人员人员必须处理的响应失败……解决方案一:在应用程序控制器中编写以下方法: //Ajax Response Error Handler
Ext.Ajax.on('requestexception', function(conn, response, options, eOpts) {
var error = response.status + ' - ' + response.statusT
console.log('Ajax Request Exception! '+error);
if (response.status != 200) {
var errorData = Ext.JSON.decode(response.responseText);
console.log('ajax req error:'+errorData.message);
console.log('Ajax request Error', response.status);
});解决方案二:当在服务器端发生异常时,可以将500作为响应标头,原因作为HTML内容发送回客户端。store.on('loadexception',
function(a,conn,resp) {
if (resp.status == '304') {
Ext.Msg.alert('Content has not changed');
}else if(resp.status == '200') {
//Do nothing
}else if (resp.status == '401') {
Ext.Msg.alert('Authentication required - You need to Login');
}else if (resp.status == '302') {
errorDialog.body.update('Session Has Expired');
errorDialog.show();
}else if(resp.status == '500') {
errorDialog.body.update(resp.responseText);
errorDialog.show();
errorDialog.body.update('An uncaught exception has occured');
errorDialog.show();
}解决方案三:当发送Ajax或REST请求时,Ext JS 4代理通常会预期返回的信息包括参数:data、success和message。参数message是可选的,不过当需要将请求结果显示给用户的时候,它就可派上用场了。function requestMessageProcessor(proxy, response) {
if (response && proxy) {
var responseData = proxy.reader.getResponseData(response);
if (responseData.message) {
var messageDescription = 'Information'; // title of the alert box
var messageIcon = ;
if (!responseData.success)
var messageDescription = 'Error';
var messageIcon = Ext.MessageBox.ERROR;
Ext.MessageBox.show({
title: messageDescription,
msg: responseData.message,
buttons: Ext.MessageBox.OK,
icon: messageIcon
catch(err) {
// Malformed response most likely
console.log(err);
And here’s the part which should reside in proxy:
listeners: {
exception: function(proxy, response, options) {
requestMessageProcessor(proxy, response);
afterRequest: function(request, success) {
requestMessageProcessor(request.scope, request.operation.response);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1437718次
积分:16026
积分:16026
排名:第566名
原创:143篇
转载:28篇
译文:100篇
评论:2163条
(已升级)
阅读:17137
文章:22篇
阅读:78331
文章:29篇
阅读:132996
(1)(1)(4)(1)(1)(1)(1)(2)(7)(7)(7)(3)(2)(1)(2)(3)(2)(3)(4)(5)(3)(9)(5)(2)(4)(6)(3)(2)(1)(1)(3)(3)(4)(7)(2)(4)(4)(8)(4)(12)(2)(4)(8)(2)(3)(2)(2)(1)(3)(3)(3)(1)(1)(4)(7)(8)(5)(3)(8)(2)(1)(2)(1)(1)(1)(1)(2)(4)(1)(1)(2)(2)(2)(2)(4)(1)(3)(1)(5)(4)(1)(1)(1)(1)(1)(1)(1)(2)(1)(3)

我要回帖

更多关于 python爬虫需要登录 的文章

 

随机推荐