requests模块
- 基于如下5点展开requests模块的学习
- 什么是requests模块
- requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
- 为什么要使用requests模块
- 因为在使用urllib模块的时候,会有诸多不便之处,总结如下:
- 手动处理url编码
- 手动处理post请求参数
- 处理cookie和代理操作繁琐
- ......
- 使用requests模块:
- 自动处理url编码
- 自动处理post请求参数
- 简化cookie和代理操作
- ......
- 因为在使用urllib模块的时候,会有诸多不便之处,总结如下:
- 如何使用requests模块
- 安装:
- pip install requests
- 使用流程
- 指定url
- 基于requests模块发起请求
- 获取响应对象中的数据值
- 持久化存储
- 安装:
- 通过5个基于requests模块的爬虫项目对该模块进行学习和巩固
- 基于requests模块的get请求
- 需求:爬取搜狗指定词条搜索后的页面数据
- 基于requests模块的post请求
- 需求:登录豆瓣电影,爬取登录成功后的页面数据
- 基于requests模块ajax的get请求
- 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据
- 基于requests模块ajax的post请求
- 需求:爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据
- 综合练习
- 需求:爬取搜狗知乎指定词条指定页码下的页面数据
- 基于requests模块的get请求
1、基于requests模块的get请求--不带参数
- 需求:爬取搜狗首页数据
import requests # 1.指定url url = 'https://www.sogou.com/' # 不带参数 # 2.发起一个get请求,get方法会返回 请求成功后的响应对象 response = requests.get(url=url) # 3.获取响应中的数据值:text可以获取响应对象中的字符串形式的页面数据 page_data = response.text #print(page_data) # 持久化操作 with open('./sogou.html','w',encoding='utf-8')as f: f.write(page_data)
response对象中其他重要的属性
# response对象中其他重要的属性 import requests # 1.指定url--用于请求的目标网站 url = 'https://www.sogou.com/' # 2.发起一个get请求,get方法会返回 请求成功后的响应对象 response = requests.get(url=url) # content获取的是response对象中二进制(byte)类型的页面数据 #print(response.content) # 返回一个响应状态码 #print(response.status_code) # 返回响应头信息--字典的形式 #print(response.headers) # 获取请求的url print(response.url)
- requests模块如何处理携带参数的get请求
- 需求:指定一个词条,获取搜狗搜索结果所对应的页面数据
# 方式1 import requests # 1指定url url = 'https://www.sogou.com/web?query=周杰伦&ie=utf8' #带参数 # 获取响应对象 response = requests.get(url=url) page_text = response.text # 持久化存储 with open('./zhou.html','w',encoding='utf-8')as f: f.write(page_text) ------------------------------------------------------------------------- # 方式2: import requests url = 'https://www.sogou.com/web' # 将参数封装到字典中 params = {'query':'周杰伦','ie':'utf8'} response = requests.get(url=url,params=params) response.status_code #print(response.content)
requests--自定义请求头信息
# 自定义请求头信息 import requests url = 'https://www.sogou.com/web' # 将参数封装到字典中 params = {'query':'周杰伦','ie':'utf8'} # 自定义请求头信息 # 此处用的百度的UA headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; 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
request模块的post请求
需求:登录豆瓣电影,爬取登录成功后的页面数据---测试成功
点击登陆后
----------------------------------------------------------------------------------------------------------------------------
------------------------------------
import requests # 1.指定post请求的url url = 'https://accounts.douban.com/login' # 封装post请求的参数 data = {
'source':'movie',
'redir':'https://movie.douban.com/',
'form_email':'你的豆瓣邮箱',
'form_password':'你的登录密码',
'login':'登录',
} # 自定义请求头信息 # 此处用的百度的UA headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; 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) response.status_code # 3.获取响应对象的页面数据 page_text = response.text # 持久化存储 with open('./douban.html','w',encoding='utf-8')as f: f.write(page_text)
基于requests模块ajax的get请求
爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据
选择一个种类的电影:点击加载更多
点击加载更多--ajax异步-get请求--局部刷新
------------------------
import requests # url = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20' #指定ajax-get请求的url(通过抓包进行获取) url = 'https://movie.douban.com/j/search_subjects?' params = { 'type':'movie', 'tag':'热门', 'sort':'recommend', 'page_limit':'20', 'page_start':'20', } # 自定义请求头信息 # 此处用的百度的UA headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} response = requests.get(url=url,params=params,headers=headers) # 3.获取响应对象的页面数据 page_text = response.text print(page_text)
---------------------------------------
基于ajax的post请求
- 爬取肯德基餐厅查询http://www.kfc.com.cn/kfccda/index.aspx中指定地点的餐厅数据
点击查询是ajax异步请求,局部刷新
import requests 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 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} # 发起基于ajax的post请求 response = requests.post(url=post_url,data=data,headers=headers) # 3.获取响应对象的页面数据 page_text = response.text print(page_text)
综合实战
需求:爬取搜狗知乎指定词条指定页码下的页面数据
具有分页的爬取
http://zhihu.sogou.com/zhihu?query=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&page=2&ie=utf8
----------------------------------------------
# 前三页的数据{1,2,3} import requests import os # 创建一个文件夹 if not os.path.exists('./pages'): os.mkdir('./pages') # s搜索词条 word = input('enter a word') # 动态指定页码的范围 start_page = int(input('enter a start pageNum:')) end_page = int(input('enter a end pageNum')) # 1.指定url--设计成一个具有通用的url url = 'http://zhihu.sogou.com/zhihu' headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'} # 循环取页面值 -- page 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)) 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(f"第{page}页数据写入成功") # get ===>params # post===>data