requests介绍:
reqeusts模块:python原生一个基于网络请求的模块,模拟浏览器发起请求。
requests模块的优点:
- 1.自动处理url编码 - 2.自动处理post请求的参数 - 3.简化cookie的代理的操作: cookie操作: - 创建一个cookiejar对象 - 创建一个handler对象 - 创建一个operner 代理操作: - 创建handler对象,代理ip和端口封装到该对象 - 创建openner对象
reqeusts的使用流程:
- 安装:pip install requests - 使用流程: - 1.指定url - 2.使用requests模块发起请求 - 3.获取响应数据 - 4.进行持久化存储
requests的使用:
一、 requests基础用法:
1. 基于requests模块发起get请求
需求:爬取搜狗首页的页面数据
import requests #指定url url = 'https://www.sogou.com/' #发起get请求:get方法会返回请求成功的相应对象 response = requests.get(url=url) #获取响应中的数据值: page_data = response.text # text可以获取响应对象中 字符串 形式的页面数据 print(page_data) #持久化操作 with open('./sougou.html','w',encoding='utf-8') as fp: fp.write(page_data)
response对象其他的属性:
#response对象中其他重要的属性 import requests #指定url url = 'https://www.sogou.com/' # requests.get() :发起get请求:get方法会返回请求成功的相应对象 response = requests.get(url=url) # response.content 获取的是response对象中二进制(byte)类型的页面数据 #print(response.content) # response.status_code :返回一个响应状态码 #print(response.status_code) # response.headers :返回响应头信息 #print(response.headers) # response.url :获取请求的url #print(response.url)
requests 发送携带 参数 的 get 请求:
需求:指定一个词条,获取搜狗搜索结果所对应的页面数据
方式一:
import requests url = 'https://www.sogou.com/web?query=周杰伦&ie=utf-8' # 参数直接放到 url 中 response = requests.get(url=url) page_text = response.text with open('./zhou.html','w',encoding='utf-8') as fp: fp.write(page_text)
方式二:
import requests #自定义请求头信息 headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #指定url url = 'https://www.sogou.com/web' #封装get请求参数;放到一个字典中 prams = { 'query':'周杰伦', 'ie':'utf-8' } #发起请求 response = requests.get(url=url,params=param) # 设置 params=param response.status_code
自定义请求头信息:
import requests url = 'https://www.sogou.com/web' #将参数封装到字典中 params = { 'query':'周杰伦', 'ie':'utf-8' } #自定义请求头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } response = requests.get(url=url,params=params,headers=headers) # 设置 headers=headers 请求头 response.status_code
2. 基于requests模块发起的post请求:
需求:登录豆瓣网,获取登录成功后的页面数据
import requests #1.指定post请求的url url = 'https://accounts.douban.com/login' #封装post请求的参数;POST请求的请求体信息要放在一个字典中 data = { "source": "movie", "redir": "https://movie.douban.com/", "form_email": "15027900535", "form_password": "bobo@15027900535", "login": "登录", } #自定义请求头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #2.发起post请求 response = requests.post(url=url,data=data,headers=headers) # data=data 设置请求体信息 #3.获取响应对象中的页面数据 page_text = response.text #4.持久化操作 with open('./douban.html','w',encoding='utf-8') as fp: fp.write(page_text)
3.基于 Ajax的GET请求:
需求:抓取豆瓣电影上电影详情的数据
import requests url = 'https://movie.douban.com/j/chart/top_list?' #封装ajax的get请求中携带的参数;字典的形式 params = { 'type':'5', 'interval_id':'100:90', 'action':'', 'start':'100', 'limit':'20' } #自定义请求头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } response = requests.get(url=url,params=params,headers=headers) # params=params 设置 ajax 请求中携带的参数 print(response.text)
4. 基于 ajax的POST请求:
需求:爬去肯德基城市餐厅位置数据
import requests #1指定url post_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 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #2发起基于ajax的post请求 response = requests.post(url=post_url,headers=headers,data=data) # data=data 设置 ajax 请求体中的参数 response.text
5. 综合使用:
需求:爬取搜狗知乎某一个词条对应一定范围页码表示的页面数据
import requests import os #创建一个文件夹 if not os.path.exists('./pages'): os.mkdir('./pages') word = input('enter a word:') # 动态传入要爬取的词条 #动态指定页码的范围 start_pageNum = int(input('enter a start pageNum:')) end_pageNum = int(input('enter a end pageNum:')) #自定义请求头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #1.指定url:设计成一个具有通用的url url = 'https://zhihu.sogou.com/zhihu' for page in range(start_pageNum,end_pageNum+1): param = { 'query':word, 'page':page, 'ie':'utf-8' } response = requests.get(url=url,params=param,headers=headers) #获取响应中的页面数据(指定页码(page)) 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('第%d页数据写入成功'%page)
二、requests模块的高级用法:
1. reqeusts模块的cookie操作:
- cookie: 基于用户的用户数据 - 需求:爬取张三用户的豆瓣网的个人主页页面数据 - cookie作用:服务器端使用cookie来记录客户端的状态信息。 实现流程: 1.执行登录操作(获取cookie) 2.在发起个人主页请求时,需要将cookie携带到该请求中 注意:reqeusts模块的session对象:发送请求(会将cookie对象进行自动存储)
示例:
import requests session = requests.session() # 利用 requests.session() 去获取到一个 session 对象;该 session 对象能够保存服务器返回给客户端的cookie #1.发起登录请求:将cookie获取,切存储到session对象中 login_url = 'https://accounts.douban.com/login' data = { "source": "None", "redir": "https://www.douban.com/people/185687620/", "form_email": "15027900535", "form_password": "bobo@15027900535", "login": "登录", } headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #使用session发起post请求 login_response = session.post(url=login_url,data=data,headers=headers) # 利用 requests 的 session对象 发送 POST请求;通过服务器的校验后该 session对象会保存 cookie #2.对个人主页发起请求(session(cookie)),获取响应页面数据 url = 'https://www.douban.com/people/185687620/' response = session.get(url=url,headers=headers) # 利用 session对象 发送 GET请求(携带着cookie) page_text = response.text with open('./douban110.html','w',encoding='utf-8') as fp: fp.write(page_text) # 注意: 爬虫程序应该严格遵从浏览器的请求流程
2. requests模块的代理操作:
- 1.代理:第三方代理本体执行相关的事物。生活:代购,微商,中介 - 2.为什么要使用代理? - 很多网站有反爬操作; - IP代理是一种反反爬手段 - 3.分类: - 正向代理:代替客户端获取数据 (我们的爬虫用的是 正向代理) - 反向代理:代理服务器端提供数据 - 4.免费代理ip的网站提供商: - www.goubanjia.com (推荐用这个) - 快代理 - 西祠代理
示例:
import requests url = 'http://www.baidu.com/s?ie=utf-8&wd=ip' headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } #将代理ip封装到字典;代理的协议应该和 url 中的协议一致,如:都是 http proxy = { 'http':'77.73.69.120:3128' } #更换网路IP response = requests.get(url=url,proxies=proxy,headers=headers) # proxies=proxy 设置代理 with open('./daili.html','w',encoding='utf-8') as fp: fp.write(response.text)