初识 python 爬虫

什么是网络爬虫

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

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

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

网络爬虫的合法性

网络爬虫引发的问题

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

网络爬虫的"性能骚扰"

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

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,227评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,755评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,899评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,257评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,617评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,757评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,982评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,715评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,454评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,666评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,148评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,512评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,156评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,112评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,896评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,809评论 2 279
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,691评论 2 272

推荐阅读更多精彩内容