Anaconda
- Anaconda 是一个集成环境(基于机器学习和数据分析的开发环境)
- 基于浏览器的一种可视化开发工具:jupyter notebook
- 可以在指定目录的终端中录入jupyter notebook指令,然后启动服务
- cell是分为不同模式的:
- Code:编写python代码
- markDown:编写笔记
- 快捷键:
- 添加cell:a,b
- 删除cell:x
- 执行:shift+enter
- 切换cell模式:
- m
- y
- 打开帮助文档:shift+tab
爬虫
通过编写程序模拟浏览器上网,然后让其去互联网上爬取数据的过程
爬虫的分类
-
通用爬虫:
- 爬取互联网中的一整张页面数据
-
聚焦爬虫:
- 爬取页面中的局部数据
-
增量式爬虫:
- 用来检测网站数据更新的情况,一遍爬取到网站最新更新出来的数据
- 用来检测网站数据更新的情况,一遍爬取到网站最新更新出来的数据
-
反爬机制
- UA检测:门户网站通过检测请求载体的身份识别判定该请求是否为爬虫发起的请求
- 动态加载:url不变,局部刷新数据
- cookie
- 验证码
- 添加隐藏的动态参数
- js混淆
- js加密
- 懒加载:应用到标签的伪属性
-
反反爬策略
- UA伪装:添加headers头信息,将User-Agent唯一标识传给请求
- 动态加载:查看局部刷新的ajax请求,也有可能是通过js发送的ajax
- cookie处理:
- 手动处理,添加到headers中
- 自动处理,创建一个session对象,该对象可以像requests一样进行请求发送。不同之处在于如果在session进行请求发送的过程中产生了cookie,则cookie会被自动存储到session对象中
- 通过一些验证码识别网站破解,推荐超级鹰,服务好
- 一般在原页面中能够查到隐藏参数
- 混淆的js可通过其他反混淆网址获得真实的js:http://www.bm8.com.cn/jsConfusion/
- PyExecJs可以让python运行js代码,同时需要安装NodeJs的环境才能使用
- 基于伪属性进行抓取
-
爬虫合法吗?
- 爬取数据的行为风险的体现:
- 爬虫干扰了被访问网站的正常运营;
- 爬虫抓取了收到法律保护的特定类型的数据或信息
- 规避风险:
- 严格遵守网站设置的robots协议
- 在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行
- 在使用、传播抓取信息时,应审查所爬取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密时,应及时停止并杀出
- 爬取数据的行为风险的体现:
-
robots协议:文本协议
- 网址/robots.txt
- 特性:防君子不防小人的文本协议
requests模块
python中封装好的一个基于网络请求的模块;用来模拟浏览器发请求
# 实现一个简单的网页采集器
import requests
url = 'https://www.sogou.com/web'
# 实现参数动态化
wd = input('enter a key:')
params = {
'query': wd
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
# 在请求中需要对请求参数对应的字典作用到params这个get方法的参数中
response = requests.get(url=url, params=params, headers=headers)
page_text = response.text
fileName = wd + '.html'
response.encoding = 'utf-8' # 修改响应数据的编码格式
with open(fileName, "w", encoding="utf-8") as fp:
fp.write(page_text)
动态加载页面爬取
如何判断页面是否存在动态加载数据
- 基于抓包工具
- 先捕获网站请求后的所有数据包
- 在数据包中定位到地址栏所对应请求的数据包,在response选项卡对应的数据中进行局部搜索。
- 可以搜索到:爬取的数据不是动态加载
- 没有搜索到:爬取的数据是动态加载的
- 定位动态加载数据在哪个数据包中
- 进行全局搜索
以豆瓣为例
url地址:https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action=
import requests
# 豆瓣电影爬取
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
}
start = input("从哪里开始捕获:")
limit = input("需要捕获多少:")
dic = {
'type': '13',
'interval_id': '100:90',
'action': '',
'start': start,
'limit': limit,
}
url = 'https://movie.douban.com/j/chart/top_list'
response = requests.get(url=url, params=dic, headers=headers)
page_text = response.json() # json()返回是序列化好的实例对象
for text in page_text:
print(f"电影名称为:{text['title']},评分为:{text['score']}")
post请求
以肯德基为例
url地址:http://www.kfc.com.cn/kfccda/storelist/index.aspx
import requests
# 肯德基地址爬取
# http://www.kfc.com.cn/kfccda/storelist/index.aspx
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
}
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
data = {
'cname': '',
'pid': '',
'keyword': '北京',
'pageIndex': '1',
'pageSize': '10',
}
response = requests.post(url=url, headers=headers, data=data)
print(response.json())