提交 8a7710bd 编写于 作者: J jackfrued

调整了目录结构,修订了部分文档

上级 2847d4f0
## 常见反爬策略及应对方案
1. 构造合理的HTTP请求头。
- Accept
- User-Agent - 三方库fake-useragent
```Python
from fake_useragent import UserAgent
ua = UserAgent()
ua.ie
# Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US);
ua.msie
# Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)'
ua['Internet Explorer']
# Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; GTB7.4; InfoPath.2; SV1; .NET CLR 3.3.69573; WOW64; en-US)
ua.opera
# Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11
ua.chrome
# Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2'
ua.google
# Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13
ua['google chrome']
# Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11
ua.firefox
# Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1
ua.ff
# Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1
ua.safari
# Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25
# and the best one, random via real world browser usage statistic
ua.random
```
- Referer
- Accept-Encoding
- Accept-Language
2. 检查网站生成的Cookie。
- 有用的插件:[EditThisCookie](http://www.editthiscookie.com/)
- 如何处理脚本动态生成的Cookie
3. 抓取动态内容。
- Selenium + WebDriver
- Chrome / Firefox - Driver
4. 限制爬取的速度。
5. 处理表单中的隐藏域。
- 在读取到隐藏域之前不要提交表单
- 用RoboBrowser这样的工具辅助提交表单
6. 处理表单中的验证码。
- OCR(Tesseract) - 商业项目一般不考虑
- 专业识别平台 - 超级鹰 / 云打码
```Python
from hashlib import md5
class ChaoClient(object):
def __init__(self, username, password, soft_id):
self.username = username
password = password.encode('utf-8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
def post_pic(self, im, codetype):
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {'userfile': ('captcha.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()
if __name__ == '__main__':
client = ChaoClient('用户名', '密码', '软件ID')
with open('captcha.jpg', 'rb') as file:
print(client.post_pic(file, 1902))
```
7. 绕开“陷阱”。
- 网页上有诱使爬虫爬取的爬取的隐藏链接(陷阱或蜜罐)
- 通过Selenium+WebDriver+Chrome判断链接是否可见或在可视区域
8. 隐藏身份。
- 代理服务 - 快代理 / 讯代理 / 芝麻代理 / 蘑菇代理 / 云代理
[《爬虫代理哪家强?十大付费代理详细对比评测出炉!》](https://cuiqingcai.com/5094.html)
- 洋葱路由 - 国内需要翻墙才能使用
```Shell
yum -y install tor
useradd admin -d /home/admin
passwd admin
chown -R admin:admin /home/admin
chown -R admin:admin /var/run/tor
tor
```
## 人工智能和机器学习概述
所谓“人工智能”通常是泛指让机器具有像人一样的智慧的技术,其目的是让机器像人一样能够感知、思考和解决问题;而“机器学习”通常是指让计算机通过学习现有的数据,实现认知的更新和进步。显然,机器学习是实现人工智能的一种途径,这也是我们的课程要讨论的内容。现如今,“机器学习”和“大数据”可以说是最时髦的两个词汇,而在弱人工智能阶段,无论是“机器学习”还是“大数据”最终要解决的问题本质上是一样的,就是让计算机将纷繁复杂的数据处理成有用的信息,这样就可以发掘出数据带来的意义以及隐藏在数据背后的规律,简单的说就是用现有的数据对将来的状况做出预测和判断。
在讨论机器学习相关内容之前,我们先按照问题的“输入”和“输出”对用计算机求解的问题进行一个分类,如下所示:
1. 输入的信息是精确的,要求输出最优解。
2. 输入的信息是精确的,无法找到最优解,只能获得满意解。
3. 输入的信息是模糊的,要求输出最优解。
4. 输入的信息是模糊的,无法找到最优解,只能获得满意解。
在上面的四大类问题中,第1类问题是计算机最擅长解决的,这类问题其实就是“数值计算”和“逻辑推理”方面的问题,而传统意义上的人工智能也就是利用逻辑推理来解决问题(如早期的“人机对弈”)。一直以来,我们都习惯于将计算机称为“电脑”,而基于“冯诺依曼”体系结构的“电脑”实际上只是实现了“人脑”理性思维这部分的功能,而且在这一点上“电脑”的表现通常是优于“人脑”的;但是“人脑”在处理模糊输入信息时表现出来的强大处理能力,在很多场景下“电脑”是难以企及的。所以我们研究机器学习的算法,就是要解决在输入模糊信息时让计算机给出满意解甚至是最优解的问题。
人类通过记忆和归纳这两种方式进行学习,通过记忆可以积累单个事实,使用归纳可以从旧的事实推导出新的事实。所以机器学习其实是一种训练,让计算机通过这种训练能够学会根据数据隐含模式进行合理推断的能力,其基本流程如下所示:
1. 观察一组实例,通常称为训练数据,它们可以表示某种统计现象的不完整信息;
2. 对观测到的实例进行扩展,并使用推断技术对扩展过程建模;
3. 使用这个模型对未知实例进行预测。
### 基本概念
#### 监督学习和非监督学习
监督学习是从给定的训练数据集中学习得到一个函数,当新的数据到来时,可以根据这个函数预测结果,监督学习的训练集包括输入和输出,也可以说是特征和目标。监督学习的目标是由人来标注的,而非监督学习的数据没有类别信息,训练集也没有人为标注结果,通过无监督学习可以减少数据特征的维度,以便我们可以使用二维或三维图形更加直观地展示数据中的信息 。
#### 特征向量和特征工程
#### 距离度量
1. 欧氏距离
$$
d = \sqrt{\sum_{k=1}^n(x_{1k}-x_{2k})^2}
$$
2. 曼哈顿距离
$$
d = \sum_{k=1}^n \mid {x_{1k}-x_{2k}} \mid
$$
3. 切比雪夫距离
$$
d = max(\mid x_{1k}-x_{2k} \mid)
$$
4. 闵可夫斯基距离
- 当$p=1$时,就是曼哈顿距离
- 当$p=2$时,就是欧式距离
- 当$p \to \infty$时,就是切比雪夫距离
$$
d = \sqrt[p]{\sum_{k=1}^n \mid x_{1k}-x_{2k} \mid ^p}
$$
5. 余弦距离
$$
cos(\theta) = \frac{\sum_{k=1}^n x_{1k}x_{2k}}{\sqrt{\sum_{k=1}^n x_{1k}^2} \sqrt{\sum_{k=1}^n x_{2k}^2}}
$$
### 机器学习的定义和应用领域
根据上面的论述,我们可以给“机器学习”下一个正式的定义:**机器学习是一门专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身性能的学科**。即使对于机器学习这个概念不那么熟悉,但是机器学习的成果已经广泛渗透到了生产生活的各个领域,下面的这些场景对于你来说一定不陌生。
场景1:搜索引擎会根据搜索和使用习惯,优化下一次搜索的结果。
场景2:电商网站会根据你的访问历史自动推荐你可能感兴趣的商品。
场景3:金融类产品会通过你最近的金融活动信息综合评定你的贷款申请。
场景4:视频和直播平台会自动识别图片和视频中有没有不和谐的内容。
场景5:智能家电和智能汽车会根据你的语音指令做出相应的动作。
简单的总结一下,机器学习可以应用到但不限于以下领域:
1. 计算机视觉。计算机视觉是指机器感知环境的能力,目前在[**物体检测**](https://pjreddie.com/darknet/yolo/)**人脸识别**这两个领域已经非常成熟且产生了大量的应用。
- 刷脸支付
![](res/face_paying.png)
- [涂鸦识别](https://quickdraw.withgoogle.com/)
![](res/quickdraw.png)
2. 自然语言处理(NLP)。自然语言处理是目前机器学习中一个非常热门的分支,具体的又可以分为三类应用场景。其中文本挖掘主要是对文本进行分类,包括句法分析、情绪分析和垃圾信息检测等;而机器翻译和语音识别相信不用太多的解释大家也都清楚。
- 文本挖掘
- 机器翻译
- 语音识别
![](res/xiaomi_ai_voice_box.png)
3. 机器人。机器人可以分为固定机器人和移动机器人两大类。固定机器人通常被用于工业生产,例如用于装配流水线。常见的移动机器人应用有货运机器人、空中机器人和自动载具。机器人需要软硬件的协作才能实现最优的作业,其中硬件包含传感器、反应器和控制器等,而软件主要是实现感知能力,包括定位、测绘、目标检测和识别等。
- 机甲大师
![](res/dajiang_robomaster.png)
- 扫地机器人
![](res/sweep_robot.jpg)
### 机器学习实施步骤
实现机器学习的一般步骤:
1. 数据收集
2. 数据准备
3. 数据分析
4. 训练算法
5. 测试算法
6. 应用算法
###
## k最近邻分类
$k$最近邻(简称kNN,k-Nearest Neighbor)是Cover和Hart在1968年提出的一种简单的监督学习算法,可用于字符识别、文本分类、图像识别等领域。kNN的工作机制非常简单:给定测试样本,基于某种距离度量(如:欧式距离、曼哈顿距离等)找出训练集中与其最接近的$k$个训练样本,然后基于这$k$个“最近邻居”的信息来进行预测。对于分类任务,可以在$k$个最近邻居中选择出现次数最多的类别标签作为预测的结果;对于回归任务,可以使用$k$个最近邻居实际输出(目标值)的平均值作为预测的结果,当然也可以根据距离的远近进行加权平均,距离越近的样本权重值就越大。
### 距离的度量
### 案例:电影分类预测
### k值的选择和交叉检验
k值的选择对于kNN算法的结果有非常显著的影响。下面用李航博士的《统计学习方法》一书中的叙述,来对k值的选择加以说明。
如果选择较小的$k$值,就相当于用较小的邻域中的训练实例进行预测,“学习”的近似误差会减小,只有与输入实例较近(相似的)训练实例才会对预测结果起作用;但缺点是“学习”的估计误差会增大,预测结果会对近邻的实例点非常敏感,如果近邻的实例点刚好是噪声,预测就会出错。换句话说,$k$值的减小就意味着整体模型变得复杂,容易发生**过拟合**
如果选择较大的$k$值,就相当于用较大的邻域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测起作用,使预测发生错误。对于$k=N$的极端情况(其中$N$代表所有的训练实例的数量),那么无论输入实例是什么,都会预测它属于训练实例中最多的类,很显然,这样的模型完全忽略了训练实例中大量的有用信息,是不可取的。
实际应用中,$k$的取值通常都比较小,可以通过交叉检验的方式来选择较好的$k$值。
## 机器学习基础
所谓“机器学习”就是利用计算机将纷繁复杂的数据处理成有用的信息,这样就可以发掘出数据带来的意义以及隐藏在数据背后的规律。现如今,“机器学习”和“大数据”可以说是IT行业中最热点的两个词汇,而无论是“机器学习”还是“大数据”最终要解决的问题本质上是一样的,用最为直白的话来说就是用现有的数据去预测将来的状况。
按照问题的“输入”和“输出”,我们可以将用计算机解决的问题分为四大类:
1. 输入的信息是精确的,要求输出最优解。
2. 输入的信息是精确的,无法找到最优解。
3. 输入的信息是模糊的,要求输出最优解。
4. 输入的信息是模糊的,无法找到最优解。
在上面的四大类问题中,第1类问题是计算机最擅长解决的,这类问题其实就是“数值计算”和“逻辑推理”方面的问题,而传统意义上的人工智能也就是利用逻辑推理来解决问题(如早期的“人机对弈”)。一直以来,我们都习惯于将计算机称为“电脑”,而基于“冯诺依曼”体系结构的“电脑”实际上只是实现了“人脑”理性思维这部分的功能,而且在这一点上“电脑”通常是优于“人脑”的,而“人脑”在处理输入模糊信息时表现出来的强大的处理能力,在今天看来也不是“电脑”可以完全企及的。所以我们研究人工智能也好,研究机器学习也好,是希望输入模糊信息时,计算机能够给出满意的甚至是最优的答案。
至此,我们可以给“机器学习”下一个定义:机器学习是一门专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身性能的学科。机器学习目前已经广泛的应用到生产生活的各个领域,以下列举了一些经典的场景:
1. 搜索引擎:根据搜索和使用习惯,优化下一次搜索的结果。
2. 电商网站:自动推荐你可能感兴趣的商品。
3. 贷款申请:通过你最近的金融活动信息进行综合评定。
4. 图像识别:自动识别图片中有没有不和谐的内容。
机器学习可以分为监督学习和非监督学习。监督学习是从给定的训练数据集中学习得到一个函数,当新的数据到来时,可以根据这个函数预测结果,监督学习的训练集包括输入和输出,也可以说是特征和目标。监督学习的目标是由人来标注的,而非监督学习的数据没有类别信息,训练集也没有人为标注结果,通过无监督学习可以减少数据特征的维度,以便我们可以使用二维或三维图形更加直观地展示数据信息 。
实现机器学习的一般步骤:
1. 数据收集
2. 数据准备
3. 数据分析
4. 训练算法
5. 测试算法
6. 应用算法
...@@ -8,40 +8,36 @@ ...@@ -8,40 +8,36 @@
![](./res/python-qq-group.png) ![](./res/python-qq-group.png)
### Python应用领域和就业形势分析 ### Python应用领域和职业发展分析
简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。 简单的说,Python是一个“优雅”、“明确”、“简单”的编程语言。
- 学习曲线低,非专业人士也能上手 - 学习曲线低,非专业人士也能上手
- 开源系统,拥有强大的生态圈 - 开源系统,拥有强大的生态圈
- 解释型语言,完美的平台可移植性 - 解释型语言,完美的平台可移植性
- 支持面向对象和函数式编程 - 动态类型语言,支持面向对象和函数式编程
- 能够通过调用C/C++代码扩展功能
- 代码规范程度高,可读性强 - 代码规范程度高,可读性强
目前几个比较流行的领域,Python都有用武之地。 Python在以下领域都有用武之地。
- 云基础设施 - Python / Java / Go - 后端开发 - Python / Java / Go / PHP
- DevOps - Python / Shell / Ruby / Go - DevOps - Python / Shell / Ruby
- 网络爬虫 - Python / PHP / C++ - 数据采集 - Python / C++ / Java
- 数据分析挖掘 - Python / R / Scala / Matlab - 量化交易 - Python / C++ / R
- 机器学习 - Python / R / Java / Lisp - 数据科学 - Python / R / Julia / Matlab
- 机器学习 - Python / R / C++ / Julia
- 自动化测试 - Python / Shell
作为一名Python开发者,主要的就业领域包括: 作为一名Python开发者,根据个人的喜好和职业规划,可以选择的就业领域也非常多。
- Python服务器后台开发 / 游戏服务器开发 / 数据接口开发工程师 - Python后端开发工程师(服务器、云平台、数据接口)
- Python自动化运维工程师 - Python运维工程师(自动化运维、SRE、DevOps)
- Python数据分析 / 数据可视化 / 大数据工程师 - Python数据分析师(数据分析、商业智能、数字化运营)
- Python数据挖掘工程师(机器学习、深度学习、算法专家)
- Python爬虫工程师 - Python爬虫工程师
- Python聊天机器人开发 / 图像识别和视觉算法 / 深度学习工程师 - Python测试工程师(自动化测试、测试开发)
下图显示了主要城市Python招聘需求量及薪资待遇排行榜(截止到2018年5月)。 > **说明**:目前,**数据分析是一个非常热门的方向**,因为不管是互联网行业还是传统行业都已经积累了大量的数据,现在需要的就是从这些数据中提取有价值的信息,以便打造更好的产品或者为将来的决策提供支持。
![Python招聘需求及薪资待遇Top 10](./res/python-top-10.png)
![](./res/python-bj-salary.png)
![](./res/python-salary-chengdu.png)
给初学者的几个建议: 给初学者的几个建议:
...@@ -381,6 +377,8 @@ ...@@ -381,6 +377,8 @@
#### Day80 - [推荐系统实战](./Day71-90/80.推荐系统实战.md) #### Day80 - [推荐系统实战](./Day71-90/80.推荐系统实战.md)
### Day81~90 - 大数据分析实战
### Day91~100 - [团队项目开发](./Day91-100) ### Day91~100 - [团队项目开发](./Day91-100)
#### 第91天:[团队项目开发的问题和解决方案](./Day91-100/91.团队项目开发的问题和解决方案.md) #### 第91天:[团队项目开发的问题和解决方案](./Day91-100/91.团队项目开发的问题和解决方案.md)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册