requests模块
-1. 什么是requests模块
- python原生的一个基于网络请求的模块,模拟浏览器发起请求。
-2. 为什么使用requests模块
-1. 自动处理url编码
-2. 自动处理post请求参数
-3. 简化cookie和代理的操作
-3. requests模块如何被使用
安装: pip install requests
使用流程:
1. 指定url
2. 使用requests模块发送请求
3. 获取响应数据
4. 进行持久化存储
-4. 通过5个基于requests模块的爬虫项目对该模块进行系统学习和巩固
-get请求
-post请求
-ajax的get
-ajax的post
-综合
基于requests模块发起get请求
- 需求:爬取搜狗首页的页面数据
import requests #指定url url= 'https://www.sogou.com/' #发起get请求:get方法会返回成功的响应对象 response = requests.get(url=url) # 获取响应中的数据值:text可以获取响应对象中字符串形式的页面数据 page_data = response.text #持久化操作 with open('sogo.html','w',encoding='utf-8') as f: f.write(page_data)
#response对象中其他重要属性 import requests #指定url url= 'https://www.sogou.com/' #发起get请求:get方法会返回成功的响应对象 response = requests.get(url=url) response.content #获取的是response对象中二进制(byte)类型的页面数据 response.status_code #返回一个响应状态码如200 或404 response.headers #返回响应头信息 response.url #获取请求的url
requests模块如何处理带参数的get请求(两种方式)
- 需求:指定一个词条,获取搜狗搜索结果对应的页面数据
#方式1 import requests url = 'http://www.sogou.com/web?query=金角大王&ie=utf-8' response = requests.get(url=url) page_text = response.text with open('jinjiao.html','w',encoding='utf-8') as f: f.write(page_text)
#方式2 import requests url = 'http://www.sogou.com/web' #将参数封装到字典中 params = { 'query':'金角大王', 'ie':'utf-8' } response = requests.get(url=url,params=params) page_text = response.text with open('jinjiao.html','w',encoding='utf-8') as f: f.write(page_text)
#自定义请求头信息 import requests url = 'http://www.sogou.com/web' #将参数封装到字典中 params = { 'query':'金角大王', 'ie':'utf-8' } #自定义请求头信息 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } response = requests.get(url=url,params=params,headers=headers) response.status_code
基于requests模块发起post请求
- 需求:登录豆瓣网,获取登录成功后的页面数据 - tip 如果找不到post请求,试试输错密码寻找 - 现在豆瓣改版了,只能获取到登录信息cookiesession等类型的东西。但是可以用request.session登录后继续获取页面
import requests #1 指定post请求的url url = 'https://accounts.douban.com/j/mobile/login/basic' #封装post请求的参数 data= { 'ck': '', 'name': '13520750458', 'password': '1123lys', 'remember': 'false', 'ticket':'', } #自定义请求头信息 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } #2 发起post请求 response = requests.post(url=url,data=data,headers=headers) #获取响应对象中的页面数据 page_text = response.text print(page_text) #持久化操作 with open('douban.html','w',encoding='utf-8') as f: f.write(page_text)
基于ajax的get请求
- 抓取豆瓣电影上的电影详情的数据
import requests #方式一 url = 'https://movie.douban.com/j/chart/top_list?type=20&interval_id=100%3A90&action=&start=80&limit=20' #自定义请求头信息 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } response = requests.get(url=url,headers=headers) # print(response.text) #返回的是json格式的数据
import requests #方式二 url = 'https://movie.douban.com/j/chart/top_list?' #封装ajax中get请求携带的参数 params={ 'type':'20', 'interval_id':'100:90', 'action':'', 'start':'80', 'limit':'20', } #自定义请求头信息 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } response = requests.get(url=url,params=params,headers=headers) # print(response.text) #返回的是json格式的数据
基于ajax的post请求
-需求 爬取肯德基城市餐厅的位置数据
import requests url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' # 处理post请求参数 data = { 'cname':'', 'pid':'', 'keyword':'北京', 'pageIndex':'1', 'pageSize':'10', } headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } #发起基于ajax的post请求 response = requests.post(url=url,data=data,headers=headers) response.text type(response.text)
总结
基于ajax的post和get请求和普通的get请求没什么区别,唯一不同就是获取url,ajax要用抓包工具去获取基于ajax的异步请求的url,因为ajax的地址栏的url不变的,必须去获取真正的url
requests模块高级(cookie操作):
- cookie:
基于用户的用户数据
- 需求: 爬取张三用户的豆瓣网的个人主页页面数据
- cookie作用:服务器端使用cookie来记录客户端的状态信息
实现流程:
1.执行登录操作(获取cookie)
2.在发起个人主页请求时,需要将cookie携带到该请求中
注意:session对象:发送请求(会将cookie对象进行自动存储)
import requests #创建session对象 session = requests.session() #1 发起登录请求:session对象将cookie获取,且自动存储到session对象中 login_url = 'https://accounts.douban.com/j/mobile/login/basic' data= { 'ck': '', 'name': '13520750458', 'password': '1123lys', 'remember': 'false', 'ticket':'', } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' } #使用session对象发起post请求 login_response = session.post(url=login_url,data=data,headers=headers) #2 对个人主页发起请求(session(cookie)),获取响应页面数据 url = 'https://www.douban.com/people/191748483/' response = session.get(url=url,headers=headers) page_text = response.text with open('douban110.html','w',encoding='utf-8')as f: f.write(page_text) print(page_text)
requests模块高级(代理操作):
- 1 代理:第三方代理本体执行相关的事物
- 2 为什么要使用代理?
-反爬手段
-反反扒手段
- 3 分类:
-正向代理:代理客户端获取数据
-反向代理:代替服务端提供数据
- 4 免费代理IP的网站提供商:
- www.goubanjia.com
- 快代理
- 西祠代理
- 5 代码
import requests url = 'https://www.baidu.com/s?wd=ip&ie=utf-8' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36' } #将代理ip封装到字典,(前面url的协议要与代理ip的协议类型相同,如都是https或http,如果不同需修改url的协议) proxy = { 'https':'222.74.237.246:808' } #更换网络ip response = requests.get(url=url,proxies=proxy,headers=headers) with open('./daili.html','wb')as f: f.write(response.content) print(response.content)
综合项目实战
-需求 爬取搜狗知乎某一个词条对应一定范围页码表示的页面数据
import requests import os # 创建一个文件夹 if not os.path.exists('./pages'): os.mkdir('./pages') word = input('enter a word') #动态指定页码范围 start_page = int(input('enter a start pageNum')) end_page = int(input('enter an end pageNum')) url = 'https://zhihu.sogou.com/zhihu?' headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } for page in range(start_page,end_page+1): params = { 'query':word, 'page':page, 'ie':'utf-8', } response = requests.get(url=url,params=params,headers=headers) page_text = response.text filename = word+str(page)+'.html' filePath = 'pages/'+filename with open(filePath,'w',encoding='utf-8') as f: f.write(page_text) print('第%s页写入成功'%page)