㈠ python2 能使用requests吗
由于公司要用到模拟用户登录,于是用学校图书馆读者登录来进行练习。
工具是python2 + requests第三方库+火狐浏览器的firebug进行http抓包
目标 用python成功登录学校图书馆
接下来几篇会利用urllib和urllib2标准库进行登录
以下为具体步骤:
1 打开学校图书馆网址,以下为登录界面
综合以上分析,利用requests库进行模拟用户登录。这里的post参数采用了之前图片的源码形式,使得参数顺序匹配
import requests
url = "http://210.32.205.60/login.aspx"
# 学校图书馆登录url
header = {"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Connection":"keep-alive",
"Content-Type":"application/x-www-form-urlencoded",
"Host":"210.32.205.60",
"Referer": "http://210.32.205.60/login.aspx",
"Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:54.0) Gecko/20100101 Firefox/54.0"
}
body = b'__VIEWSTATE=%uMtIIHXEj%&__VIEWSTATEGENERATOR=C2EE9ABB&__EVENTVALIDATION=%2FwEdAAbAeS%2BByzNg%%2FzVFQdp1z%2BnYWZ%%2BIuKmLNV%%3D%3D&DropDownList1=0&TextBox1=读者号&TextBox2=密码&ImageButton1.x=44&ImageButton1.y=12'r = requests.post(url, data=body, headers=header)
print r.text
以上为一次提交,没有进行重定向截取。
如果想用reque库截取重定向,在这个图书馆登录中则需要进行两次操作,这里相当于只做了post请求,头部,post参数都不变,只不过在requests.post()内设置了参数
r = requests.post(url, data=body, headers=header, allow_redirects=False)
# 设置 allow_redirects=False 使得禁止重定向
aspid = r.headers["Set-Cookie"] # 返回页面的头部的cookie
print r.status_code # 输出302
如果再想登陆图书馆页面,那么需要将cookie重新加入新的url上,进行get请求的提交,此时url为/Default.aspx.
url ="http://210.32.205.60/Default.aspx"
header = {
"Accept": "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*",
"Referer": "http://210.32.205.60/login.aspx",
"Accept-Language": "zh-CN",
"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; Media Center PC 6.0)",
"Accept-Encoding": "gzip, deflate",
"Host": "210.32.205.60",
"Connection": "Keep-Alive",
"Pragma": "no-cache",
"Cookie": aspid
}
r = requests.get(url=url,headers=header)
print r.status_code
print r.text
接下来的几篇是利用python2的urllib2和urllib进行相同的模拟用户登录。
ps 由于urllib2处理重定向的时候不会将cookie带上,会导致页面不能正确爬取,所以要处理重定向。解决urllib重定向文章在此,分别介绍了urllib2自动处理重定向(带上cookie),和urllib2阻止重定向,返回cookie。
利用urllib2进行自动处理重定向,模拟浏览器提交post一次,就可以登录图书馆的文章在这。
利用urllib2处理重定向,使得重定向截断,获取cookie,根据cookie用代码实现重定向,登录图书馆的文章在此。
㈡ Python瞎老弟的爬虫心得之requests篇②requests基本使用
上一期已经成功安装了requests模块,并简单的使用了requests,本期,我们将详细介绍requests模块
直接使用requests.get()方法即可
其中内容将通过requests.text查看
将get()方法,改为post()即可
其中需要提交的内容,通过data参数传入
url参数,也即跟在地址后的?后的一串内容
我们可以直察埋接通过url地址将其构造出来
也可以通过params参数,传入一个字典使用
可以看出,地址同样被自动构造为
这是一种更加容易的传入参数的方法,可以不需要使用
我们得到了一个对象r,这是一个requests.models.Response对象
使用档烂r.text可以得到响应内容
其中解码方式是requests自行猜测的,它会把猜测的结果保存在r.encoding中
使用r.encoding可以得到或者改变编码方式
如果使用r.text得到的内容不正确,可以手动修改r.encoding,然后再使用r.text输出内容
如果不知道正确的编码,可能有人会建议你使用chardet模块来进行编码的测试(该模块需要使用pip安装,目前版本也会随安装requests附带)
使用方法:
事实上,现在的requests已经使用了chardet模块,但你仍然可以将行没漏chardet用于其他时候使用
使用r.content可以得到二进制的响应内容
使用r.json()可以得到json的响应内容
给headers参数传入一个字典即可
如同之前你预想的那样,user-agent会被修改为lsp
通过r.status_code可以查看状态码
通过r.headers可以查看响应头
通过r.raise_for_status()可以在状态码为不正常的时候抛出异常
在请求中添加timeout参数,即可让你的程序在指定的时间内没有得到响应就抛出异常
通过r.url可以查看到请求地址
通过r.history可以查看到重定向
通过修改allow_redirects参数为False可以禁止重定向
例如禁止github进行重定向
㈢ 全方面的掌握Requests库的使用【python爬虫入门进阶】(02)
上一篇文章简单的介绍了 爬虫相关的基础知识点,介绍了一个标准爬虫程序的三个步骤 。这篇文章就让我们接着来学习。
本文重点介绍requests库的使用以及爬虫协议。之前也写了一篇 Requests库使用的博客 ,有兴趣的小伙伴可以去看看。
前面介绍了Requests库是用来抓取网页源码,请求接口的利器,整体上是要比urllib库的request更加好用的库。官网上将其称之为唯一一个非转基因的Python HTTP库,人类可以安全享用。
Requests库有7个主要方法。
不过我们平常最常用的方法还是GET方法和POST方法。
get请求方法是爬虫中最常用到的方法,因为爬虫主要就是爬取网页的信息。最基础的使用是
这里需要通过 res.encoding='utf-8' 设置响应结果的编码格式是utf-8。不然可能会出现中文乱码
如果响应结果是二进制数据的话则需要通过 res.content 方法来提取响应结果。
设置编码的方式也可以是 res.content.decode('utf-8') 。
即
有时候get请求也需要传入参数,这里可以直接将参数拼接到URL上或者通过params参数传入一个字典。
运行结果是:
get请求只能传入简单的参数,如果参数比较复杂或者传入的参数比较多的话则GET请求就不再适用了,这时候就需要适用post请求方法了。
Post请求的请求类型有三种:
以表单的方式提交数据是POST请求的默认的请求格式,只需要将参数放在一个字典中进行传入即可。
这里将请求头的数据放在一个名为header的字典中,然后在请求时通过headers参数传入。在请求中设置了内容类型是 application/json ,编码格式是 charset=utf-8
传入的是一个json字符串,通过data参数进行传入。json字符串可以直接写也可以通过 json.mps(dict) 方法将一个字典序列化,就像下面这样。
文件上传与本节爬虫的内容无关,在此就不过多介绍了。有兴趣的小伙伴可以看看 Python中如何编写接口,以及如何请求外部接口 这篇文章。
在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。通过将allow_redirects 属性设置为False不允许重定向。
通过timeout属性可以设置超时时间,单位是秒。get方法和post方法均可设置。
通过status_code属性可以获取接口的响应码。
有时候我们使用了抓包工具,这时候由于抓包证书提供的证书并不是受信任的数字证书颁发机构颁发的,所以证书的验证会失败,所以我们就需要关闭证书验证。在请求的时候把verify参数设置为False就可以关闭证书验证了。
爬虫协议也叫做robots协议,告诉网络蜘蛛哪些页面可以爬取,哪些页面不能爬取
爬虫文件的规范是:
允许所有的机器人
本文详细介绍了Request库的使用
㈣ python requests库如何处理302重定向
你的意思是希望requests报告302?
r = requests.get(url, allow_redirects=False)
r.status_code
r.headers['Location']