python爬虫:两种方法模拟登录博客园

第一方法用第三方库(requests):参考http://www.mamicode.com/info-detail-1839685.html

源代码分析

博客园的登录页面非常简单,查看网页源代码,可以发现两个输入框的id分别为input1、input2,复选框的id为remember_me,登录按钮的id为signin。

还有一段JavaScript代码,下面来简单分析一下。

先来看$(function(){});函数:

1 $(function () {
2     $(‘#signin‘).bind(‘click‘, function () {
3         signin_go();
4     }).val(‘登 录‘);
5 });

$(function(){});是$(document).ready(function(){})的简写。当页面加载完成之后,$(function(){})里的代码就会被执行。

$(‘#signin‘)表示选取id为signin的元素,即登录按钮。

bind()方法为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数。

val()方法返回或设置被选元素的值。

当点击登录按钮时,将执行signnin_go()函数。

 

JSEncrypt是一个用于RSA加密的库。在signnin_go()函数中,通过JSEncrypt对用户名和密码进行了加密,setPublicKey()函数里面就是加密的公钥。

$(‘#remember_me‘).prop(‘checked‘)返回复选框的状态,勾选时返回true,否则返回false。

两段加密后的密文和复选框的状态被保存在一个名为ajax_data的对象里。代码如下:

1 var encrypt = new JSEncrypt();
2 encrypt.setPublicKey(‘MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg/NOPO3nzMD3dndwS0MccuMeXCHgVlGOoYyFwLdS24Im2e7YyhB0wrUsyYf0/nhzCzBK8ZC9eCWqd0aHbdgOQT6CuFQBMjbyGYvlVYU2ZP7kG9Ft6YV6oc9ambuO7nPZh+bvXH0zDKfi02prknrScAKC0XhadTHT3Al0QIDAQAB‘);
3 var encrypted_input1 = encrypt.encrypt($(‘#input1‘).val());
4 var encrypted_input2 = encrypt.encrypt($(‘#input2‘).val());
5 var ajax_data = {
6     input1: encrypted_input1,
7     input2: encrypted_input2,
8     remember: $(‘#remember_me‘).prop(‘checked‘)
9 };

 

然后就是最主要的$.ajax({})函数了,ajax()方法通过HTTP请求加载远程数据,在不刷新页面的情况下与服务器交换数据,返回其创建的 XMLHttpRequest 对象。详情请参考jQuery ajax - ajax() 方法

 1 $.ajax({2     url: ajax_url,3     type: ‘post‘,4     data: JSON.stringify(ajax_data),5     contentType: ‘application/json; charset=utf-8‘,6     dataType: ‘json‘,7     headers: {‘VerificationToken‘: ‘。。。省略,此处是一大串字符。。。‘},8     success: function (data) {9         if (data.success) {
10             $(‘#tip_btn‘).html(‘登录成功,正在重定向...‘);
11             location.href = return_url;
12         } else {}
13     },
14     error: function (xhr) {}
15 });

上面的代码中做了一些省略。需要特别注意的是headers属性,刷新之后,VerificationToken的值将会改变,所以在模拟登录时,必须先获取这一段字符串。登录成功后,页面将进行跳转。

 

抓包分析

这是登录时的POST请求,其中有3个参数要特别注意:

技术分享

VerificationToken就是上文中提到的一段变化的字符串。

Ajax异步请求比传统的同步请求多了一个头参数,即X-Requested-With。

Content-Type用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。在这里返回的是json格式的数据。当输入错误的用户名和密码时,将得到下面的json数据:

技术分享

正确的用户名和密码将得到{"success":true}

 1 import requests
 2 import json
 3 login_url="https://passport.cnblogs.com/user/signin"
 4 return_url="https://home.cnblogs.com/u/xxx/"#我的主页
 5 session=requests.session()
 6 #获取VerificationToken
 7 login_page=session.get(login_url)
 8 p=login_page.text.find('VerificationToken')+len('VerificationToken')+4
 9 token=login_page.text[p:login_page.text.find("'",p)]
10 print(token)
11 headers={
12     'Content-Type': 'application/json;charset=UTF-8',
13     'X-Requested-With': 'XMLHttpRequest',
14     'VerificationToken':token
15        }
16 session.headers.update(headers)
17 #可以通过抓包获取加密后的用户名和密码,我将在附录部分介绍如何在Python中加密
18 data={
19     'input1': "加密的用户名",
20     'input2': "加密的密码",
21     'remember':True
22     }
23 
24 #模拟登录
25 response=session.post(login_url,data=json.dumps(data))
26 print(response.text)
27  #{"success":true}
28  #登录成功
29 
30 #跳转到主页
31 home_page=session.get(return_url)
32  #获取主页标题
33 p=home_page.text.find('<title>')+len('<title>')
34 title=home_page.text[p:home_page.text.find('</title>',p)]
35 print(title)
36 #xxx的主页 - 博客园
37 #如果登录失败,跳转到主页时返回的结果没有title标签,home_page.text将为‘需要登陆‘

 

第二种方法:用自带的库(urllib.request

 1 #-*- coding:utf-8 -*-
 2 __author__ = 'Administrator'
 3 
 4 #coding:utf-8
 5 import re
 6 from bs4 import BeautifulSoup
 7 import urllib.request
 8 import urllib.parse
 9 import http.cookiejar
10 import requests
11 
12 
13 def get_opener():
14     cj=http.cookiejar.CookieJar()
15     pro=urllib.request.HTTPCookieProcessor(cj)
16     opener=urllib.request.build_opener(pro)
17     return opener
18 
19 if __name__=="__main__":
20     opener=get_opener()
21     login_url="https://passport.cnblogs.com/user/signin"
22     return_url="https://home.cnblogs.com/u/xxx/"#我的主页
23   
24     #获取VerificationToken
25     login_page=opener.open(login_url).read().decode('utf-8')
26     soup=BeautifulSoup(login_page,"html.parser")
27     script=soup.find_all('script')
28     scripttext=script[2].string.strip()
29     p=re.findall('\'VerificationToken\': \'.*?\'',scripttext)[0]
30     start=len('VerificationToken')+5
31     token=p[start:-1]
32 
33     headers={
34     'Content-Type': 'application/json;charset=UTF-8',
35     'X-Requested-With': 'XMLHttpRequest',
36     'VerificationToken':token
37        }
38 
39     #可以通过抓包获取加密后的用户名和密码
40     data={
41     'input1': "加密的用户名",
42     'input2': "加密的密码",
43     'remember':True
44     }
45     heads=[]
46     for key,value in headers.items():
47         heads.append((key,value))
48     login_data=urllib.parse.urlencode(data).encode('utf-8')
49     opener.addheaders=heads
50     Req=urllib.request.Request(login_url,data=login_data)
51     response= opener.open(Req)
52     print(response.read().decode('utf-8'))
53     #{"success":true}
54     #登录成功
55 
56    #跳转到主页
57     home_page=opener.open(return_url)
58     #获取主页标题
59     soup=BeautifulSoup(home_page.read().decode('utf-8'),"html.parser")
60     p=soup.find('title')
61     print(p.text)
62     #xxx的主页 - 博客园
63     #如果登录失败,跳转到主页时返回的结果没有title标签,则‘需要登陆‘

 

转载于:https://www.cnblogs.com/yizhenfeng168/p/6986939.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS AppStore 申请加急审核

1、在iTunes Connect 上面提交审核后&#xff0c;点击下面链接申请加急审核 链接&#xff1a;https://developer.apple.com/appstore/contact/appreviewteam/index.html 2、进去默认是:"request an expedited app review" 即&#xff1a;“申请加急审核” 3、填写联系…

SpringBoot增删改查接口实例

前言 增删改查是后端最基本的技能。下面我就带领小伙伴们通过一个简单的示例来讲解SpringBoot的增删改查。Spring Boot框架层次从上至下可分为5层&#xff1a;分别为View层&#xff0c;Controller层&#xff0c;Service层&#xff0c;Mapper层&#xff0c;Model层 1. View层&a…

lpc2000 filash utility 程序烧写工具_单片机烧录程序的次数

单片机是可编程器件&#xff0c;开发者把程序写好、编译完之后&#xff0c;需要烧录到单片机中&#xff0c;单片机才能按照开发者的逻辑去执行。在这个烧录的过程中需要用到专用的烧录工具。比如51单片机的USB/TTL、STM单片机的STlink等。使用过单片机开发板的同学都清楚&#…

ug建模文本怎么竖着_入门到成为UG编程高手,这些步骤你不得不了解

入门到成为UG编程高手&#xff0c;这些步骤你不得不了解加工中心是数控设备的一种&#xff0c;日常的作业离不开数控加工&#xff0c;编程是要害。我们常见的编程软件有不少&#xff0c;mastercam、cimatron、ug、powermill、hypermill等等许多不同的软件&#xff0c;不同的编程…

华为手机记事本导出_深夜浅谈怎样用一部手机做电影解说?

小编从兴趣而至&#xff0c;到开始做第一部电影解说已经过去半个月了&#xff0c;作品也发布了三部&#xff0c;全程没用过一次电脑&#xff0c;自己之前也没接触过专业的软件&#xff0c;什么PR&#xff0c;AU之类的一概不懂&#xff0c;全程一部手机&#xff0c;只用剪映&…

MySQL多项模糊查询

最近有个需求&#xff0c;就是要根据搜索框里面的关键字&#xff0c;找到符合条件的数据。 如果是单个条件的话&#xff0c;其实就是一个普通的select语句。 但是需求是这个关键字&#xff0c;要在id&#xff0c;desc&#xff0c;step等多个字段模糊查找。 然后最直观的一个思路…

保存的图数据丢失_锡柴自主刷写和备份共享数据文件使用介绍

刷写功能锡柴自主 ECU刷写可以恢复损坏的数据或是新ECU刷上相应车型的数据注意事项确认车辆电瓶电量充足&#xff0c;平板电脑电量充足。发动机不启动。车辆处于刹车状态。建议使用USB线进行刷写可以提高刷写速度。部分车上其它系统对刷写有影响&#xff0c;可拆下来在车下接线…

用户思维模型,围绕用户核心四大模块,拉新、养熟、成交、裂变循环的效果...

用户思维模型&#xff0c;围绕用户核心四大模块&#xff0c;拉新、养熟、成交、裂变循环的效果 用户思维模型1、拉新越勾引人的诱惑设计&#xff0c;借力软文、好友、大V、媒体等推广的方法来获得源源不断高质量的粉丝&#xff0c;给予别人有价值的东西才能心甘情愿的成为你的粉…

德标螺纹规格对照表_抚顺船用外螺纹铜减压阀带NK船检证书

抚顺船用外螺纹铜减压阀带NK船检证书产品详情&#xff1a;品牌&#xff1a;“上海上循”牌(上海上循船用阀门制造有限公司)具体产品型号及详情&#xff0c;请致电咨询&#xff01;(V同号)QQ&#xff1a;1633370867材质&#xff1a;铸铁&#xff0c;铸钢&#xff0c;不锈钢&…

codeblocks如何导入项目_T3如何利用系统工具导入导出复制存货档案

问题现象&#xff1a;如何把旧账的存货档案复制到新建一个公司帐&#xff0c;如何在系统工具中操作&#xff1f;解决方案&#xff1a;1、点击电脑左下角“开始”-“程序”-“T3系列管理软件”-“T3”-“系统工具”&#xff0c;在此注册控制台界面输入(用户名、密码、选择帐套、…

2017-06-19 (cp mkdir rm 运行级别及修改)

mkdir 用于创建目录 mkdir -p 递归创建目录 mkdir -p /linux/linux rm 用于删除文件与目录 rm -r 删除目录 -f 强制删除 &#xff08;一般情况下 rf 组合使用&#xff09; cp 用于复制文件或者目录 cp [选项] [原文件或者目录] [目标目录] cp -r 复制目录 -p 连带…

工作31:传参对接口

&#xff5b;page&#xff1a;this.pagenation.page&#xff0c;limit&#xff1a;this.pagenation.limit&#xff5d;

采取监测记录网络运行状态_广播播控监测自动化系统改造探析

1、引言媒体发展已经步入融媒体时代&#xff0c;广播作为传统媒体&#xff0c;以其制作成本低、时效性强、收听设备简单便捷且不受空间和时间限制的特点&#xff0c;依然拥有其独特地位和优势。因此广播节目播出安全也就显得尤为重要&#xff0c;播出单位必须对播出的广播节目进…

微信小程序开发简易教程一

1. 获取微信小程序的 AppID&#xff08;注意这里的AppID是小程序专门的id&#xff0c;可以在登录微信公众号的小程序里面看到&#xff0c;无 AppID某些功能会受到限制&#xff01;&#xff09; 登录 https://mp.weixin.qq.com &#xff0c;就可以在网站的“设置”-“开发者设置…

明科在线客服系统PHP_在线客服系统的标准功能有哪些

在线客服系统一般有哪些标准的功能呢&#xff1f;从整体的设计结构以及系统工作的原理来讲&#xff0c;一般分为几大模块&#xff1a;1、 渠道接入&#xff1a;客户有可能与企业进行接触的不同触点&#xff0c;或者企业规划的固定服务窗口&#xff0c;视为客服系统接入的渠道。…