关于python:Python-爬虫开发入门

4次阅读

共计 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 对象。

正文完
 0