Python 网络爬虫基础知识及体验

2019-07-13 23:01发布

概述

大佬都说我们已经从 IT 时代进入了 DT 时代,大数据已经深刻地影响人类社会,改变着我们的工作和生活。不知道谁说的:大数据是21世纪最重要的经济资源,未来最大的能源不是石油而是大数据! 虽然听起来有点不切实际,但作为一只好奇宝宝,还是很想知道大佬说的 Big Data 究竟是什么?如果获取这些宝贵的数据?如果利用这些数据产生更大的价值?这一切一切,我们将从 Python 网络爬虫学起… 在这里插入图片描述

什么是网络爬虫

网络爬虫(Web Spider)又称网络蜘蛛、网络机器人,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。网络爬虫就是一种高效的信息采集利器,利用它可以快速、准确地采集我们想要的各种数据资源,也就是说,网络爬虫是我们在 DT 时代获取数据的一种技术。 按照系统结构和实现技术,网络爬虫大致可以分为以下几种类型:
  • 通用网络爬虫
    爬取的目标资源在互联网中,爬取目标数据巨大,对爬取性能要求非常高。通常应用于大型搜索引擎中,具有很高的应用价值。
  • 聚焦网络爬虫
    将爬取目标定位在与主题相关的页面中,主要应用与特定领域的信息爬取,为特定群体提供服务。
  • 增量式网络爬虫
    只爬取内容发生变化的网页或者新产生的网页,因此爬虫在一定程度上能保证所爬取的网页尽可能是新的网页。这里的 “增量式” 指的是在更新的时候只更新改变的地方,而未改变的地方则不更新。
  • 深层网络爬虫
    表层网页指的是不需要提交表单,使用静态的链接就能够到达的静态网页;深层网页指的是隐藏在表单后面,不能通过静态链接直接获得,是需要提交一定的关键词之后才能获取的网页。因此,深层网络爬虫最重要的部分即为处理表单填写部分。

为什么数据没那么好爬

我们爬取的数据大多数来源于互联网中的各个站点,通常是我们在浏览器看到的网页内容。然而,由于不同的网站结构不同、布局复杂度不一、渲染方式多样等原因,使得我们难以用统一的方式去爬取数据。同时,有的网站还专门采取了一系列的 “反爬” 措施,比如:验证码、IP 检测、请求频率限制等。 因此,为了准确、高效地获取有效数据,我们就需要设计有针对性的网络爬虫程序和反制措施。比如使用 Selenium、使用 IP 代理、分布式爬虫等等,这样就增加了网络爬虫的编程难度。

关于爬虫的合法性

几乎每个网站都有一个名为 robots.txt 的文档,当然也有些网站没有设定。对于没有设定 robots.txt 的网站可以通过网络爬虫获取没有口令加密的数据,也就是该网站所有页面的数据都可以爬取。如果网站有文件 robots.txt 文档,就要判断是否有禁止访客获取数据,如 https://www.taobao.com/robots.txt

网络爬虫的工作原理

网络爬虫的工作原理如下图所示。从流程上来讲,网络爬虫主要分为两部分:数据的抓取解析
在这里插入图片描述 下面从 Python 角度出发,分别看看在抓取和解析两部分中有哪些常用的技术和工具。

数据抓取技术

在爬虫实现上,除了 scrapy 框架之外,Python 有许多与此相关的库可供使用。其中,在数据抓取方面包括:
  • urllib:Python3 内置的 urllib 模块,用于访问网络资源。用起来比较麻烦,缺少很多实用的高级功能。
  • urllib2:Python2.7 的模块,在 python3.3 以后的版本不能再用 urllib2,使用 urllib.request 和 urllib.error 代替。
  • urllib3:urllib3 并非 python 的内置模块,需要额外安装。拥有高效的 http 连接池管理及 http 代理服务的功能库。
  • requests:一个通过 urllib3 实现的很实用的 HTTP 客户端库,编写爬虫和测试服务器响应数据时经常会用到。可以说,Requests 完全满足如今网络的需求。
  • mechanize:一个用于模拟浏览器的 python 模块,该模块在面对验证码问题时是个非常好的办法。
  • selenium:一套完整的 web 应用程序测试系统,包含了测试的录制(seleniumIDE)、编写及运行(SeleniumRemoteControl)和测试的并行处理(SeleniumGrid)。它的核心 SeleniumCore 基于 JsUnit,完全由 JavaScript 编写,因此可以用于任何支持 JavaScript 的浏览器上。selenium 可以模拟真实浏览器,爬虫中主要用来解决 JavaScript 渲染问题。在 python 爬虫中主要用的是 selenium 的 Webdriver。
  • splinter:Splinter 是用 Python 开发的一个开源 web 自动化测试的工具集,它可以帮你自动化浏览器的行为,比如浏览 URLs 并和页面进行交互。
其中 urllib2(urllib3)、requests、mechanize 用来获取 URL 对应的原始响应内容;而selenium、splinter 通过加载浏览器驱动,获取浏览器渲染之后的响应内容,模拟程度更高。考虑效率、当然能使用 urllib2(urllib3)、requests、mechanize 等解决的尽量不用 selenium、splinter,因为后者因需要加载浏览器而导致效率较低。 你应该已经猜到,数据抓取的过程其实也就是模拟浏览器向服务器发送 HTTP 请求的过程。当然,这里是由爬虫负责构造好的 HTTP 请求,常见类型也就是 GET 和 POST,到底选用哪种需要根据爬取目标来决定。

数据解析技术

在数据解析方面,相应的库包括:
  • xpath:XPath(全称 XML Path Language,即 XML 路径语言)是一门在 XML 文档中查找信息的语言,XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。
  • lxml:lxml 是 python 的一个解析库,支持 HTML 和 XML 的解析,支持 XPath 解析方式,而且解析效率很高。
  • beautifulsoup4:Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 python 库,它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改。配合 Requests 使用,能大大提高爬虫效率。
  • re:正则表达式模块。
  • pyquery:PyQuery 是一个非常强大而且灵活的网页解析库,PyQuery 是 python 仿照 jQuery 的严格实现,语法与 jQuery 几乎完全相同。
对于数据解析,主要是从响应页面里提取所需的数据,常用的方法有:xpath 路径表达式、CSS 选择器、正则表达式等。其中,xpath 路径表达式、CSS 选择器主要用于提取结构化的数据,而正则表达式主要用于提取非结构化的数据。

网络爬虫的简单示例

  • 目标:爬取百度新闻首页的新闻标题信息
  • 地址:http://news.baidu.com/
  • 实现步骤:
    • 导入 urllib 和 re 模块
    • 使用 urllib.request.Request() 创建 request 请求对象
    • 使用 urllib.request.urlopen 执行信息爬取,并返回 Response 对象
    • 使用 read() 读取信息,使用 decode() 执行解码
    • 使用 re 正则解析结果
    • 遍历输出结果信息
代码如下: import urllib.request import re url = "http://news.baidu.com/" # 伪装浏览器用户 headers = {'User-Agent':'User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.00)'} req = urllib.request.Request(url, headers=headers) # 执行请求获取响应信息 res = urllib.request.urlopen(req) # 从响应对象中读取信息并解码 html = res.read().decode("utf-8") # 使用正则解析出新闻标题信息,这里只是简单地获取 a 标签中的文字和链接 pat = '(.*?)' dlist = re.findall(pat, html) # 遍历输出结果 for v in dlist: print(v[1] + ":" + v[0]) 在浏览器上请求页面: 在这里插入图片描述 网络爬虫运行结果: 在这里插入图片描述