爬虫初始
一.爬虫初始?
1.1 什么是爬虫?
就是通过编写程序模拟浏览器上网,让其去互联网中抓取数据的过程。
1.2 爬虫分类?
1.通用爬虫:爬取一整张页面源码数据。
2.聚焦爬虫:爬取页面中局部的数据。一定是在通用爬虫的基础上实现。
3.增量式爬虫:用来监测网站数据更新的情况。以便于爬取最新更新出来的数据!
1.3 爬虫合法性探究
- 爬虫的风险体现
1.爬虫干扰了被访问网站的正常运营;
2.爬虫抓取了受到法律保护的特定类型的数据或信息。
- 如何规避风险
1.严格遵守网站设置的robots协议;
2.在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;
3.在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除。
1.4 反爬机制
- robots
- UA伪装
- 动态变化的请求参数
- 验证码
- cookie
- 代理
- 动态加载的数据
- js加密
- js混淆
- 图片懒加载
1.5 判断是否为动态加载数据?
-
概念:通过其他/另一个请求请求到的数据
-
特性:可见非可得
-
判定相关的页面数据是否为动态加载的数据?
- 基于抓包工具定位到浏览器地址栏url对应的请求数据包,进行局部搜索:
- 搜索到:这组被搜索的数据不是动态加载的,可以直接爬取 - 没有搜到:这组数据是动态加载的,不可以直接爬取。
-
如何捕获动态加载的数据?
- 基于抓包工具进行全局搜索,最终可以定位到动态加载数据对应的数据包。
二.requests模块基本使用
2.1 简单使用
-
基于网络请求的模块
-
作用:模拟浏览器发送请求
-
分析requests的请求流程
1.指定url 2.发起请求 3.获取响应数据 4.持久化存储
简单使用
import requests #1.指定url url = 'https://www.sogou.com/' #2.发起请求,get的返回值是一个响应对象 response = requests.get(url) #3.获取响应数据,text属性返回的是字符串形式的响应数据 page_text = response.text #4,持久化存储 with open('./sogou.html','w',encoding='utf-8') as fp: fp.write(page_text)
2.2 乱码解决
url = 'https://www.sogou.com/web?query=人民币'
response = requests.get(url)
#修改响应数据的编码格式
response.encoding = 'utf-8'
page_text = response.text
with open('./人民币.html','w',encoding='utf-8') as fp:
fp.write(page_text)
2.3 反爬机制(UA检测)+反反爬策略(UA伪装)
- UA伪装的实现:
- 定义一个字典
- 在字典中进行相关请求头信息的伪装
- 将字典应用的get方法的headers参数中即可
url = 'https://www.sogou.com/web?query=人民币'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
response = requests.get(url,headers=headers)#UA伪装
#修改响应数据的编码格式
response.encoding = 'utf-8'
page_text = response.text
with open('./人民币.html','w',encoding='utf-8') as fp:
fp.write(page_text)
2.4 get/post请求
- get请求(三个参数:url、params、headers)
url = 'https://movie.douban.com/j/chart/top_list'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
param = {
'type': '13',
'interval_id': '100:90',
'action': '',
'start': str(i*20),
'limit': '20',
}
response = requests.get(url=url,params=param,headers=headers)
- post请求(三个参数:url、headers、data)
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
data = {
'cname': '',
'pid': '',
'keyword': '广州',
'pageIndex': '1',
'pageSize': '10',
}
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
response = requests.post(url=url,headers=headers,data=data)
pos_data = response.json()
pos_data
2.5 返回值
- response.text、response.json,response.content
1.要获取页面中的所有数据:response.text
2.如果页面请求到的数据为json格式:response.json
3.如果爬取是图片(二进制),要用到response.content,用来返回二进制类型的响应数据
三. urllib模块基本使用
在这里,我们对图片(二进制)数据进行爬取来区别requests和urllib模块的区别
3.1 requests
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
}
url = 'http://duanziwang.com/usr/uploads/2019/02/3334500855.jpg'
pic_data = requests.get(url=url,headers=headers).content #content返回的是二进制类型的响应数据
with open('1.jpg','wb') as fp:
fp.write(pic_data)
3.2 urllib
import urllib
url = 'http://duanziwang.com/usr/uploads/2019/02/3334500855.jpg'
urllib.request.urlretrieve(url=url,filename='./2.jpg')
3.3 区别
1.urllib就是一个低版本的requests
2.requests可以进行UA伪装,urllib不行
抓包工具中response中显示的页面源码和开发者工具的Element选项卡显示的页面源码的区别是什么?
- Element:显示的页面源码内容是当前网页加载完毕后对应的所有数据(包含动态加载的数据)
- response:显示的内容仅仅是当前一个请求请求到的数据(不包含动态加载的数据)