爬虫教程---第二章:requests的使用

第二章:requests库使用

urllib库 虽然蛮强大的,但是还有很多比较麻烦的地方,比如上一章的实现中,需要把post请求的参数进行编码才可以发送到服务器,还有当我们需要使用到cookie以及其他东西时需要借助一些东西才可以实现。

requests库呢,就像个妈妈一样,漂亮的衣服都帮我们织好了,我们需要穿到的时候叫一声妈,就可以穿上好看的衣服。

如果需要使用requests库,需要先安装pip install requests

tips: 以后很多库使用pip下载都很方便,另外也可以在pycharmProject 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请求

接下来用requestsPOST 请求来进行登录一下吧。下面演示的网址跟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,你有什么是其他人无法做到的地方吗?”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值