requests模块初识
- 什么是requests模块?
- python中封装好的一个基于网络请求的模块
- requests模块的作用是什么?
- 模拟浏览器发请求
- requests模块的环境安装:
- pip install requests
- requests模块的编码流程:
- 1.指定url(输入网址)
- 2.发起请求(按下回车)
- 3.获取响应数据
- 4.持久化存储
实例
1.爬取搜狗首页的页面源码数据
import requests
# 1.指定url
url = 'https://www.sogou.com/'
# 2.请求发送get:get返回值是一个相应对象
response = requests.get(url=url)
# 3.获取响应数据(在响应对象里)
page_text = response.text#返回的是字符串形式的响应数据
# 4.持久化存储
with open('sogou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
2.实现一个简易的网页采集器
import requests
# 让url携带的参数动态化
url='https://www.sogou.com/web'
# 实现参数动态化
wd = input('enter a key:')
params = {
'query':wd,
}
# 在请求中需要将请求参数对应的字典作用到get方法中的parmas参数中
response = requests.get(url=url,params=params)
page_text = response.text
filename = wd+'.html'
with open(filename,'w',encoding='utf-8') as fp:
fp.write(page_text)
-
上述代码执行后出现以下问题:
- 出现乱码
- 数据的量级不对
-
解决乱码
response.encoding = 'utf-8' #修改响应数据的编码格式
- 解决数据量级不对
- 乱码问题解决后发现请求到的是404页面,根本不是我们想要的数据
- 第二个反爬机制:UA检测
- 门户网站通过检测请求载体的身份标识判定该请求是否为爬虫发起的请求
- 解决方法:UA伪装
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'
}
# 修改请求参数中headers
response = requests.get(url=url,params=params,headers=headers)
3.爬取豆瓣电影的详情数据 https://movie.douban.com/typerank?type_name=爱情&type=13&interval_id=100:90&action=
-
当滚动条滑动到底部的时候,页面发生了局部刷新(ajax请求)
-
动态加载的页面数据
- 通过另一个单独的请求请求到的数据
- 直接对地址栏的url进行爬取是获取不到动态加载的数据的
-
分析
- 分析网页,滚轮下滑出现新数据而地址栏的url没有刷新,故得知其为局部刷新(ajax请求)
- 通过抓包XHR能获取到ajax请求的url
- 分析其请求头的键值对,并使其动态化
- 设置想要获取的数据,实现爬取动态的局部数据
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'
}
url = 'https://movie.douban.com/j/chart/top_list' # 抓包XHR获取到ajax请求的url
start = input('您想从第几部电影开始获取:')
limit = input('你想获取多少电影的数据:')
params_dic = {
'type': '13',
'interval_id': '100:90',
'action': '',
'start': start,
'limit': limit,
}
response = requests.get(url=url,headers=headers,params=params_dic)
page_text = response.json() #json方法返回的是反序列化好的实例对象
for dic in page_text:
print(dic['title'] + ':' + dic['score'])
4.肯德基餐厅信息查询(数据动态加载) http://www.kfc.com.cn/kfccda/storelist/
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'
}
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
keyword = input('请输入餐厅关键字:')
for page in range(1,5):
data = {
'cname': '',
'pid': '',
'keyword': keyword,
'pageIndex': page,
'pageSize': '10',
}
response = requests.post(url=url, headers=headers, data=data)
print(response.json())
如何检测页面中是否存在动态加载的数据?
- 基于抓包工具实现
- 先捕获网站请求后的所有数据包
- 在数据包中定位到地址栏所对应请求的数据包,在Response选项卡中进行局部搜索
- 可以搜索到则为非动态,反之为动态加载的
- 如何定位动态加载的数据在哪个数据包?
- 进行全局搜索