一、Python简介
Python 是一种易于学习又功能强大的编程语言。它提供了高效的高层次的数据结构,还有简略无效的面向对象编程个性。Python 优雅的语法和动静类型,以及解释型语言的实质,使它成为诸多畛域脚本开发的现实语言。
同时,Python 解释器易于扩大,能够应用 C 或 C++(或者其余能够从 C 调用的语言)扩大新的性能和数据类型,并且Python还能够用作可定制化软件中的扩大程序语言。除此之外,少数平台上的 Python 解释器以及丰盛的规范库的源码和可执行文件,都能够在 Python 官网 收费自在地进行下载。
和其余脚本语言一样,Python 自身也是由诸多其余语言倒退而来,并且借鉴了包含 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其余的脚本语言的诸多长处。相比其余的脚本语言,Python具备如下的一些特点:
- 易于学习和浏览:Python有绝对较少的关键字,构造简略,和一个明确定义的语法,学习起来更加简略,并且Python的代码构造简略且易于浏览。
- 易于保护:Python的胜利在于它的源代码是相当容易保护的。
- 宽泛的规范库反对:Python的最大的劣势之一是领有丰盛的跨平台的规范库,并且在UNIX,Windows和Macintosh兼容很好。
- 弱小的可扩大能力:如果你想要编写一些不愿凋谢的算法或者模块,你能够应用C或C++实现相应性能开发,而后在你的Python程序中调用。
- 可移植:基于其凋谢源代码的个性,Python反对多平台移植。
- 数据库反对:Python提供所有次要的商业数据库的接口。
- GUI编程:Python反对GUI编程,并且开发的程序能够移植到多个零碎中应用。
二、MAC 平台装置Python
Mac OS X 10.8以上的零碎都附带装置了Python 2.7,不过Python 2.7曾经很旧,很多API不反对。 倡议从 Python 网站( https://www.python.org )装置 Python 3.7及以上版本 。
装置实现之后的货色有:
- 会有一个 Python 3.9 文件夹在你的 Applications 文件夹中。 在这里你能够找到 IDLE,它是作为官网 Python 发行版规范组成部分的开发环境;以及 PythonLauncher,它负责解决在 Finder 中双击 Python 脚本的操作。
- 框架 /Library/Frameworks/Python.framework ,包含 Python 可执行文件和库。安装程序将此地位增加到 shell 门路,Python 可执行文件的符号链接放在 /usr/local/bin/ 中。
同时,Apple 提供的 Python 版本别离装置在/System/Library/Frameworks/Python.framework 和 /usr/bin/python 中。须要阐明的是,永远不要批改或删除这些内容,因为它们由 Apple 管制并由 Apple 或第三方软件应用。
期待Python装置实现,而后关上零碎的./bash_profile文件注册Python,在终端执行open -e .bash_profile
命令关上.bash_profile文件,而后增加如下脚本:
export PATH="/Library/Frameworks/Python.framework/Versions/3.9/bin:${PATH}"
而后,再终端执行如下脚本命令。
alias python="/Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9"source .bash_profile
执行实现之后,在应用 python -V
查看最新版本就能够看到曾经更新了。
三、开发工具
反对Python开发的工具有Jupyter notebook、Pycharm、Subllime/Vs code/Atom + kite等。
3.1 Jupyter notebook
Jupyter Notebook是以网页的模式关上,能够在网页页面中间接编写代码和运行代码,代码的运行后果也会间接在代码块下显示。通过pip装置之后在命令行输出jupyter notebook会在默认浏览器关上。在有些Python开发者眼里,jupyter notebook是最好的IDE,因为它把Python的交互式个性施展到了极致,它次要有如下长处:
- 可共享
- 反对40多种编程语言
- 轻量
- 交互式
- 优良的可视化服务
- 反对Markdown
装置参考:Jupyter Notebook介绍、装置及应用教程
3.2 Pycharm
PyCharm是由JetBrains打造的一款Python IDE,VS2010的重构插件Resharper就是出自JetBrains之手。和其余的开发一样,PyCharm反对常见的代码补全、智能提醒、语法查看,这个软件都反对,除此之外,还集成了版本控制、单元测试、git性能,能够疾速创立Django,Flask等Python Web框架,应用起来十分不错,在开发大型项目中常常会用到,惟一的毛病就是,启动起来有些卡,还不是收费的,不过能够下载社区免费版的。对于免费版的问题,能够应用我上面的形式破解:JetBrain有限重置30天试用期技巧。
3.3 Subllime/Vs code/Atom + kite
Sublime Text这是一个轻量级的代码编辑器,跨平台,反对几十种编程语言,包含Python,Java,C/C++等,玲珑灵便,运行轻快,反对代码高亮、主动补全、语法提醒,插件扩大丰盛,是一个很不错的代码编辑器,配置相干文件后,可间接运行python程序。
VS Code这是微软开发的一个跨平台的代码编辑器,反对常见的编程语言开发,插件拓展丰盛,不仅智能补全、语法查看、代码高亮,还反对git性能,运行晦涩,是一个很不错的代码编辑器,装置相干插件后,可间接运行python程序。
Atom这是github专门为程序员开发的一个代码编辑器,也是款平台的,界面简洁直观,应用起来十分不便,主动补全、代码高亮、语法提醒,启动运行速度较快,对于初学者来说,是一个很不错的代码编辑器。
四、运行Python
目前,有三种形式能够运行Python:
4.1 交互式解释器
咱们能够通过命令行窗口进入 Python,而后在交互式解释器中开始编写 Python 代码,而后能够在 Unix、DOS 或任何其余提供了命令行或者 shell 的零碎进行 Python 编码工作。
$ python # Unix/Linux或者C:>python # Windows/DOS
Python命令行常见的参数有:
- -d:在解析时显示调试信息
- -O:生成优化代码 ( .pyo 文件 )
- -S:启动时不引入查找Python门路的地位
- -V:输入Python版本号
- -X:从 1.6版本之后基于内建的异样(仅仅用于字符串)已过期
- -c cmd 执行 Python 脚本,并将运行后果作为 cmd 字符串
- file 在给定的python文件执行python脚本
4.2 命令行脚本
在应用程序中通过引入解释器能够在命令行中执行Python脚本,如下所示:
$ python script.py # Unix/Linux或者C:>python script.py # Windows/DOS
留神:在执行脚本时,请留神查看脚本是否有可执行权限。
4.3 集成开发环境
PyCharm 是由 JetBrains 打造的一款 Python IDE,反对 macOS、 Windows、 Linux 零碎,点击面板上的运行按钮就能够运行Python程序了。
五、应用Requests实现网页爬虫
5.1 网络爬虫基本原理
所谓爬虫,是一种依照肯定的规定,主动地抓取万维网信息的程序或者脚本。其背地的基本原理是爬虫程序向指标服务器发动 HTTP 申请,而后指标服务器返回响应后果,爬虫客户端收到响应并从中提取数据,再进行数据荡涤、数据存储工作。
所以,网络爬虫也是一个 HTTP 申请的过程。以浏览器拜访一个网址为例,从用户输出 URL 开始,客户端通过 DNS 解析查问到指标服务器的 IP 地址,而后与之建设 TCP 连贯,连贯胜利后,浏览器结构一个 HTTP 申请发送给服务器,服务器收到申请之后,从数据库查到相应的数据并封装成一个 HTTP 响应,而后将响应后果返回给浏览器,浏览器对响应内容进行数据解析、提取、渲染并最终展现到用户背后。残缺的流程如下:
须要阐明的是,HTTP 协定的申请和响应都必须遵循固定的格局,只有遵循对立的 HTTP 申请格局,服务器能力正确解析不同客户端发的申请,同样地,服务器遵循对立的响应格局,客户端才得以正确解析不同网站发过来的响应。
5.2 网页爬虫例子
Python 提供了十分多工具去实现 HTTP 申请,但第三方开源库提供的性能更丰盛,开发者无需从 Socket 通信开始编写。
发动申请之前,首先要构建申请对象 Request,指定 url 地址、申请办法、申请头,这里的申请体 data 为空,因为咱们不须要提交数据给服务器,所以能够不指定。urlopen 函数会主动与指标服务器建设连贯,发送 HTTP 申请,该函数的返回值是一个响应对象 Response,外面有响应头信息,响应体,状态码之类的属性。
然而,Python 提供的这个内建模块过于低级,须要写很多代码,应用简略爬虫能够思考 Requests,Requests 在GitHub 有近30k的Star,是一个很Pythonic的框架。
上面是应用Python内建模块 urllib 申请一个 URL 代码示例代码。
import sslfrom urllib.request import Request, urlopendef print_hi(): context = ssl._create_unverified_context() request = Request(url="https://foofish.net/pip.html", method="GET", headers={"Host": "foofish.net"}, data=None) response = urlopen(request, context=context) headers = response.info() # 响应头 content = response.read() # 响应体 code = response.getcode() # 状态码 print(headers) print(content) print(code)if __name__ == '__main__': print_hi()
执行下面的代码,就能够看到在Python的控制台打印出了抓取到的信息:
接下来,让咱们来相熟一下Pythonic框架的应用流程和形式。
5.2.1 装置 requests
requests的装置很简略,应用pip 的install命令即可。
pip install requests
5.2.2 根本申请
GET申请
根底的GET申请比较简单,只须要应用requests的get()办法申请即可。
import requests url = '' headers = {'User-Agent':''} res = requests.get(url, headers=headers) res.encoding = 'utf-8' print(res.text)
POST申请
POST申请也很简略,只须要应用requests的post()办法申请即可。
... data = {} res = requests.post(url, headers=headers, data=data) ...
5.2.3 高级申请
申请参数
在前端开发中,GET申请带参数所需的参数是拼接在申请地址的前面的,而Python应用的GET申请则是应用params的形式。
... params = {} res = request.get(url, headers=headers, params = params) ...
指定Cookie
模式cookie登录:
... headers = { 'User-Agent' : '', 'Cookie' : '', } res = request.get(url, headers=headers) ...
Session
如果想和服务器始终放弃登录(会话)状态,而不用每次都指定 cookies,那么能够应用 session,Session 提供的API和 requests 是一样的。
import requestss = requests.Session()s.cookies = requests.utils.cookiejar_from_dict({"a": "c"})r = s.get('http://httpbin.org/cookies')print(r.text)# '{"cookies": {"a": "c"}}'r = s.get('http://httpbin.org/cookies')print(r.text)# '{"cookies": {"a": "c"}}'
客户端验证
Web客户端验证的时候,个别会带有auth字段,如下所示。
... auth = ('用户名', '明码') res = request.get(url, headers=headers, auth=auth) ...
设置超时
有时候,咱们须要给申请指定超时工夫,那么能够指定 timeout 字段来进行设置,如下所示。
requests.get('https://google.com', timeout=5)
设置代理
一段时间内发送的申请太多容易被服务器断定为爬虫,所以很多时候咱们应用代理IP来假装客户端的实在IP,比方。
import requestsproxies = { 'http': 'http://127.0.0.1:1080', 'https': 'http://127.0.0.1:1080',}r = requests.get('http://www.kuaidaili.com/free/', proxies=proxies, timeout=2)
5.2.3 小试牛刀
介绍了下面的根底之后,接下来咱们应用Requests实现一个爬取知乎专栏文章为例。 我是怎么找到的?就是一一点击左侧的申请,察看左边是否有数据呈现,那些以 .jpg,js,css 结尾的动态资源可间接疏忽,如下图。
这些对于前端开发来说,这都不是什么技巧。而后咱们将申请拷贝到浏览器,发现真的能够应用它获取对应的数据。接下来,咱们剖析一下这个申请是怎么形成的。
- 申请URL:https://www.zhihu.com/api/v4/members/6c58e1e8c4d898befed2fafeb98adafe/profile/creations/feed?type=answer&column_id=c_1413092853995851776
- 申请办法:GET
- Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Mobile Safari/537.36
- 查问参数:
type: answer
column_id: c_1413092853995851776
有了这些申请数据,咱们就能够应用requests这个库来构建一个申请,而后通过Python代码来抓取网络数据,如下所示。
import requestsclass SimpleCrawler: def crawl(self, params=None): # 必须指定UA,否则知乎服务器会断定申请不非法 url = "https://www.zhihu.com/api/v4/members/6c58e1e8c4d898befed2fafeb98adafe/profile/creations/feed" # 查问参数 params = {"type": 'answer', "column_id": 'c_1413092853995851776'} headers = { "authority": "www.zhihu.com", "user-agent": "Mozilla/5.0 (Linux; Android 6.0.1; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Mobile Safari/537.36", } response = requests.get(url, headers=headers, params=params) print("返回数据:", response.text) # 解析返回的数据 for follower in response.json().get("data"): print(follower)if __name__ == '__main__': SimpleCrawler().crawl()
而后,运行下面的代码,输入的后果如下:
下面是一个基于 Requests 的单线程爬虫,非常简单。通过这个例子,咱们明确了它的应用办法和流程。能够看到,requests 是非常灵活,申请头、申请参数、Cookie 信息都能够间接指定在申请办法中,返回值 response 如果是 json 格局能够间接调用json()办法返回 python 对象。