Python爬虫之requests模块(一)
学完urllib之后对爬虫应该有一定的了解了,随后就来学习鼎鼎有名的requests模块吧。
一、requests简介。
1、什么是request模块?
requests其实就是py原生的一个基于网络请求的模块,模拟浏览器发起请求,是不是和urllib很像。没错,其实requests和urllib是有很多相似之处的,但是requests更加的便捷、简单。
2、为什么要使用requests模块?
一个技术的出现,肯定是有所图的,回想一下urllib的使用。
第一 :是不是如果url携带中文,是不是每次都要对url进行编码?(使用quote函数),如果一个url中,有很多组参数都带中文,那岂不是需要对url进行数次的编码?
第二 :基于post请求,需要手动的处理post请求的参数(urlencode函数)
第三:urllib处理cookie和代理的操作比较繁琐。
但是对于requests来说,则会自动处理url编码、自动处理post请求参数,还简化了cookie和代理操作等等
3、requests模块如何被使用?
其实和其他所有模块一样,需要先使用pip安装,随后import调用
shell
pip install requests
具体使用流程和urllib几乎类似:
- 指定url
- 使用requests模块发起请求
- 获取响应数据
- 进行持久化存储
二、基于requests模块发起get请求
1、requests模块处理不带参数的get请求
- 需求爬取搜狗首页页面数据
python
import requests
#1、指定url
url = "https://www.sogou.com/"
#2、发起一个get请求,直接调用requests的get方法,url参数为指定爬取的url
#get方法会返回请求成功后的响应对象
response = requests.get(url=url)
#3、获取响应中的数据值,text属性作用是获取响应对象中字符串形式的页面数据
page_data = response.text
# print(page_data)
#4、持久化存储
with open("sougou_req.html","w",encoding="utf-8") as f:
f.write(page_data)
其实和urllib很类似。但是可以看到响应对象的属性,有一个text。
其实关于响应对象的常用属性还是挺多的,如下常见的:
requests对象中其他重要的属性:
python
response.content #content属性和text类似,只不过返回的是响应对象中二进制(byte)类型的数据
response.status_code #status_code很简单明了,就是返回响应状态码,比如200、404、502等...
response.headers #返回响应头信息,字典形式展示
response.url # 获取请求当中指定的url
2、requests模块处理携带参数的get请求
- 需求:指定一个词条,获取搜狗搜索结果所对应的页面数据
第一种方式:
python
import requests
#指定URL,query后面是请求参数,词条是孙燕姿,编码格式是utf-8
url = "https://www.sogou.com/web?query=孙燕姿&ie=utf8"
#发送请求,requests即使请求url携带参数,也同样可以直接使用get函数对其发起请求
response = requests.get(url=url)
#获取响应页面数据
page_data = response.text
#持久化存储
with open('sunyanzi_re.html', 'w', encoding='utf-8') as f:
f.write(page_data)
第二种方式:
python
import requests
#指定URL,query后面是请求参数,参数先不写
url = "https://www.sogou.com/web"
#get方法其实还有一个params的参数,可以将参数使用字典的方式直接赋值
#将参数封装到字典中
params = {
"query": "孙燕姿",
"ie": "utf-8"
}
#使用get的params赋值
response = requests.get(url, params=params)
#查看响应状态码
print(response.status_code)
这里使用status_code返回请求的状态码,成功则为200。
3、requests模块get请求自定义请求头信息
requests模块自定义请求头信息和urllib类似:
python
import requests
#自定义请求头信息
url = "https://www.sogou.com/web"
#将参数封装到字典中
params = {
"query": "孙燕姿",
"ie": "utf-8"
}
#自定义请求头信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
}
#使用get的headers自定义请求头信息,将请求头信息赋值给headers
response = requests.get(url, params=params,headers=headers)
#获取页面响应数据
data_page = response.text
#持久化存储
with open("ff.html","w",encoding="utf-8") as f:
f.write(data_page)
三、基于requests模块发起post请求
- 需求:登陆豆瓣,获取登录成功后的页面数据
首先这里需要获取到登陆时的URL
查看数据表单,确认用户数据。(这里我发现豆瓣密码居然是明文传输的。)
python
import requests
#指定POST请求的URL
url = "https://accounts.douban.com/j/mobile/login/basic"
#封装post请求的data参数,data参数是账号密码信息,在浏览器中复制数据表单!
data = {
"remember": "true",
"name": "**",
"password": "**",
"ticket": "tr0kBmbIbu****vjIlOi6F7Q**",
"randstr": "**",
"tc_app_id": "204**"
}
#伪装UA
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
}
#发起post请求,调用post方法,第二个参数是data参数,第三个参数为自定义请求头信息
response = requests.post(url=url,data=data,headers=headers)
#获取响应对象中的页面数据
data_page = response.text
#持久化保存
with open("douban_re.html","w",encoding="utf-8") as f:
f.write(data_page)
四、quests模块的ajax的get请求
AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。
ajax是一种浏览器通过js异步发起请求,局部更新页面的技术。
Ajax请求的局部更新,浏览器地址栏不会发生变化
局部更新不会舍弃原来页面的内容
- 需求:抓取豆瓣电影上的详情数据
当然,首先还是得获取到一个ajax的请求。这里通过开发者工具抓取到get方式的URL
这里注意到URL是携带参数的,可以点开GET左边的箭头打开复制下面的参数。
python
import requests
#url携带参数,需要封装字典或者抽取到params中
#url = "https://movie.douban.com/j/chart/top_list?type=5&interval_id=100:90&action=&start=20&limit=20"
url = "https://movie.douban.com/j/chart/top_list"
#抽取参数,start表示从20开始获取,获取20个电影
params = {
"type": "5",
"interval_id": "100:90",
"action": "",
"start": "20",
"limit": "20"
}
#自定义请求头信息
heards = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0"
}
#发起请求,ajax依旧是get方法
response = requests.get(url=url,params=params,headers=heards)
data_page = response.text
print(data_page)
五、quests模块的ajax的post请求
- 需求:爬取肯德基城市餐厅位置数据
打开kfc官网
点击查询按钮,就可以看到一个异步的ajax请求
这里选择北京,点击查询并且抓取XHR就能抓取到这个ajax请求。
同样表单数据可以看到参数
python
import requests
#指定url
url = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname"
#处理URL
data = {
"cname": "北京",
"pid": "",
"pageIndex": "1",
"pageSize": "10"
}
#伪装UA
heards = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
}
#发起基于ajax的post请求
response = requests.post(url=url,params=data,headers=heards)
kfc = response.text
print(kfc)
拿到结果可以验证一下,这就是基于ajax的post请求。
六、初步总结
使用requests模块基于ajax的post和get请求和普通的get和post请求没有什么差别,唯一的不同是必须要基于抓包工具抓取异步请求的url。