anacanda
爬虫 第一天
课程简介
-
什么是anacanda
- 基于数据分析+ML(机器学习)的一个集成环境
-
什么是jupyter
- 就是anacanda提供的一个编辑环境(基于浏览器)
-
cell有两种模式
- code
- markdown
快捷键
-
插入cell:a,b
-
删除cell:x
-
执行cell:shift+enter
-
切换cell的模式:m,y
-
tab:自动补全
-
shift+tab:打开帮助文档
-
学习方法
- 总结结论
- user-agent:请求载体的身份标识
- 重复
- 讲
- 总结结论
爬虫
- requeests
- 数据解析
- 如何提升爬取数据的效率
- 线程池
- 多任务的异步携程
- scrapy
- 分布式
- 基于移动端数据的爬取
- selenium
数据分析:
- 将数据的价值最大化
ML
- 特征工程
- 机器学习的基础
- 回归模型
- 分类模型
- 集成学习
算法+数据结构
- stack
- 队列
- 链表
- 二叉树
- 二分查找
- 选择,冒泡
- 插入
- 希尔
- 快速
1.爬虫概述
- 什么是爬虫
- 通过编写程序模拟浏览器发请求,让其去互联网中爬取数据的过程。
- 爬虫分类
- 通用爬虫:抓取一整张页面源码的数据
- 聚焦爬虫:抓取一张页面中局部的数据
- 通用爬虫和聚焦爬虫之间的关联:
- 聚焦需要建立在通用爬虫的基础之上
- 通用爬虫和聚焦爬虫之间的关联:
- 增量式:监测网站数据更新的情况。以便将最新更新出来的数据进行爬取。
- 爬虫的合法性探究
- 爬虫所带来风险主要体现在以下2个方面:
- 爬虫干扰了被访问网站的正常运营;
- 爬虫抓取了受到法律保护的特定类型的数据或信息。
- 那么作为爬虫开发者,如何在使用爬虫时避免进局子的厄运呢?
- 严格遵守网站设置的robots协议;
- 在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;
- 在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除。
- 爬虫所带来风险主要体现在以下2个方面:
- 反爬机制
- robots协议:纯文本的协议。
- User-Agent:请求载体的身份标识
- 不遵从
- robots协议:纯文本的协议。
- 反反爬策略
2.requests基本介绍
-
作用:实现爬虫。模拟浏览器上网。
-
编码流程:
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
-
环境的安装:pip install reqeusts
-
将搜狗首页的页面源码数据进行爬取
In [4]:
import requests
#1.指定url
url = 'https://www.sogou.com/'
#2,发起请求
#get方法返回的是一个响应对象
response = requests.get(url=url)#根据指定的url发起get请求
#3.获取响应数据
page_text = response.text #test返回的是字符串形式的响应数据
#4.持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
- 简易的网页采集器
In [5]:
#请求参数动态化
wd = input('enter a key word:')
params = {
#url携带的请求参数
'query':wd
}
url = 'https://www.sogou.com/web'
#params参数:实现参数动态化
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)
print(fileName,'下载成功!!!')
enter a key word:jay
jay.html 下载成功!!!
- 上述程序出问题:
- 出现了乱码
- 数据量级不吻合
In [6]:
#处理乱码问题
wd = input('enter a key word:')
params = {
#url携带的请求参数
'query':wd
}
url = 'https://www.sogou.com/web'
#params参数:实现参数动态化
response = requests.get(url=url,params=params)
#手动修改响应数据的编码格式
response.encoding = 'utf-8'
page_text = response.text
fileName = wd+'.html'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(fileName,'下载成功!!!')
enter a key word:波晓张
波晓张.html 下载成功!!!
- 解决乱码问题发现了问题的所在:
- 我们发起的请求被搜狗识别成了一个异常的请求
- 异常的请求:不是浏览器发送的请求都是异常请求
- 我们发起的请求被搜狗识别成了一个异常的请求
- 反爬机制:UA检测
- 反反爬策略:UA伪装
In [8]:
#UA检测
wd = input('enter a key word:')
params = {
#url携带的请求参数
'query':wd
}
headers = {
#需要修改的请求头信息
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
url = 'https://www.sogou.com/web'
#params参数:实现参数动态化
response = requests.get(url=url,params=params,headers=headers)#UA伪装进行的请求发送
#手动修改响应数据的编码格式
response.encoding = 'utf-8'
page_text = response.text
fileName = wd+'.html'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(fileName,'下载成功!!!')
enter a key word:tom
tom.html 下载成功!!!
- 需求:爬取豆瓣电影中爱情类型中的电影详情数据
- 动态加载的数据:通过另一个请求单独请求到的数据
- 如何检测爬取的数据是否为动态加载的数据?
- 基于抓包工具进行局部搜索
- 抓包工具捕获到所有的数据包,然后找到浏览器地址栏url对应的数据包,response这个选项卡中进行局部搜索(搜到,搜不到)。
- 搜不到:数据为动态加载
- 基于抓包工具进行全局搜索
- 搜到:数据不是动态加载
- 直接对浏览器地址栏的url发起请求获取数据即可
- 搜不到:数据为动态加载
- 抓包工具捕获到所有的数据包,然后找到浏览器地址栏url对应的数据包,response这个选项卡中进行局部搜索(搜到,搜不到)。
- 基于抓包工具进行局部搜索
In [6]:
import requests
#UA检测会被应用在绝大数的网站中
headers = {
#需要修改的请求头信息
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
params = {
"type": "13",
"interval_id": "100:90",
"action": "",
"start": "10",
"limit": "200",
}
url = 'https://movie.douban.com/j/chart/top_list'
response = requests.get(url=url,headers=headers,params=params)
data_list = response.json()
for dic in data_list:
name = dic['title']
score = dic['score']
print(name,score)
. . .
- 需求:将餐厅的位置信息进行爬取
In [9]:
#捕获到了第一页对应的位置信息
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
city = input('enter a city name:')
data = {
"cname": '',
"pid": '',
"keyword": city,
"pageIndex": "1",
"pageSize": "10",
}
pos_list = requests.post(url=url,headers=headers,data=data).json()['Table1']#data参数是用来实现参数动态化
for dic in pos_list:
pos = dic['addressDetail']
print(pos)
enter a city name:北京
小营东路3号北京凯基伦购物中心一层西侧
朝阳路杨闸环岛西北京通苑30号楼一层南侧
黄寺大街15号北京城乡黄寺商厦
西四环北路117号北京欧尚超市F1、B1
北京经济开发区西环北路18号F1+F2
通顺路石园西区南侧北京顺义西单商场石园分店一层、二层部分
北京站一层
北京南站候车大厅B岛201号
北京北清路1号146区
海户屯北京新世纪服装商贸城一层南侧
In [10]:
#捕获所有页码对应的位置信息
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
city = input('enter a city name:')
#全站数据的爬取
for pageNum in range(1,9):
data = {
"cname": '',
"pid": '',
"keyword": city,
"pageIndex": str(pageNum),
"pageSize": "10",
}
pos_list = requests.post(url=url,headers=headers,data=data).json()['Table1']#data参数是用来实现参数动态化
for dic in pos_list:
pos = dic['addressDetail']
print(pos)
. . .
-
需求:所有企业的企业详情数据
-
分析:
- 1.每一家企业对应的详情数据是动态加载出来的
- 2.通过抓包工具进行了全局搜索,定位到了动态加载数据对应的数据包
- 提取出url:每一家企业对应的url都一样
- 请求方式:都一样
- 请求参数:都为id但是参数值不同
- id就是每一家企业的唯一标识
- 如果可以将每一家企业的唯一标识id值捕获到,最终需求就可以完成
- 对企业id值的捕获
- 在首页中进行分析,使用抓包工具进行了企业名称的全局搜索,定位到的数据包的数据中就包含了企业名称和对应的id值
In [11]:
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
data = {
'id':'3718324df7b94fb782f7e9bb5d185552'
}
requests.post(url=url,headers=headers,data=data).json()
. . .
In [16]:
#捕获企业id
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
ids = []
for pageNum in range(1,6):
data = {
"on": 'true',
'page': str(pageNum),
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname': '',
'applysn': '',
}
company_list = requests.post(url=url,headers=headers,data=data).json()['list']
for dic in company_list:
_id = dic['ID']
ids.append(_id)
. . .
In [17]:
#完整实现
#1.捕获到所有企业的id
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
ids = []
for pageNum in range(1,6):
data = {
"on": 'true',
'page': str(pageNum),
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname': '',
'applysn': '',
}
company_list = requests.post(url=url,headers=headers,data=data).json()['list']
for dic in company_list:
_id = dic['ID']
ids.append(_id)
#2.基于存储id的列表ids进行循环的请求发送
detail_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
for _id in ids:
data = {
'id':_id
}
company_data = requests.post(url=detail_url,headers=headers,data=data).json()
legalPerson = company_data['legalPerson']
address = company_data['epsProductAddress']
print(legalPerson,address)
. . .
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界