request模块
一、request模块简介
- 什么是requests模块
- python原生基于网络请求的模块,模拟浏览器发起请求。
- 为什么使用requests模块
- urllib需要手动处理url编码,使用quote()处理中文编码
- urllib需要手动处理post请求的参数,将请求参数封装到字典后用urlencode()处理,在用encode()进行编码
- urllib的cookie和代理操作比较繁琐
- cookie:
- 创建一个cookiejar对象
- 基于cookiejar创建一个handler对象
- 基于handler创建一个operner对象
- 基于operner发起请求
- 代理:
- 创建handler对象,代理ip和端口封装到该对象
- 创建openner对象,并发起请求
- cookie:
- requests模块如何使用
- 安装:pip install requests
- 使用流程:
- 指定url
- 使用requests模块发起请求
- 获取响应数据
- 进行持久化存储
二、基于项目进行学习
项目一、get请求
需求:获取sogou主页数据
import requests #指定url url = "https://www.sogou.com/" #发起get请求:get方法会返回请求成功后的相应对象 response = requests.get(url=url) #获取相应中的数据值 #text:相应对象中字符串形式的页面数据 page_data=response.text print(page_data) #持久化操作 with open("./sogou.html",'w','utf-8') as fp: fp.write(page_data)
response对象中重要属性:
- response.content:获取相应对象中二进制类型的页面数据
- response.text:字符串形式的页面数据
- response.status_code:返回响应状态码
- response.headers:获取响应头信息
- response.url:获取请求的url
requests模块带参get请求方式1
需求:指定一个词条,获取搜狗搜索结果对应的页面数据
import requests #指定url,url中携带中文,requests并不需要手动用quote()方法去处理 url="https://www.sogou.com/web?query=周杰伦&ie=utf8" #发起get亲求 response=requests.get(url=rul) #获取页面数据 page_text=response.text #持久化存储 with open('./sougou_art.html','w',encoding="utf-8") as fp: fp.write(page_text)
requests模块带参get请求方式2
#方式2,将参数封装到字典中 import requests #指定url url="https://www.sogou.com/web" #将参数封装到字典 params={ "query":"周杰伦", "ie":"utf-8" } #发起get亲求 response = requests.get(url=url,params=params) #持久化存储 with open("./sogou.html",'w',encoding='utf-8') as fp: fp.write(response.text)
requests模块自定义请求头的get请求
#自定义请求头信息 import requests #指定url url="https://www.sogou.com/web" #将参数封装到字典 params={ "query":"周杰伦", "ie":"utf-8" } #创建headers字典对象 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36' } #发起get请求,并传入headers字典对象 response=requests.get(url=url,params=params,headers=headers) response.status_code
项目二、post请求
#需求:登陆豆瓣网,获取登陆成功后的页面数据 import requests #指定url url='https://accounts.douban.com/j/mobile/login/basic' #制定post数据 data={ 'ck':None, 'name':'x@163.com', 'password':'1111111', 'remember':'false', 'ticket':None } #自定义headers[可选] headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36' } #发起post请求 response=requests.post(url=url,data=data,headers=headers) #获取相应对象中的页面数据 page_text=response.text #持久化保存 with open('./douban.html','w',encoding='utf-8') as fp: fp.write(page_text)
项目三、基于ajax的get
和普通的get请求类似,只是返回结果为json格式字符串
#需求:抓取豆瓣电影详情 import requests #指定url url = 'https://movie.douban.com/j/new_search_subjects' #封装参数 params={ 'sort': 'U', 'range': '0,10', 'tags':'', 'start': '1', 'genres': '动画' } #自定义请求头信息 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36' } response=requests.get(url=url,params=params,headers=headers) print(response.text)
项目四、基于ajax的post
和普通的post请求类似
#需求:爬取肯德基城市餐厅信息 import requests #指定url url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' #封装查询信息 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/70.0.3538.102 Safari/537.36' } #发起请求 response=requests.post(url=url,data=data,headers=headers) #获取数据结果 page_text=response.text print(page_text)
项目五、综合
#需求:爬取搜狗知乎某词条搜索结果前三页数据 import requests import os # 创建文件夹 if not os.path.exists('./pages'): os.mkdir('./pages') #指定url url = 'https://zhihu.sogou.com/zhihu' #自定义请求头信息 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36' } #指定关键字 word=input("Enter a search word:") #动态指定页码的范围 start_pageNum=int(input("Enter a start pageNum:")) end_pageNum=int(input("Enter a end pageNum:")) for page in range(start_pageNum,end_pageNum+1): #指定params params={ "query": word, "page": page, "ie": "utf8", } #发起请求 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 fp: fp.write(page_text) print("第%s页数据获取成功" % page)