一、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#指定urlurl = "https://www.sogou.com/"#发起get请求:get方法会返回请求成功后的相应对象response = requests.get(url=url)#获取相应中的数据值#text:相应对象中字符串形式的页面数据page_data=response.textprint(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#指定urlurl="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#指定urlurl="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#指定urlurl='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#指定urlurl = '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#指定urlurl = '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.textprint(page_text)
项目五、综合
#需求:爬取搜狗知乎某词条搜索结果前三页数据import requestsimport os# 创建文件夹if not os.path.exists('./pages'): os.mkdir('./pages')#指定urlurl = '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)