相信最开始接触Python爬虫学习的同学最初大多使用的是urllib,urllib2。在那之后接触到了第三方库requests,requests完全能满足各种http功能,真的是好用爆了 :D

他们是这样说的:

“Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求,无需手工劳动。你不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码。Keep-alive 和 HTTP 连接池的功能是 100% 自动化的,一切动力都来自于根植在 Requests 内部的 urllib3。”

-----来自官方文档(http://cn.python-requests.org/zh_CN/latest/)

敲入命令“Pip Install Requests”安装即可享用(前提是已经安装了pip)

还等什么呢?赶紧import requests加入豪华午餐吧

先看看几个常用的方法和属性:

  1.requests.Session()这样就可以在会话中保留状态,保持cookie等

  2.requests.get()获取某个网页,get时你可以使用params参数发送一些数据过去

d = {key1 : value1, key2 : value2 }
requests.get(‘URL’, params=d)

  get时也可以使用headers参数定制请求头。

h = {key1 : value1, key2 : value2 }
requests.get(‘URL’, headers=d)

  3.requests.post()发送post请求,类似的,post时也可以发送数据(使用data参数)和定制请求头(使用headers参数)。

一些常用的属性:

eg=requests.get()
eg.text  #可以获取响应的内容如抓回来的网页
eg. encoding='utf-8'  #有时回来的是乱码,改变编码以使其正常显示根据实际情况改变编码utf-8、gb2312等
eg. content  #可以获取二进制内容,如抓取登陆时的验证码等非字符资源
eg.cookies  #可以查看当前保存的cookie情况
eg. status_code  #可以查看HTTP状态码(如200 OK、404 Not Found等)
eg.url  #可以查看当前请求的网址

其他详细内容参见官方文档(http://cn.python-requests.org/zh_CN/latest/)

好了,其实只要懂那么一点点就可以进行爬虫之旅了。

一个有趣的现象:童鞋们在学习爬虫时都会去爬一个叫做“教务处”的网站,哈哈。那这里的小爬虫也是以登陆本校(成都信息工程大学)的教务处作为实例

首先使用浏览器打开教务处,按F12打开“开发人员工具”,进行一次正常的登陆,对登陆的数据进行分析。

  1.教务处的登陆页面为http://210.41.224.117/Login/xLogin/Login.asp

  2.在开发者工具中点击网络,经查看登陆的发送post数据的地址也是http://210.41.224.117/Login/xLogin/Login.asp

  3.同时看到post的数据包括如下

参数列表

表单名

说明

WinW

1366

屏幕分辨率-宽

WinH

728

屏幕分辨率-高

txtId

2013215042

学号

txtMM

123456

密码

verifycode

123a

验证码

codeKey

597564

动态登陆码,html文件中可见

Login

Check

登陆类型(固定)

IbtnEnter.x

10

登陆按钮点击位置

IbtnEnter.y

10

登陆按钮点击位置

“开发者工具”中的登陆post表单数据:

  4.其中codeKey在登陆页载入时可以在页面中获得(使用正则表达式获取)。

那么思路来了:

  1.get()载入登陆页

  2.在载入页中获取codeKey和验证码

  3.使用post()将登陆学号、密码、验证码等参数发送过去

  4.登陆成功。

然而事实并不是如此顺利,经以上思路登陆之后会返回“LoginOK!”登陆成功的消息,本来是要经两个302跳转到教务处的学生主页的,但并不能顺利跳转而且哪怕手动加载学生页不行。

经再次分析发现从教务处首页点击登陆链接并不是直接链接到登陆页http://210.41.224.117/Login/xLogin/Login.asp,而是先访问http://jxgl.cuit.edu.cn/JXGL/xs/MainMenu.asp试图打开学生页失败,再经跳转到一个http://210.41.224.117/Login/qqLogin.asp?Oid=jxgl.cuit.edu.cn&OSid=*********再经这里跳转才到登陆页,其中的OSid为服务器下发分配的。实践表明我需要模仿这个过程才能顺利登陆成功。

好了,那么思路再次来了:

  1. get(‘http://jxgl.cuit.edu.cn/JXGL/xs/MainMenu.asp’)这里要get两次才能跳转到登陆页
  2. 在载入的登陆页中获取codeKey和验证码
  3. 使用post()将登陆学号、密码、验证码等参数发送过去
  4. 登陆成功,加载学生主页

要点:

  1. 两次get()之后得到一个跳转页面由浏览器执行javascript自动跳转,但在爬虫里需要在这个页面中找出跳转的地址手动跳转过去。使用正则表达式在javascript代码中获取需要跳转的网址,再get该网址即可。
  2. 获取验证码,验证码是随机生成的,得到验证码刷新地址http://210.41.224.117/Login/xLogin/yzmDvCode.asp?k=597564&t=1471855009329其中参数k为codeKey,t为时间戳加上三位随机数。那就使用前边提到eg. content可以获取二进制内容将图片保存下来再打开人工识别后输入验证码。

思考完毕,接下来就是实现了,最后的登陆代码如下:

#coding=utf-8
import requests
import re
import time
import random
from PIL import Image
import cStringIO
def login(username,password):
headers = { #请求头请求刷新验证码和发送post时需要使用
'Host': '210.41.224.117',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0',
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Referer': 'http://210.41.224.117/Login/xLogin/Login.asp',
'Connection': 'keep-alive'
}
session = requests.Session()
step1 = session.get('http://jxgl.cuit.edu.cn/JXGL/xs/MainMenu.asp') #连get两次学生主页以跳转至登陆页
step1 = session.get("http://jxgl.cuit.edu.cn/Jxgl/Xs/MainMenu.asp")
get_osid_url = re.compile(r'content="0;URL=(.*?)">') #获取含OSid的跳转网址
osid_url = get_osid_url.findall(step1.text)
step2 = session.get(osid_url[0]) #跳转,上文要点1
get_codeKey = re.compile(r'var codeKey = \'(.*?)\';') #在登陆页html中获取codeKey(参数k)
codeKey = get_codeKey.findall(step2.text)
timeKey = str(time.time())[:10] + str(random.randint(100, 999)) #生成参数t的值(时间戳+三位随机数)
payload = {'k': codeKey[0], 't': timeKey}
yzm_url='http://210.41.224.117/Login/xLogin/yzmDvCode.asp'
yzmdata = session.get(yzm_url, params=payload, headers=headers) #刷新验证码,上文要点2
tempIm = cStringIO.StringIO(yzmdata.content)
im = Image.open(tempIm)
im.show()
yzm = raw_input('please enter yzm: ') #人工识别验证码后输入
post_data = {
'WinW': '',
'WinH': '',
'txtId': username,
'txtMM': password,
'verifycode': yzm,
'codeKey': codeKey[0],
'Login': 'Check',
'IbtnEnter.x': 10,
'IbtnEnter.y': 10
}
post_url='http://210.41.224.117/Login/xLogin/Login.asp'
step3 = session.post(post_url, data=post_data, headers=headers) #post登陆数据
return session cuitJWC=login('username','password')
con=cuitJWC.get('http://jxgl.cuit.edu.cn/JXGL/xs/MainMenu.asp')
con.encoding='gb2312'
print con.text

转载请注明出处:http://www.cnblogs.com/lucky-pin/p/5806394.html

Python 爬虫入门(requests)的更多相关文章

  1. Python爬虫入门(二)之Requests库

    Python爬虫入门(二)之Requests库 我是照着小白教程做的,所以该篇是更小白教程hhhhhhhh 一.Requests库的简介 Requests 唯一的一个非转基因的 Python HTTP ...

  2. python爬虫入门-开发环境与小例子

    python爬虫入门 开发环境 ubuntu 16.04 sublime pycharm requests库 requests库安装: sudo pip install requests 第一个例子 ...

  3. Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...

  4. 1.Python爬虫入门一之综述

    要学习Python爬虫,我们要学习的共有以下几点: Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy Python爬虫 ...

  5. Python 爬虫入门之爬取妹子图

    Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...

  6. 孤荷凌寒自学python第六十七天初步了解Python爬虫初识requests模块

    孤荷凌寒自学python第六十七天初步了解Python爬虫初识requests模块 (完整学习过程屏幕记录视频地址在文末) 从今天起开始正式学习Python的爬虫. 今天已经初步了解了两个主要的模块: ...

  7. Python爬虫入门一之综述

    大家好哈,最近博主在学习Python,学习期间也遇到一些问题,获得了一些经验,在此将自己的学习系统地整理下来,如果大家有兴趣学习爬虫的话,可以将这些文章作为参考,也欢迎大家一共分享学习经验. Pyth ...

  8. Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分

    1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...

  9. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  10. Python爬虫入门之正则表达式

    在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的 ...

随机推荐

  1. js之parentElement属性

    <html> <head> </head> <body> <form name="a "> <table name ...

  2. linux 远程工具

    SecureCRT SecureCRT官网地址:http://www.vandyke.com/products/securecrt/ Xmanager官方网址:http://www.netsarang ...

  3. 关于JFace中的进度条对话框(ProgressMonitorDialog类)

    在Windows操作系统中,最常用的进度条对话框就是文件复制时的弹出框,如果想让用户愉快的使用你开发 的软件,那么在执行某个较长时间的操作时候,就应该弹出一个进度条提示框,告诉用户程序正在做什么. 做 ...

  4. 关于Spring中AOP的理解

    AOP简介[理解][重点] 1.AOP(Aspect Oriented Programing)面向切面/方面编程 2.AOP隶属软件工程的范畴,指导开发人员如何制作开发软件,进行结构设计 3.AOP联 ...

  5. CMD/AMD

    AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMDCMD 规范在这里:https://github.com/seajs/seajs/issues ...

  6. 第三章 jQuery中的DOM操作

    DOM(Document Object Model)文档对象模型,每张网页都能用DOM表示出来,每一份DOM都能看成一颗DOM树. jQuery继承了JavaScript对DOM对象操作的特性,使开发 ...

  7. Spring AOP (Spring 3.x 企业应用开发实战读书笔记第六章)

    从面相对象编程到面相切面编程,是一种代码组织方式的进化. 每一代的代码组织方式,其实是为了解决当时面对的问题.比如写编译器和写操作系统的时候的年代当然要pop,比如写界面的时候当然要oop,因为界面这 ...

  8. Drbd 安装配置

    一.Drbd介绍 Distributed Replicated Block Device(DRBD)是基于块设备在不同的高可用服务器之间同步和镜像数据的软件,通过它可以实现在网络中两台服务器这间基于块 ...

  9. ###STL学习--标准模板库

    下面进行STL的学习.希望能了解标准模板库中的常用容器,迭代器,可以自由运用STL以提高编写代码的效率.下面的内容我想以知识点为总结,不再像<Effective C++>那样以章节进行总结 ...

  10. 第三篇、C_双向链表(循环链表)

    简介: 在用C/C++开发系统中,我们知道用数组或者单链表来开发,如果是数据比较大的话,性能很不好,效率也不高.因此常常需要考虑系统的实用性,常常采用双向链表来开发. 示例: 1.数据 typedef ...