第二章:requests库使用
urllib库
虽然蛮强大的,但是还有很多比较麻烦的地方,比如上一章的实现中,需要把post请求的参数进行编码才可以发送到服务器,还有当我们需要使用到cookie以及其他东西时需要借助一些东西才可以实现。
requests
库呢,就像个妈妈一样,漂亮的衣服都帮我们织好了,我们需要穿到的时候叫一声妈,就可以穿上好看的衣服。
如果需要使用requests
库,需要先安装pip install requests
tips: 以后很多库使用pip下载都很方便,另外也可以在pycharm
的Project Interpreter
那里搜索安装。
2.1发送GET请求
import requests
# 获取response对象
res = requests.get("http://www.baidu.com")
print(res.text) # 查看响应内容(已解码)
print(res.content) # 查看响应内容(未解码)
print(res.encoding) # 查看编码
print(res.status_code) # 查看响应状态码
res.text 是以request猜测的编码形式解的码,就是说他猜的有时候是不对,这种情况就会产生乱码了。
既然如此,我们可以指定编码,然后让request按照我们指定的编码进行解码。
import requests
res = requests.get("http://www.baidu.com")
# 指定response对象的编码为utf-8
res.encoding = 'utf-8'
print(res.text)
接下来看看如何传递传递参数跟设置请求头
import requests
# 设置get请求的参数
params = {"wd": "python"}
# 设置请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/82.0.4077.0 Safari/537.36'
}
res = requests.get("http://www.baidu.com",params=params,headers=headers)
print(r.url) # 查看url,参数成功传递
看到这里,对比一下urllib库
跟requests库
,是不是后者更方便一些。后者如果使用get
请求,直接requests.get
的形式就可以了,要加什么参数也直接加上去就行了。当然了,其他请求方式也是类似,比如下一节的post。
2.2 发送POST请求
接下来用requests
的POST
请求来进行登录一下吧。下面演示的网址跟data都需要跟我的一样,这里只是为了演示post请求的用法。
import requests
url = 'http://47.115.46.57:8989/api/users/login'
# 设置请求参数
data = {
"phone": "123456",
"password": "123456",
}
# 设置POST请求,且设置POST请求的参数
res = requests.post(url, data=data)
print(res.text)
# print(res.json()) # 获取json格式的数据
如果返回 {"status":400}
就说明请求成功啦!
由于返回的是json格式的数据,所以可以使用**res.json()
** 来代替 res.text
。
tips:
- get请求若需要传递参数则使用
params
- post请求若需要传递参数则使用的是
data
2.3 使用代理
前面有提到过一个爬虫,在对一些反爬虫比较厉害的网站来说,做一些伪装是必要的,那这节要介绍代理也是伪装的一部分。
那什么是代理呢?
比如有个“办事处”(你发送请求的网站)可以查询到你想要的信息,但是每次进出都要出示身份证。此时你很急切的想要去办事处获取一些信息,于是你每分钟去一次去 “办事处” ,那么此时“办事处” 的工作人员就不耐烦了,每分钟来一次这不是捣乱吗,于是这个工作人员就跟门口的警卫说:“今天别再让身份证为xxx的SB进来了”。下一分钟你再倒回去的时候警卫就可能跟你说:“工作人员有事出去了,你下次再来吧”,此时明显知道,这是在忽悠你的,但是你又无能为力。嘿嘿,可气吧。
这时你灵机一动,在附近找了托,让他帮你查询你想要获取的信息,当然,有些托比较好心,不收你钱,但是这类托比较容易忘记了,或者比较慢去帮你查询信息。还有一类托呢,就是专门收钱然后帮忙去获取消息的。
那么这里说的托就是IP代理
啦。
IP代理可以在网上找,有免费的也有收费的,这里我推荐一个我自己爬虫的时候偶尔会使用的一些代理:
- 快代理:免费的,但是不稳定,速度慢
- 芝麻代理:每天可以获取10条IP地址。前提是要注册登录
接下来就看看如何使用代理吧。
使用前介绍一个网站:http://www.httpbin.org/ip
,此网站可以返回你的IP地址的信息
import requests
proxy = {'http': '112.114.131.183:38387'}
# 设置IP代理
rp = requests.get("http://www.httpbin.org/ip",proxies=proxy)
print(rp.text)
执行上面代码后,我这里显示的是{"origin": "112.114.131.183"}
此时你就知道怎么换IP
代理了。
2.4 cookie和session
这里先介绍一下requests
库里面的session
对象,这里的session
是不同于前端所说的session
的,requests
库里面的session
对象仅仅是一个会话的意思,即本次所有的请求都处于同一会话当中,在同一会话中的所有的数据都可以共享 。
比如会话可以保存你登录的信息,以致于你访问网站的其他页面时可以直接访问。
使用session发起请求跟之前的请求方式有点不同。这里演示一下
import requests
url = "http://www.renren.com/Login.do"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/82.0.4077.0 Safari/537.36'
}
data = {"email":"填你的账号","password":"填你的密码"}
# 创建session对象
session = requests.Session()
# 利用session对象发起登录请求
session.post(url,data=data,headers=header)
# 跳转到个人主页
response = session.get('http://www.renren.com/974589261/profile')
# 将个人主页的页面写到本地
with open('renren.html','w',encoding='utf-8') as fp:
fp.write(response.text)
此时你会看到,当前项目文件夹下多了个 renren.html
用浏览器打开它,如果你登录是成功的,那么会显示你的个人信息的页面。
2.5 小实战
这节我们来爬取拉钩网的招聘列表信息。
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/82.0.4077.0 Safari/537.36',
"referer": "https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput="
}
url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
# 创建session对象
session = requests.Session()
s1 = session.get(url, headers=headers)
data = {
"first": "false",
"pn": 2,
"kd": "python"
}
url2 = 'https://www.lagou.com/jobs/positionAjax.json?city=%E5%B9%BF%E5%B7%9E&needAddtionalResult=false'
s2 = session.post(url2, headers=headers, data=data)
# 返回的数据是json类型
msg = s2.json()
# 直接输出响应信息
print(msg)
# 输出响应信息的content内容
# 分析了msg之后你就会发现,招聘单位的内容都放在这里面
print(msg['content']['hrInfoMap'])
到了这一步基本就差不多啦,如果还想要更好的信息,可以再进一步对json
数据进行解刨。
比如加上如下代码:
for id in msg['content']['hrInfoMap']:
print("负责人编号:", msg['content']['hrInfoMap'][id]['userId'])
print("负责人姓名:",msg['content']['hrInfoMap'][id]['realName'])
print("负责人岗位:",msg['content']['hrInfoMap'][id]['positionName'])
如今的拉钩网反爬虫机制越来越强了,可能是因为几乎每一个爬虫案例都会对它下手的原因吧。你如果分析了Data参数,你会发现他那里还有个sid
,那为什么我这里的data没有加上呢?因为这个sid
每次请求都会不一样,所以我猜这个sid 是每次会话请求所需要使用的一个类似于验证的东西,所以我使用了session,结果真的可以忽略此参数,可见,session在某些时候可以帮我们极大的简化爬虫操作。
当然了,这只是很初略的一个小爬虫案例,你完全可以根据需要自己改写,比如根据自己的输入岗位、城市等来获取相应的职位信息,而且这只是一页的数据,你可以写个for循环来爬取多页。等等一系列操作。
小结语:
小伙伴呢可以自己多动手试试,在尝试的路上可能会有很多的坎坷但这一切都是值得的,所谓的大神就是比我们多走了许许多多的坎坷。前两天看尹成大神的直播,他说的话让我感触很深,“每个人都想要得到大厂的offer,你也不例外,可是你凭什么可以拿到这个offer,你有什么是其他人无法做到的地方吗?”