一.Python安装教程
因此,我们推荐同学为自己在本地部署Python语言环境,安装Visual Studio Code(也称VSCode)编辑器,勤加练习!
我们为你准备了mac OS和Windows 10两个系统的安装包和安装攻略,mac OS请查看第一部分—— macOS系统安装攻略,Windows 10系统请下滑页面至第二部分——Windows系统安装攻略。
只需要根据自己电脑的系统,下载好安装包,再根据对应的步骤安装,同学就可以在自己的电脑与虚拟世界进行畅通无阻的对话啦~
1、 macOS系统安装攻略
1.1 安装Python环境
- 点击下载macOS版Python环境安装包(如果网络较慢,不要重复点击,请耐心稍等片刻哦)
- 系统设置
在【系统偏好设置】【安全性与隐私】中,勾选允许【App Store和被认可的开发者】选项
3.成功下载到本地后,双击打开安装包
4.安装选项
点击【继续】三次,选择【同意】,再次点击【继续】
5.安装完成
点击【继续】,选择【安装】。耐心等待一分钟左右,显示安装成功,点击【关闭】
1.2 验证python环境
1.在启动台中找到【其他】,打开【其他】,点击【终端】
2.在【终端】命令提示符后输入“python3”
3.点击回车。出现当前下载的版本号【Python 3.8.2】,就安装成功啦
退出并关闭终端
1.3 安装Visual Studio Code编辑器
1.点击下载macOS版Visual Studio Code安装包(如果网络较慢,不要重复点击,请耐心稍等片刻哦)
2.在下载中找到Visual Studio Code安装包,拖进应用程序
1.4 设置Visual Studio Code编辑器
1.将编辑器设置为中文环境
在应用程序中找到Visual Studio Code编辑器,双击打开
使用快捷键【command+shift+P】打开命令面板
点击配置显示语言【Configure Display Language】
2.点击安装其他语言【Install additional languages】
3.在侧边栏选择中文(简体),点击下载【Install】
安装完成,如果有其他窗口弹出直接关闭即可
4.再次使用快捷键【command+shift+P】打开命令面板, 点击配置显示语言【Configure Display Language】
5.点击刚刚下载好的中文(简体)【zh-cn】
6.点击重置【Restart】,完成汉化
7.在编辑器上安装Python拓展包
点开侧边栏里的【扩展】,在搜索框里输入“Python”,点击【安装】
8.恭喜你已经完成安装
2、Windows系统安装攻略
2.1 安装Python环境
1.点击下载Windows版Python环境安装包(如果网络较慢,不要重复点击,请耐心稍等片刻哦)
2.双击打开安装包
注意:安装之前需要关闭杀毒软件哦,比如360
- 勾选配置环境变量【Add Python 3.8 to PATH】,安装路径设置为全英文路径
如果安装路径中出现了中文,点击下方自定义【Customize installation】,重新选择一条全英文路径即可
点击立即安装【Install Now】
4. 耐心等待片刻,显示【Setup was successful】,安装完成
2.2 验证Python环境
- 使用快捷键【win键+R】打开【运行】,输入cmd ,点击确定
- 在命令提示符后输入“python”
- 点击回车,出现当前下载的版本号【Python 3.8.2】,安装成功
4.退出并关闭当前界面
2.3 安装Visual Studio Code编辑器
- 点击下载Windows版Visual Studio Code安装包(如果网络较慢,不要重复点击,请耐心稍等片刻哦)
2.双击打开安装包
注意:安装之前需要关闭杀毒软件哦,比如360
- 选择【我接受协议】,点击下一步
4.这里同样注意安装路径必须是全英文路径,如果安装路径中出现中文,则需要点击【浏览】重新选取一条全英文路径
点击下一步
5.继续点击下一步
6.在【其他快捷方式】下,勾选所有快捷方式,点击下一步
7.点击安装
- 点击完成
2.4 设置Visual Studio Code编辑器
1.将编辑器设置为中文环境
打开Visual Studio Code编辑器
使用快捷键【Ctrl+Shift+P】打开命令面板
点击配置显示语言【Configure Display Language】
2.点击安装其他语言【Install additional languages】
3.在侧边栏选择中文(简体),点击下载【Install】
安装完成,如果有其他窗口弹出直接关闭即可
4.再次使用快捷键【Ctrl+shift+P】打开命令面板, 点击配置显示语言【Configure Display Language】
5.点击刚刚下载好的中文(简体)【zh-cn】
6.点击重置【Restart】,完成汉化
7.在编辑器上安装Python拓展包
点开侧边栏里的【扩展】,在搜索框里输入“Python”,点击【安装】
8.恭喜你已经完成安装
二.如何入门 Python 爬虫?
「入门」是良好的动机,但是可能作用缓慢。如果你手里或者脑子里有一个项目,那么实践起来你会被目标驱动,而不会像学习模块一样慢慢学习。
另外如果说知识体系里的每一个知识点是图里的点,依赖关系是边的话,那么这个图一定不是一个有向无环图。因为学习 A 的经验可以帮助你学习 B。因此,你不需要学习怎么样「入门」,因为这样的「入门」点根本不存在!你需要学习的是怎么样做一个比较大的东西,在这个过程中,你会很快地学会需要学会的东西的。当然,你可以争论说需要先懂 python,不然怎么学会 python 做爬虫呢?但是事实上,你完全可以在做这个爬虫的过程中学习 python :D
1)首先你要明白爬虫怎样工作。
想象你是一只蜘蛛,现在你被放到了互联「网」上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫 initial pages,用$表示吧。
在人民日报的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了「国内新闻」那个页面。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个 html 放到了你身上。
突然你发现, 在国内新闻这个页面上,有一个链接链回「首页」。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊。所以,你需要用你的脑子,存下你已经看过的页面地址。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址。如果去过,那就别去了。
好的,理论上如果所有的页面可以从 initial page 达到的话,那么可以证明你一定可以爬完所有的网页。
下面分析一下为什么爬虫事实上是个非常复杂的东西——搜索引擎公司通常有一整个团队来维护和开发。
2)效率
如果你直接加工一下上面的代码直接运行的话,你需要一整年才能爬下整个豆瓣的内容。更别说 Google 这样的搜索引擎需要爬下全网的内容了。
问题出在哪呢?需要爬的网页实在太多太多了,而上面的代码太慢太慢了。设想全网有 N 个网站,那么分析一下判重的复杂度就是 N*log(N),因为所有网页要遍历一次,而每次判重用 set 的话需要 log(N)的复杂度。OK,OK,我知道 python 的 set 实现是 hash——不过这样还是太慢了,至少内使用效率不高。
通常的判重做法是怎样呢?Bloom Filter. 简单讲它仍然是一种 hash 的方法,但是它的特点是,它可以使用固定的内存(不随 url 的数量而增长)以 O(1)的效率判定 url 是否已经在 set 中。可惜天下没有白吃的午餐,它的唯一问题在于,如果这个 url 不在 set 中,BF 可以 100% 确定这个 url 没有看过。但是如果这个 url 在 set 中,它会告诉你:这个 url 应该已经出现过,不过我有 2% 的不确定性。注意这里的不确定性在你分配的内存足够大的时候,可以变得很小很少。一个简单的教程:Bloom Filters by Example
注意到这个特点,url 如果被看过,那么可能以小概率重复看一看(没关系,多看看不会累死)。但是如果没被看过,一定会被看一下(这个很重要,不然我们就要漏掉一些网页了!)。 [IMPORTANT: 此段有问题,请暂时略过]
好,现在已经接近处理判重最快的方法了。另外一个瓶颈——你只有一台机器。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈的话,那么你只有加快这个速度。用一台机子不够的话——用很多台吧!当然,我们假设每台机子都已经进了最大的效率——使用多线程(python 的话,多进程吧)。
3)集群化抓取
爬取豆瓣的时候,我总共用了 100 多台机器昼夜不停地运行了一个月。想象如果只用一台机子你就得运行 100 个月了…
那么,假设你现在有 100 台机器可以用,怎么用 python 实现一个分布式的爬取算法呢?
我们把这 100 台中的 99 台运算能力较小的机器叫作 slave,另外一台较大的机器叫作 master,那么回顾上面代码中的 url_queue,如果我们能把这个 queue 放到这台 master 机器上,所有的 slave 都可以通过网络跟 master 联通,每当一个 slave 完成下载一个网页,就向 master 请求一个新的网页来抓取。而每次 slave 新抓到一个网页,就把这个网页上所有的链接送到 master 的 queue 里去。同样,bloom filter 也放到 master 上,但是现在 master 只发送确定没有被访问过的 url 给 slave。Bloom Filter 放到 master 的内存里,而被访问过的 url 放到运行在 master 上的 Redis 里,这样保证所有操作都是 O(1)。(至少平摊是 O(1),Redis 的访问效率见:LINSERT – Redis)
考虑如何用 python 实现:
在各台 slave 上装好 scrapy,那么各台机子就变成了一台有抓取能力的 slave,在 master 上装好 Redis 和 rq 用作分布式队列。
其实你能想到,有人已经给你写好了你需要的:darkrho/scrapy-redis · GitHub
4)展望及后处理
虽然上面用很多「简单」,但是真正要实现一个商业规模可用的爬虫并不是一件容易的事。上面的代码用来爬一个整体的网站几乎没有太大的问题。
但是如果附加上你需要这些后续处理,比如
有效地存储(数据库应该怎样安排)
有效地判重(这里指网页判重,咱可不想把人民日报和抄袭它的大民日报都爬一遍)
有效地信息抽取(比如怎么样抽取出网页上所有的地址抽取出来,「朝阳区奋进路中华道」),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛…
及时更新(预测这个网页多久会更新一次)
如你所想,这里每一个点都可以供很多研究者十数年的研究。虽然如此,
「路漫漫其修远兮,吾将上下而求索」。
所以,不要问怎么入门,直接上路就好了:)
三.列举上述conda常用命令的具体用途及示例(部分)
查看conda版本:
命令:conda –version
用途:查看已安装的Conda的版本号。
示例:运行 conda –version,将显示Conda的版本号,如 “conda 4.10.3”。
查看conda信息:
命令:conda info
用途:显示当前Conda环境的详细信息,包括安装路径、默认环境、活动环境等。
示例:运行 conda info,将显示有关Conda配置的详细信息。
创建虚拟环境:
命令:conda create -n myenv python=x.x
用途:创建一个名为”myenv”的新虚拟环境,指定所需的Python版本。
示例:运行 conda create -n myenv python=3.8,将创建一个名为”myenv”的虚拟环境,并安装Python 3.8。
激活环境:
命令:conda activate myenv
用途:激活名为”myenv”的虚拟环境,以便在其中运行Python代码。
示例:运行 conda activate myenv,将切换到”myenv”环境。
退出当前环境:
命令:conda deactivate
用途:退出当前激活的虚拟环境,返回到基础环境。
示例:运行 conda deactivate,将退出当前虚拟环境。
查看环境列表:
命令:conda env list 或 conda info –envs
用途:列出所有已创建的Conda环境。
示例:运行 conda env list,将显示所有可用的虚拟环境。
安装包:
命令:conda install package_name
用途:安装指定的Python包或库。
示例:运行 conda install numpy,将安装NumPy包。
卸载包:
命令:conda uninstall package_name
用途:卸载已安装的Python包。
示例:运行 conda uninstall numpy,将卸载NumPy包。
总的来说,conda只是一个包管理工具,在你的代码之路上起着辅助作用,它不像编程语言那样难理解,我们经常使用的命令来来回回也就那几个,有时的遇到问题,大多也是和环境中的各种库的版本冲突有关的,在使用conda或者pip进行安装时,一定不要盲目的install,要多去网上看几篇帖子,增加自己的理解再去动手做。
下边我将附录几个conda常用的命令,欢迎大家在评论区说说自己的经验与见解,帮助小白尽快走上正轨。
conda常用命令
查看conda版本 conda –version
查看conda信息 conda info
创建虚拟环境
conda create -n myenv python=x.x
激活环境 conda activate myenv
退出当前环境 conda deactivate
查看环境列表
conda env list OR conda info –envs
安装包 conda instal package_name
卸载包 conda unintall package_name
更新conda conda update conda
更新所有已安装的包 conda update –all
列出环境中
已安装的包列表
conda list
搜索你要安装的
包的所有版本
conda search package_name
列出环境中某个包的信息 conda list package_name
删除环境 conda env remove –name myenv