大家经常会用Python进行数据挖掘的说,但是有些网站是需要登陆才能看到内容的,那怎么用Python实现模拟登陆呢?其实网路上关于这方面的描述很多,不过前些日子遇到了一个需要cookie才能登陆的网站,而且这个网站还有些问题,于是费了好大的劲才搞定,现在贴出来给大家分享下。

首先是用Python3标准库里的urllib包实现的一个版本,不需要考虑许多细节:

 #! /usr/bin/env python
# -*- coding:utf-8 -*- import urllib.request
import urllib.parse
import http.cookiejar StudentInfoURL = 'http://210.x.x.1:90/student/index.jsp'
loginURL = 'http://210.x.x.1:90/login.jsp'
loginCheckURL = 'http://210.x.x.1:90/j_security_check'
post_data = urllib.parse.urlencode({'j_username': 'xxxxxxx', 'j_password': 'xxxxxxx'})
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'UserAgent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36'
} cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
#此处一定要链接一次,否则得不到cookie
opener.open(loginCheckURL)
urllib.request.install_opener(opener) ######################此处加入异常处理,再登一次即可######################
request = urllib.request.Request(loginCheckURL, post_data, headers)
try:
response = urllib.request.urlopen(request)
except:
response = urllib.request.urlopen(request)
print(response.read().decode('GBK')) ######################可以开始正常访问啦######################
request = urllib.request.Request(StudentInfoURL, headers=headers)
fp = urllib.request.urlopen(request)
print(fp.read().decode('GBK'))

下面是另一个版本,用的是比较底层的http包里的client模块实现的,个人很喜欢这个版本:

 #!/usr/bin/env python
# -*- coding:utf-8 -*- import http.client ###########################################################
HOST = '210.x.x.1:90'
UserName = "xxxxxxx"
PassWord = "xxxxxxx"
data = "j_username=%s&j_password=%s" %(UserName,PassWord)
Headers = {
"Content-Type":"application/x-www-form-urlencoded",
"User-Agent":"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)",
}
########################################################### #连接服务器
conn = http.client.HTTPConnection(HOST,timeout=30)
conn.connect() #GET到登录页,以获取cookies
conn.request("GET","/j_security_check",None,Headers)
res = conn.getresponse()
m_cookie = res.getheader("Set-Cookie").split(';')[0]
res.read() #POST到登录页,进行登录
Headers["Cookie"] = m_cookie
conn.request("POST","/j_security_check",data,Headers)
res = conn.getresponse()
res.read()
if res.status == 400:
#再次链接到登录页
conn.request("POST","/j_security_check",data,Headers)
res = conn.getresponse()
res.read()
conn.close() ######################可以开始正常访问啦######################
conn2 = http.client.HTTPConnection(HOST)
conn2.request("GET","/student/index.jsp",None,Headers)
fp = conn2.getresponse()
print(fp.status)
print(fp.read().decode("GBK"))
###########################################################

欢迎大家批评

Python实现模拟登陆的更多相关文章

  1. 【小白学爬虫连载(10)】–如何用Python实现模拟登陆网站

    Python如何实现模拟登陆爬取Python实现模拟登陆的方式简单来说有三种:一.采用post请求提交表单的方式实现.二.利用浏览器登陆网站记录登陆成功后的cookies,采用get的请求方式,传入c ...

  2. python爬虫模拟登陆

    python爬虫模拟登陆 学习了:https://www.cnblogs.com/chenxiaohan/p/7654667.html  用的这个 学习了:https://www.cnblogs.co ...

  3. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  4. python爬虫 模拟登陆校园网-初级

    最近跟同学学习爬虫的时候看到网上有个帖子,好像是山大校园网不稳定,用py做了个模拟登陆很有趣,于是我走上了一条不归路..... 先上一张校园网截图 首先弄清一下模拟登陆的原理: 1:服务器判定浏览器登 ...

  5. Python作业模拟登陆(第一周)

    模拟登陆:1. 用户输入帐号密码进行登陆2. 用户信息保存在文件内3. 用户密码输入错误三次后锁定用户 思路: 1. 用户名密码文件为passwd,锁定用户文件为lock 2. 用户输入账号密码采用i ...

  6. python+requests模拟登陆 学校选课系统

    最近学校让我们选课,每天都有不同的课需要选....然后突发奇想试试用python爬学校选课系统的课程信息 先把自己的浏览器缓存清空,然后在登陆界面按f12 如图: 可以看到登陆时候是需要验证码的,验证 ...

  7. python selenium模拟登陆163邮箱。

    selenium是可以模拟浏览器操作. 有些爬虫是异步加载的,通过爬取网页源码是得不到需要的内容.所以可以模拟浏览器去登陆该网站进行爬取操作. 需要安装selenium通过pip install xx ...

  8. Python脚本模拟登陆DVWA

    目录 requests模拟登陆 Selenium自动化测试登陆 环境:python3.7 windows requests模拟登陆 我们登陆DVWA的时候,看似只有一步:访问网站,输入用户名和密码,登 ...

  9. python requests 模拟登陆网站,抓取数据

    抓取页面数据的时候,有时候我们需要登陆才可以获取页面资源,那么我们需要登陆以后才可以跳转到对应的资源页面,那么我们需要通过模拟登陆,登陆成功以后再次去抓取对应的数据. 首先我们需要通过手动方式来登陆一 ...

随机推荐

  1. Ubuntu下搭建java开发环境

    JDK安装: 1. 在http://www.oracle.com/technetwork/java/javase/downloads/index.html上下载相应版本的JDK环境,这里我使用的是jd ...

  2. DOJO 八 event dojo/on

    官网教程:Events with Dojo在元素上绑定events,需要引用包dojo/on,通过on方法来实现. <button id="myButton">Clic ...

  3. Volley HTTP库系列教程(1)简介及优点

    Transmitting Network Data Using Volley Get  started Dependencies and prerequisites Android 1.6 (API ...

  4. [51NOD]大数加法(模拟)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1005 要处理符号,还要特别注意0和连续进位等情况.偷懒使用st ...

  5. 《OD大数据实战》mac下安装nginx+php

    一.mac安装nginx + php + php-fpm  或apache + php 1. Mac 下 Nginx.MySQL.PHP-FPM 的安装配置 2. Mac下安装LNMP(Nginx+P ...

  6. Qt之QNetworkInterface

    简述 QNetworkInterface类负责提供主机的IP地址和网络接口的列表. QNetworkInterface表示了当前程序正在运行时与主机绑定的一个网络接口.每个网络接口可能包含0个或多个I ...

  7. Kafka中的Message Delivary机制

    学习Kafka的读书笔记,暂未把文章设为翻译类型,因为并非直译文档.水平有限,还请路过高手指正. <1> “最多(发送)一次”(At most once):消息可以丢失但绝不会重新发送:& ...

  8. 字符集设置为UTF-8

    vi /etc/my.cnf [mysqld] character-set-server=utf8 [mysql] default-character-set=utf8 来自为知笔记(Wiz)

  9. valueOf intValue parsetInt区别

    1.int intValue() 以 int 类型返回该 Integer 的值. Long l = 123; l.intValue() ---->int : 123 2.static int p ...

  10. uva 11991

    STL 使用,,由于数据范围没有 超越极限数据  依旧可以用 vector 搞定: #include<iostream> #include<stdio.h> #include& ...