爬虫编写之前奏
来源:互联网 发布:网络彩票推广员 编辑:程序博客网 时间: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
现在,我们拥有了一个灵活的下载函数,可以在后续示例中得到复用。 该函数能够捕获异常,重试下载并设置用户代理。
今天先讲到下载这里,我们先为我们以后写爬虫做一个热身。谢谢大家!
- 爬虫编写之前奏
- 零基础写python爬虫之爬虫编写全记录
- 零基础写python爬虫之爬虫编写全记录
- 零基础写python爬虫之爬虫编写全记录
- python基础入门之简单爬虫编写
- Linq系列之前奏
- webService学习之前奏
- 数据分析之前奏
- 前奏
- 前奏!
- 数据仓库北京之行前奏
- 剧本翻译之SHUFFLE【前奏】
- EJB前奏之看看RMI
- 串口编程之前奏篇
- 1.设计模式之前奏
- 串口编程之前奏篇
- STM8单片机学习之前奏
- RxJava前奏之原理分析
- 用原生js写一个弹框
- 欢迎使用CSDN-markdown编辑器
- 网页设计之响应式设计
- 8、TensorFlow 中的激活函数
- 用css和jquery写一个手风琴式的下拉菜单
- 爬虫编写之前奏
- 京东商城前端面试小心得.
- 面对三色幼儿园事件—宝贝,妈妈该拿什么保护你
- DBCP2获取连接
- Ethernet/IP 学习笔记一
- 将博客搬至csdn
- ROM、RAM、DRAM、SRAM和FLASH的区别
- leetCode-Maximum Average Subarray I
- luogu P1563 玩具谜题(NOIP 2016TG)