初识 python 爬虫

作者: ReinhardHuang | 来源:发表于2017-09-10 22:36 被阅读221次

什么是网络爬虫

大数据时代,获得完整全面的数据,是件极其重要却并不容易的事情。要真正做好大数据时代的分析,就需要借助爬虫的力量。

网络爬虫(又被称为网络蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

如果把互联网比喻成一个蜘蛛网,那么 网络爬虫 就是在网上爬来爬去的蜘蛛。网络爬虫 通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,一直遍历下去,直到把整个网站所有的网页都抓取完为止。

网络爬虫的合法性

网络爬虫引发的问题

  • 性能骚扰
  • 法律风险
  • 隐私泄露

网络爬虫的"性能骚扰"

web服务器默认接受人类访问,受限于编写水平和目的,网络爬虫将会为web服务器带来巨大的资源的开销。

网络爬虫的法律风险

服务器上的数据有产权归属,网络爬虫获取数据后牟利将会带来法律的风险。

网络爬虫的隐私泄露

网络爬虫可能具备突破简单访问的控制能力,获取被保护的数据,从而泄露个人隐私。

无论如何,当你抓取某个网站的数据时,请记住自己是该网站的访客,应当约束自己的抓取行为,否则他们可能会封禁你的IP,甚至采取更进一步的法律行动。这就要求下载请求的速度要限定在一个合理值之内,并且还需要设定一个专属的用户代理来标识自己。

Robots协议

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

根据协议,网站管理员可以在网站域名的根目录下放一个robots.txt 文本文件,里面可以指定不同的网络爬虫能访问的页面和禁止访问的页面,指定的页面由正则表达式表示。网络爬虫在采集这个网站之前,首先获取到这个文件,然后解析到其中的规则,然后根据规则来采集网站的数据。

注意,这个协议的存在更多的是需要网络爬虫去遵守,而起不到防止爬虫的功能。

为什么需要Robots协议

互联网上的网页是通过超级链接互相关联起来的,从而形成了网页的网状结构。爬虫的工作方式就像蜘蛛在网上沿着链接爬来爬去,最基本的流程可以简化如下:

  1. 喂给爬虫一堆url,我们称之为种子(seeds);
  2. 爬虫抓取seeds,解析html网页,抽取其中的超级链接;
  3. 爬虫接着抓取这些新发现的链接指向的网页。

步骤2和步骤3循环往复。

了解了上面的流程就能发现:对爬虫来说网站非常被动,只有老老实实被抓取的份。

所以,对于网站的管理者来说,就存在这样的需求:

某些路径下是个人隐私或者网站管理使用,不想被搜索引擎抓取,比如说日本爱情动作片;
不喜欢某个搜索引擎,不愿意被他抓取,最有名的就是之前淘宝不希望被百度抓取;
小网站使用的是公用的虚拟主机,流量有限或者需要付费,希望搜索引擎抓的温柔点;
某些网页是动态生成的,没有直接的链接指向,但是希望内容被搜索引擎抓取和索引。

网站内容的所有者是网站管理员,搜索引擎应该尊重所有者的意愿,为了满足以上等等,就需要提供一种网站和爬虫进行沟通的途径,给网站管理员表达自己意愿的机会。有需求就有供应,robots协议就此诞生。

Robots写法

最简单的robots.txt只有两条规则:

  • User-agent:指定对哪些爬虫生效
  • Disallow:不允许爬取的目录

另外常见的附加规则:

  • Crawl-delay: 指定爬虫抓取的间隔时间(秒)。这种操作可以进行缓解服务器压力。
  • Sitemap: 网站地图,格式为XML。其中列出网站中的网址以及关于每个网址的其他数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度等等),利用这些信息搜索引擎可以更加智能地抓取网站内容。
  • Allow: 允许爬取的目录,一般和Disallow配合使用。

举个🌰

知乎的robots文件: https://www.zhihu.com/robots.txt

User-agent: *
Crawl-delay: 10

Disallow: /login
Disallow: /logout
Disallow: /resetpassword
Disallow: /terms
Disallow: /search
Disallow: /notifications
Disallow: /settings
Disallow: /inbox
Disallow: /admin_inbox
Disallow: /*?guide*
Disallow: /people/*-*-*-*

简书的robots文件:http://www.jianshu.com/robots.txt

# See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
#
# To ban all spiders from the entire site uncomment the next two lines:
User-agent: *
Disallow: /search
Disallow: /notes/
Disallow: /admin/
Disallow: /p/0826cf4692f9
Disallow: /p/d8b31d20a867
Disallow: /collections/*/recommended_authors
Disallow: /trial/*
Disallow: /mobile/campaign/fd2017/*

淘宝的robots文件:https://www.taobao.com/robots.txt

User-agent:  Baiduspider
Allow:  /article
Allow:  /oshtml
Allow:  /wenzhang
Disallow:  /product/
Disallow:  /

User-Agent:  Googlebot
Allow:  /article
Allow:  /oshtml
Allow:  /product
Allow:  /spu
Allow:  /dianpu
Allow:  /wenzhang
Allow:  /oversea
Disallow:  /

User-agent:  Bingbot
Allow:  /article
Allow:  /oshtml
Allow:  /product
Allow:  /spu
Allow:  /dianpu
Allow:  /wenzhang
Allow:  /oversea
Disallow:  /

User-Agent:  360Spider
Allow:  /article
Allow:  /oshtml
Allow:  /wenzhang
Disallow:  /

User-Agent:  Yisouspider
Allow:  /article
Allow:  /oshtml
Allow:  /wenzhang
Disallow:  /

User-Agent:  Sogouspider
Allow:  /article
Allow:  /oshtml
Allow:  /product
Allow:  /wenzhang
Disallow:  /

User-Agent:  Yahoo!  Slurp
Allow:  /product
Allow:  /spu
Allow:  /dianpu
Allow:  /wenzhang
Allow:  /oversea
Disallow:  /

User-Agent:  *
Disallow:  /

Robots协议不是什么技术壁垒,而只是一种互相尊重的协议。Robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险。

估算网站大小

目标网站的大小会影响我们如何进行爬取。如果是只有几百个URL的网站,效率并没有那么重要;但如果是拥有数百万个网页的站点,使用串行下载可能需要持续数月才能完成,这时就需要使用分布式下载来解决。

估算网站大小的一个简便方法是检查其他搜索引擎爬虫的结果。可以通过site参数获取该信息。如在 Google 中搜索 site:jianshu.com

三个搜索引擎显示简书的网页数量都在百万级。

在域名后面添加URL路径可以对搜索结果进行过滤。

识别网站所用技术

构建网站的技术类型也会对我们如何爬取产生影响。网站所用的框架,以及 AngularJS 之类的动态加载,ASP.NET 的会话管理和表单提交都会影响我们的爬虫策略。

有一个十分有用的工具可以检查网站构建的技术类型——builtwith 模块(只支持python2环境,python3环境报错)。

安装builtwith之前,需要安装pip。

sudo easy_install pip

pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。

pip之于python相当于maven之于Java,CocoaPos之于OC。

pip安装完成后,安装builtwith模块。

pip install builtwith

该模块将 URL 作为参数,下载该 URL 并对其进行分析,然后返回该网站使用的技术。

举个🌰:

识别网站所有者

对于一些网站,我们可能会关心其所有者是谁。为了找到网站的所有者,我们可以使用WHOIS协议查询域名的注册者是谁。Python中有一个对该协议的封装库。我们可以通过pip进行安装。

pip install python-whois

举个🌰:

编写第一个python爬虫

从最简单的开始,使用最好用的 requests 做网络访问,并且使用操作方便的 beautifulsoup 来解析 html。Python 标准库中自带了 xml 模块,但是性能不够好,而且缺乏一些人性化的 API,相比之下,第三方库 lxml 增加了很多实用功能,性能也更高,可谓爬虫处理网页数据的一件利器。

pip install requests
pip install bs4
pip install lxml

我们练手的项目就是爬取简书新上榜推荐文章的数据。

#coding=utf-8
import requests
import time
from bs4 import BeautifulSoup

base_url = 'http://www.jianshu.com'
add_url = '/recommendations/notes'
num = 0
nowtime = time.time()

while(True):
    try:
        if num > 1000:
            break
        first_page = requests.request('get', base_url+ add_url).content
        soup = BeautifulSoup(first_page, "lxml")
        title_list = [i.get_text() for i in soup.select("a.title")]
        for i in title_list:
            num+=1
            print(num, '  ', i)
        try:
            nowtime = int(nowtime - 1800)
            add_url = '/recommendations/notes?category_id=56&max_id=' + str(nowtime)
        except:
            break
        time.sleep(10)
    except Exception as e:
        print(e)
        break

非常简单的代码,难点在于分页。

稍微研究了一下,打开浏览器的开发者工具,发现每次点击更多按钮,network 发送的请求都带了一个 max_id 参数。这里 max_id 显然是一个 timestamp,多点击几次后发现,这个 timestamp 基本上是以半小时为单位递减的。于是通过每次改变 max_id 我们实现了爬虫的自动分页功能。

这就是一个最简单的爬虫,一般真正的爬虫还需要涉及数据存储,这个就交给读者们自己解决吧。

最后安利个人博客:http://reinhardhuang.com

参考

相关文章

网友评论

    本文标题:初识 python 爬虫

    本文链接:https://www.haomeiwen.com/subject/btztsxtx.html