request模块
- 爬虫中一个基于网络请求的模块
- 作用:模拟浏览器发起请求
- 编码流程:
- 指定url
- 发起请求
- 获取响应数据(爬取到的页面源码数据)
- 持久化存储
爬取搜狗首页的页面源码数据1️⃣
见ipynb
实现一个简易网页采集器2️⃣
见ipynb
- 基于搜狗针对指定不同的关键字将其对应的页面数据进行爬取
参数动态化
- 如果请求的url携带参数,且我们想要将携带的参数进行动态化操作那么我们必须:
- 将携带的动态参数以键值对的形式封装到一个字典中
- 将该字典作用到get方法的params参数中即可
- 需要将原始携带参数的url中将携带的参数删除
#实现参数动态化:
params={
'query':keyWord
}
response = requests.get(url=url,params=params,headers=headers)
中文乱码
解决方法:
#修改响应数据的编码格式
#encoding返回的是响应数据的原始的编码格式,如果给其赋值则表示修改了响应数据的编码格式
response.encoding='utf-8'
page_text = response.text
UA被检测
- 第二种反爬机制:
- UA检测:网站后台会检测请求对应的user-agent,以判定当前请求是否为异常请求
- 反反爬策略:
- UA伪装:被作用到了大部分的网站中,日后我们写的爬虫程序都默认带上UA检测操作
- 伪装流程
- 从抓包工具中捕获到某一个基于浏览器请求的user-agent的值,将其伪装作用到一个字典中,将该字典作用到请求方法(get、,post)的headers参数中即可
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
response = requests.get(url=url,params=params,headers=headers)
爬取豆瓣电影中的电影详情数据3️⃣
动态数据的捕获
定义-动态加载的数据
- 我们通过requests模块进行数据爬取无法每次都实现可见即可得
- 有些数据是通过非浏览器地址栏中的url请求到的数据,而是其他请求请求到的数据,那么这些通过其他请求请求到的数据就是动态加载的数据
检测网页中是否存在动态数据
- 基于抓包工具进行局部搜索
- 选取第一个包(地址栏的url对应的数据包)
- 在Response栏目查看返回的包是否有我们想要的数据(比如“蝙蝠侠”)(在该数据包的response选项卡搜索我们想要爬取的数据,如果搜搜到了结果则表示数据不是动态加载的,否则表示数据位动态加载的)
捕获动态数据
-
基于抓包工具进行全局搜索(随意点击一个包 然后 ctrl+f)
-
定位到动态加载数据相应的数据包,从该数据包中就可以提取出
-
请求的url(可以删除后面的参数,另加参数params《见3》)
#网址,去掉后面的参数 url = 'https://movie.douban.com/j/chart/top_list'
-
请求方式
-
请求携带的参数
提示:复制后,将前面的键和值双击选中按单引号(‘),尾部加逗号(,)
params={ 'type': '5', 'interval_id': '100:90', 'action': '', #从第几部开始取和可以取几步 'start': '0', 'limit': '20', } response = requests.get(url=url,params=params,headers=headers)
-
看到响应数据
解析响应数据网址:https://www.json.cn/
先观察响应数据的格式后再去编写代码(json()、movie[‘title’]…)
#.json()将获取的字符串形式的json数据序列化成字典或者列表对象 page_text = response.json() #page_text #解析出电影的名称+评分 for movie in page_text: name = movie['title'] score = movie['score'] print(name,score)
- 思考:基于抓包工具进行全局搜索不一定可以每次都能定位到动态加载数据对应的数据包
- 原因:如果动态加载的数据是经过加密的密文数据。
分页数据的爬取4️⃣
Chrome(抓包工具)-XHR:将所有数据包当中基于Ajax请求的数据包
爬取POST,Ajax请求
-
在录入关键字的文本框中录入关键字按下搜索按钮,发起的是一个ajax请求
- 当前页面刷新出来的位置信息一定是通过ajax请求请求到的数据
-
基于抓包工具定位到该ajax请求的数据包,从该数据包中捕获到:
-
请求的url
-
请求方式
-
请求携带的参数
-
看到响应数据
-
分页爬取
-
观察参数
看到pageIndex随着页数的增加而增加
-
循环爬取
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' for page in range(1,8): data = { 'cname': '', 'pid': '', 'keyword': '北京', 'pageIndex': str(page), 'pageSize': '10', } ...
作业:国家药品监督局
- 爬取药监总局中的企业详情数据
- url:http://125.35.6.84:81/xk/
- 需求
- 将首页中每一家企业的详情数据进行爬取
- 每一家企业详情页对应的数据
- 将前5页企业的数据爬取即可
- 将首页中每一家企业的详情数据进行爬取
- 难点
- 用不到数据解析
- 所有的数据都是动态加载出来
- 提示:先试着将一家企业的详情页的详情数据爬取出来,然后再去爬取多家企业的数据