共计 6948 个字符,预计需要花费 18 分钟才能阅读完成。
一、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 ssl
from urllib.request import Request, urlopen
def 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 requests
s = 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 requests
proxies = {
'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 requests
class 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 对象。