python--爬虫(模拟登录)

1.爬取baidu

baidudemo.py
#!/usr/bin/python
#-- coding:gb18030 --
import urllib2

response = urllib2.urlopen("http://www.baidu.com")
print response.read()

urllib2.urlopen
(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
Open the URL url, which can be either a string or a Request
object.

2.爬取baidu

#!/usr/bin/python
#-*- coding:gb18030 -*-
import urllib
import urllib2
request = urllib2.Request("http://www.baidu.com")  
response = urllib2.urlopen(request)
print response.read()

class urllib2.Request
(
url[, data][, headers][, origin_req_host][, unverifiable]
)

This class is an abstraction of a URL request.
url should be a string containing a valid URL.
data may be a string specifying additional data to send to the server, or None

3.模拟登录

firefox查看提交的表单
#!/usr/bin/python
#-*- coding:gb18030 -*-
import requests
data={"userBean.loginName":"admin","userBean.loginPass":"52f9001b1e75069f3c8c8daac9961b8a"}      
s=requests.session()
#s.post(url='http://10.50.x.x/portal/login_init.action',data=data) #失败    
s.post(url='http://10.50.x.x/admin/login_login.action',data=data)# 成功 
r=s.get('http://10.50.x.x/admin/login_login.action')
print r.text
html信息

Python爬虫教程——模拟登录|Yiner in Python
Requests:Python的HTTP库

4.模拟登录

import urllib
import urllib2
values = {"userBean.loginName":"admin","userBean.loginPass":"52f9001b1e75069f3c8c8daac9961b8a"}
data = urllib.urlencode(values)
url = "http://10.50.x.x/admin/login_login.action"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print response.read()

urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。例如 字典{'name': 'dark-bull', 'age': 200}将被转换为"name=dark-bull&age=200"

Python urllib模块的URL编码解码功能

成功爬去的html信息

5.带验证码的模拟登录:

思路:

a.先打开登陆页面,获得cookies。
b.再访问验证码的地址。验证码是动态的,每次打开都不一样。
c.识别验证码。这里就需要你处理、识别刚才得到的验证码。自己去找验证码(captcha)识别库,python可以用 pytesser(这个库是调用PIL来处理识别的) 、openc 之类的 或者可以人工识别然后手动输入验证码。
d.构造post请求数据(request data)和请求头部(request head) ,然后 将构造的请求 post给网站
f.获取 响应(response)信息,并通过测试来验证登陆是否成功。或者直接跳过a步骤:

参考:

用Python模拟登录正方教务系统并抓取初始网页的一些个人笔记
python爬虫实战之模拟正方教务系统登录查询成绩
python刷课脚本(正方教务系统)
教务系统爬虫


key:

每次验证码都不同

CheckCode.aspx

![error] VirtualBox VM, 今天 at 下午3.27.00.png](http://upload-images.jianshu.io/upload_images/1423035-bbee7f98f581abb0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
HTTP Error 302:
成功应该是返回200

返回码:200

编码问题:

![] VirtualBox VM, 今天 at 下午3.58.35.png](http://upload-images.jianshu.io/upload_images/1423035-9c77238fb5522e2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
RadioButtionList1:学生
先把‘学生’以utf8进行解码,然后编码成gbk,最后再进行url编码。


输出:%D1%A7%C9%FA


正常登陆的过程

先Post 访问default3.aspx
然后再get访问xsmainfs.aspx?xh=xxxx
还需要再访问 xstop.aspx和xsleft.aspx


post数据到default3.aspx后会重定向到/xsmainfs.aspx?xh=xx
post数据到default3.aspx后会返回302状态码
同样去访问xsmainfs.aspx的时候也会返回302状态码,正常情况下应该是200


抓包观察:

post过去的数据
�第一次返回信息
get访问xsmainfs.aspx,带cookie
firefox debug

对比,就connection不同

xsmainfs返回302

302是什么?

302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向(temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。一个暂时重定向是一种服务器端的重定向,能够被搜索引擎蜘蛛正确地处理。

为什么返回302呢?

302不是错误, 是http code. 再header中, 会有Location: http://url.com, 告诉浏览器, 下一步的地址, 浏览器检测到后, 跳转到新地址http//url.com.

应该要返回200才对


模拟登陆成功:

返回200
返回200

接下类要获取个人信息的数据

  • get方式:
    xsxx.aspx?xh=xx&xh1=xxx
  • 获取网页
  • 正则表达式提取数据
    <span id="xh">14055301xx</span></td>
    <span id="xm">姓名</span></td>
    <span id="csrq">�出生日期</span></td>
    <span id="xb">性别</span></td>
    <span id="rxrq">入学日期</span></td>
    <span id="mz">�民族</span></td>
    <span id="zymc">专业名称</span></td>
    <span id="zyfx">专业方向</span></td>
    <span id="xymc">学院名称</span></td> <span id="bjmc">班级名称</span></td>
    <span id="sfzh">�身份证号</span></td> <span id="dqszj">�年级</span></td> <span id="ksh">考生号</span></P> <span id="xz">学制</span></td>
    <span id="syszd">生源所在地</span></td>
    <span id="zzmm">政治面貌</span></td>
    <span id="xjzt">学籍状态</span></td>

目标:

1.模块化
2.存入数据库
3.自动化识别验证码

google:python 正方教务系统
一堆。。。


【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法

302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL

HTTPError是URLError的子类,在你利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码”。举个例子,假如response是一个”重定向”,需定位到别的地址获取文档,urllib2将对此进行处理。
其他不能处理的,urlopen会产生一个HTTPError,对应相应的状态吗,HTTP状态码表示HTTP协议所返回的响应的状态。下面将状态码归结如下:


还需要在代码里面添加访问xstop.aspx(带header和cookie)
以确定是否真正模拟登陆成功


urllib2.Request()

urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。

urllib2.build_opener()

同样,可以使用build_opener,这是一个更加方便的函数,用来创建opener对象,他只需要一次函数调用。
build_opener默认添加几个处理器,但提供快捷的方法来添加或更新默认处理器。
其他的处理器handlers你或许会希望处理代理,验证,和其他常用但有点特殊的情况。
install_opener 用来创建(全局)默认opener。这个表示调用urlopen将使用你安装的opener。
Opener对象有一个open方法。

Python:urllib 和urllib2之间的区别
cookielib和urllib2模块相结合模拟网站登录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • urllib2是Python的一个获取URLs的组件。他以urlopen函数的形式提供了一个非常简单的接口,具有利...
    查无此人asdasd阅读 1,497评论 0 3
  • 一、概述 urllib2是Python的一个针对URLs的库。他以urlopen函数的形式提供了一个非常简单的...
    MiracleJQ阅读 1,485评论 0 5
  • 今天用 requests + BeautifulSoup 抓取 aliexpress 的时候, 在模拟登录时候出现...
    王独立阅读 8,762评论 2 8
  • 一、网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spide...
    随风化作雨阅读 1,087评论 0 0
  • 成长,就好比我人生中的一艘小船,行驶在波面上。有时风平浪静,有时也会遇到汹涌澎湃的海浪。但我的成长之舟,并不是一帆...
    YolandaYanyoyo阅读 331评论 3 1