爬虫编写之前奏

来源:互联网 发布:网络彩票推广员 编辑:程序博客网 时间:2024/05/29 16:58

今天我先用几个问题的形式来介绍下爬虫,然后介绍下我们写爬虫之前所需要做的准备,希望能对大家有所帮助,也希望能帮助初学者入门爬虫学习。

爬虫是什么?

这可能大多初学者的疑问,但这个问题其实不难回答。因为它与我们生活密切相关。比如:百度其实就是一个“大爬虫”。互动百科对爬虫的定义如下:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常被称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本,已被广泛应用于互联网领域。搜索引擎使用网络爬虫抓取Web网页、文档甚至图片、音频、视频等资源,通过相应的索引技术组织这些信息,提供给搜索用户进行查询。简而言之,爬虫就是为我们搜索网络资源,并在需要的时候下载他们的程序。

爬虫有什么用?

1.作为通用搜索引擎网页收集器。(google,百度)
2.做垂直搜索引擎。(找工作的搜索引擎,如www.51job.com)
3.科学研究:通过搜集信息分析在线人类行为,在线社群演化,人类动力学研究,计量社会学等都可以通过爬虫搜集信息来分析数据。
4.偷窥,hacking,发垃圾邮件…(<>).

用什么语言写爬虫?

1.C,C++。优点是高效,快。适用于通用搜索引擎做全网爬取。缺点也很明显,代码长的恶心,开发慢。
2.脚本语言:Perl,Python,Java,Ruby。这些脚本语言简单易学,良好的文本处理能方便网页内容的细致提取,但效率往往不高,适合对少量网站的聚焦爬取。但这也是我们接触最多的情况。
3.C#?(好像是学习信息管理的人比较喜欢的语言)

为什么最终选Python?

主要基于以下几点:
1.跨平台,对linux和windows都有不错的支持。
2.科学计算,数值拟合:Numpy,Scipy。
3.可视化:2D Matplotlib(作图不错),3D:Mayavi2
4.复杂网络:Networkx
5.统计:与R语言接口:Rpy
6.交互式终端
7.能够快速开发一个网页(先不管运行性能如何)。
经过前面的介绍,已经初步了解了一下爬虫,那么我接下来对写一个爬虫要做什么进行一下讨论。

背景调研

在深入爬取一个网站之前,我们首先要对目标站点的规模和结构进行一定程度的了解。
1.检查robots.txt
大多数网站都会定义robots.txt文件,里面定义一些“规矩”,遵守这些规矩,能够让你的爬虫减少被禁的可能性,虽然只是建议,但是如果你不想增加麻烦的话最好看一看。

这里写图片描述
这是360的robots.txt,他想干吗?我木知啊!可能他是想说,大家随便爬我,我无所谓!!
这里写图片描述
看百度的robots.txt,差距啊,上面封了一大批大型搜索引擎,比如googlebot,google的爬虫,图没截完,下面还有很多。
Disallow,定义了一些不允许爬的链接,如果你爬了就封你的ip。
2.估算网站大小
一个网站的大小,对于我们采用怎样的方式,进行爬取,有很多的影响,假如是一个只有两三百个url的网站,我们不需要考虑效率的问题,但如果是一个具有上百万个网页的网站,那我们就需要使用分布式来下载了。
估算网站大小,我们可以使用google语法。比如site: www.baidu.com。
3.检查网站所用技术
一个网站使用什么技术也可能对我们写爬虫产生影响。检查网站所用的技术,我们使用python的builtwith模块。
安装:
pip install builtwith
使用方法如下:
这里写图片描述
分析可得这个网站使用了javascript的库,web服务器是Nginx。提供数据统计的是Piwik。
4.寻找网站所有者
对于一些网站我们可能会关注,他的所有着是谁,这个获取的方法很多,站长工具,一些查询域名注册的工具都可以,这里主要介绍一下python怎么实现这个问题。使用的是python的python-whois模块。
安装:
pip install python-whois
使用方法如下:
这里写图片描述
编写一个初级爬虫步骤
1.下载网页
要想爬取网页,我们首先需要将其下载下来。下面的示例脚本使用Python的urllib 2 模块下载URL。

import urllib2 def download ( url ) :  return urllib2 . url。pen ( ur l ) . read () 

当传入URL参数时, 该函数将会下载网页并返回其HTML。 不过, 这个代码片段存在一个问题,即当下载网页时, 我们可能会遇到一些无法控制的错误,比如请求的页面可能不存在。此时,urllib2会抛出异常,然后退出脚本。安全起见,下面再给出一个更健壮的版本,可以捕获这些异常。

import urllsb2def download(url): print  ‘Downloading:’,url try:  html=urllib2.urlopen(url).read()  except  urllib2.URLError as e:   print ‘Download error’,e.reason   html = Nonereturn html

现在, 当出现下载错误时, 该函数能够捕获到异常,然后返回None。

重试下载

下载时遇到错误,经常是临时性的,对于此类错误, 我们可以尝试重新下载,因为这个服务器 问题现在可能己解决。 不过, 我们不需要对所有错误都尝试重新下载。 如果服务器返回的是404 Not Found 这种错误, 则说明该网页目
前并不存在, 再次尝试同样的请求一般 也不会出现不同的结果。
互联网工程任务组(Inte rnetEngi neering T as k Forc e) 定义了Hπ?错误的完 整列 表, 详情 可参 考h tt ps: // tools. ietf. org/html/rfc 72 31# section- 6。从该文档中,我们可以了解到4xx 错误发生在请求存在问题时,而5xx 错误则发生在服务端存在问题时。所以,我们只需要确保download函数在发生Sxx 错误时重试下载即可。下面是支持重试下载功能的新版本。
代码

import urllsb2def download(url,num_retries=2): print  ‘Downloading:’,url try: html=urllib2.urlopen(url).read() except  urllib2.URLError as e: html = None if num_retries>0:  If hasattr(e,’code’) and 500<=e.code<600   Return download(url,num_retries-1)return html

现在,当download函数遇到5xx错误码时,将会调用递归函数进行重试,这个函数还增加了一个参数,用于设定重新下载的次数,这样的话可以增加我们代码的健壮性。

设置用户代理

默认情况下, ur llib 2 使用 Python-urllib/ 2 . 7作为用户代理下载网 页内容,其中 2 . 7是Python 的版本号。 如果能用可辨识的用户代理则更好, 这样可以避免我们的网 络爬虫碰到一些问题。 此外, 也许是因为曾经历过质量不佳的Python网 络爬虫造成的服务器过载, 一些网站 还会封 禁这个默认的用户代理 。
因此,为了下载更加可靠,我们需要控制用户代理的设定。下面的代码对download函数进行了修改, 设定了一个默认的用户代理“wsw p”( 即WebScraping with Python 的首字母缩写 )。

def download(url,user_agent=’wswp’,num_retries=2): Print ‘Downloading:’,url Headers=(‘user-agent’:user_agent) Request=urllib2.Request(url,headers=headers) Try:  Html=urllib2.urlopen(request).read()  except  urllib2.URLError as e:   html = None if num_retries>0:  If hasattr(e,’code’) and 500<=e.code<600   return download(url,user_agent,num_retries-1)return html

现在,我们拥有了一个灵活的下载函数,可以在后续示例中得到复用。 该函数能够捕获异常,重试下载并设置用户代理。
今天先讲到下载这里,我们先为我们以后写爬虫做一个热身。谢谢大家!

原创粉丝点击