1. requests 使用
- 爬虫是一个基于网络请求的模块
- requests
- 作用:模拟浏览器发起请求
- 编码流程:
- 指定要爬取的url
- 发起请求
- 获取响应数据(获取到的源码数据)
- 持久化存储
1.1 获取搜狗首页源码
#1,指定url
url = 'https://www.sogou.com/'
#2,发起请求get方法的返回值为响应对象
response = requests.get(url=url)
#3,获取响应数据
#.text:返回的是字符串形式的响应数据
page_text = response.text
#4,持久化存储
with open('./sougou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
1.2 简易网页采集器
- 基于搜狗针对指定不同的关键字将其对应的页面数据进行获取
- 参数动态化:
- 如果请求的url携带参数,且我们想要将携带的参数进行动态话操作需要:
- 将携带的动态参数以键值对的形式封装到一个字典中
- 将该字典作用到get()方法中的params参数中即可
- 需要将原始携带参数的的url中携带的参数删除
- 如果请求的url携带参数,且我们想要将携带的参数进行动态话操作需要:
keyWord = input('enter a key word:')
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
#携带了请求参数的url,如果想要爬取不同关键字对应的页面,我们需要将url携带的参数进行动态化
#实现参数动态化:
params = {
'query':keyWord
}
url = 'https://www.sogou.com/web'
#params参数(字典):保存请求时url携带的参数
#实现了UA伪装
response = requests.get(url=url,params=params,headers=headers)
#修改响应数据的编码格式
#encoding返回的是响应数据的原始的编码格式,如果给其赋值则表示修改了响应数据的编码格式
response.encoding = 'utf-8'
page_text = response.text
fileName = keyWord+'.html'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(fileName,'爬取完毕!!!')
2. ajax动态数据的获取
-
什么叫动态加载数据?
- 通过requests模块不能实现可见即可得
- 有些数据是通过非浏览器地址栏中的url请求到的数据,而是其他请求请求到的数据,那么这些通过其他请求得到的数据是动态加载的
-
如何检测网页中是否存在动态加载得数据?
- 基于抓包工具进行局部搜索
- 在当前网页中打开抓包工具,捕获到地址栏的url对应的数据包,在该数据包的response选项卡搜索我们想要爬取的数据,如果搜索到了结果则表示数据不是动态加载的,否则表示数据为动态加载的。
- 基于抓包工具进行局部搜索
-
如果数据为动态加载,那么我们如何捕获到动态加载的数据?
- 基于抓包工具进行全局搜索(比如某个数据是动态加载出来的,原始网页中没有,那么通过这个搜索就可以知道是在哪一个数据包中加载出来的。)
- 定位到动态加载数据对应的数据包,从该数据包中就可以提取出
- 请求的url、请求方式、请求携带的参数、看到响应数据
- 定位到动态加载数据对应的数据包,从该数据包中就可以提取出
- 基于抓包工具进行全局搜索不一定可以每次都能定位到动态加载数据对应的数据包?
- 因为动态加载的数据是可能是经过加密的密文数据
- 基于抓包工具进行全局搜索(比如某个数据是动态加载出来的,原始网页中没有,那么通过这个搜索就可以知道是在哪一个数据包中加载出来的。)
2.1 豆瓣
# 找到正确得url
url = 'https://movie.douban.com/j/chart/top_list'
# 携带得参数
params = {
'type': '5',
'interval_id': '100:90',
'action': '',
'start': '10',
'limit': '50',
}
# 确定请求方式
response = requests.get(url=url,params=params,headers=headers)
#.json()将获取的字符串形式的json数据序列化成字典或者列表对象
page_text = response.json()
#解析出电影的名称+评分
for movie in page_text:
name = movie['title']
score = movie['score']
print(name,score)
2.2 肯德基得餐厅位置信息
- 在录入关键字的文本框中录入关键字按下搜索按钮,发起的是一个ajax请求
- 当前页面刷新出来的位置信息一定是通过ajax请求请求到的数据
- 基于抓包工具定位到该ajax请求的数据包
#爬取多页
#爬取的是第一页的数据
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
for page in range(1,9):
data = {
'cname': '',
'pid': '',
'keyword': '北京',
'pageIndex': str(page),
'pageSize': '10',
}
#data参数是post方法中处理参数动态化的参数
response = requests.post(url=url,headers=headers,data=data)
page_text = response.json()
for dic in page_text['Table1']:
title = dic['storeName']
addr = dic['addressDetail']
print(title,addr)