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.模拟登录
#!/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
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"
5.带验证码的模拟登录:
思路:
a.先打开登陆页面,获得cookies。
b.再访问验证码的地址。验证码是动态的,每次打开都不一样。
c.识别验证码。这里就需要你处理、识别刚才得到的验证码。自己去找验证码(captcha)识别库,python可以用 pytesser(这个库是调用PIL来处理识别的) 、openc 之类的 或者可以人工识别然后手动输入验证码。
d.构造post请求数据(request data)和请求头部(request head) ,然后 将构造的请求 post给网站
f.获取 响应(response)信息,并通过测试来验证登陆是否成功。或者直接跳过a步骤:
参考:
用Python模拟登录正方教务系统并抓取初始网页的一些个人笔记
python爬虫实战之模拟正方教务系统登录查询成绩
python刷课脚本(正方教务系统)
教务系统爬虫
key:
每次验证码都不同
![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
编码问题:
![] 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
抓包观察:
对比,就connection不同
302是什么?
302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向(temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。一个暂时重定向是一种服务器端的重定向,能够被搜索引擎蜘蛛正确地处理。
为什么返回302呢?
302不是错误, 是http code. 再header中, 会有Location: http://url.com, 告诉浏览器, 下一步的地址, 浏览器检测到后, 跳转到新地址http//url.com.
应该要返回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.自动化识别验证码
【总结】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方法。