勤学教育网合作机构> > 深圳IT编程培训欢迎您!

python网络爬虫知识

深圳IT编程培训logo
来源:深圳IT编程培训

2022-04-15|已帮助:1828

进入 >

Python在爬虫方面的确是很好的,有Scrapy这样成熟的框架或者pyspider也好用,并且学习成本很低 ,实践效果都很好,下面是小编为您整理的关于python网络爬虫知识,希望对你有所帮助。


python网络爬虫知识配图

python网络爬虫知识

python有各种爬虫框架,方便高效的下载网页。另外爬虫是个典型的多任务处理场景,python的多线程、进程模型成熟稳定,提升整个系统下载和分析能力。

写爬虫很多语言都可以写,node.js也可以写,但是很多人是从python入手写爬虫的,习惯了之后偶尔想爬点东西用python很快就做好了。

Python在爬虫方面的确是很好的,有Scrapy这样成熟的框架或者pyspider也好用,并且学习成本很低 ,实践效果都很好,

比如说你要抓取一个网页内容只需要几行代码就可以实现。

为什么写爬虫都喜欢用python?

1.Python 有 scrapy 这样成熟的框架,我们大可不必自己从0开始

2.即使从0开始,以 Python 简洁的语法和一大波成熟的库,写起来相当的快。PHP 语法,你懂的。我试过写爬虫,体验还是不如 Python的

3.Python 数据处理个人认为比较方便,虽然 PHP 处理 DOM 也很挺方便的

Pthon 唯一不方便的大概是编码处理了。

python网络爬虫的应用

网络爬虫可以做的事情很多,如以下列出:

搜索引擎

采集数据(金融、商品、竞品等)

广告过滤

……

其实就我们个人兴趣,学完爬虫我们可以看看当当网上哪种技术图书卖得比较火(销量、评论等信息)、看某个在线教育网站哪门网络课程做得比较成功、看双十一天猫的活动情况等等,只要我们感兴趣的数据,一般的话都可以爬取得到,不过有些网站比较狡猾,设置各种各样的反扒机制。总而言之,网络爬虫可以帮助我们做很多有趣的事情。

网络爬虫中处理异常的种类与关系

URLError

通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。

HTTPError首先我们要明白服务器上每一个HTTP 应答对象response都包含一个数字“状态码”,该状态码表示HTTP协议所返回的响应的状态,这就是HTTPError。比如当产生“404 Not Found”的时候,便表示“没有找到对应页面”,可能是输错了URL地址,也可能IP被该网站屏蔽了,这时便要使用代理IP进行爬取数据,关于代理IP的设定我们下面会讲到。


python网络爬虫知识配图

两者关系

两者是父类与子类的关系,即HTTPError是URLError的子类,HTTPError有异常状态码与异常原因,URLError没有异常状态码。所以,我们在处理的时候,不能使用URLError直接代替HTTPError。同时,Python中所有异常都是基类Exception的成员,所有异常都从此基类继承,而且都在exceptions模块中定义。如果要代替,必须要判断是否有状态码属性。

教你写网络爬虫:URL去重

有别于单机系统,在分布式系统中,这些URL应该存放在公共缓存中,才能让多个爬虫实例共享,我们继续使用Redis缓存这些数据。URL既可以存储在Redis的Set数据结构中,也可以将URL作为Key存储为Redis的String类型。至于这两种方案各有什么优缺点,就留给读者自己去思考了。

直接存储URL

将URL以字符串的形式直接存储到内存中。保守估计一下URL的平均长度是100字节,那么1亿个URL所占的内存是: 100000000 * 0.0001MB = 10000MB,约等于10G。这也不是不能用,占用的空间再大都能通过扩容来解决。

问题是,如果一个服务器存不下这么多URL该怎么办呢?其实也简单,明确每台服务器的分工,也就是说得到一个URL就知道要交给哪台服务器存储,每台服务器只存储一类URL,比较简单的实现方式就是对URL先哈希再取模。虽然能用,但还是有很大优化空间的。

存储消息摘要

MD5是一个消息摘要算法,它的用途很广泛,我们这里用它来压缩URL。

消息摘要算法的特点:

无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。

只要输入的消息不同,对其进行摘要以后产生的摘要消息也必不相同;但相同的输入必会产生相同的输出。

消息摘要是单向、不可逆的。只能进行正向的信息摘要,而无法从摘要中恢复出任何的原始消息。

以上特点说明我们可以通过存储URL的MD5来实现去重功能,因为不同的URL,MD5不同,相同的URL,MD5相同嘛。

以前我们要存的URL是这样的:http://news.baidu.com/ns?ct=1&rn=20&ie=utf-8&bs=%E4%BA%AC%E4%B8%9C%E9%87%91%E8%9E%8D&rsv_bp=1&sr=0&cl=2&f=8&prevct=no&tn=news&word=%E4%BA%AC%E4%B8%9C%E9%87%91%E8%9E%8D&rsv_sug3=1&rsv_sug4=6&rsv_sug1=1&rsv_sug=1

对应的MD5值是这样的:d552b0b40e21d06d73a1a0938635eb1a

怎么样?省了不少空间吧?

有人说,拓海你不要骗我,这个算法的输入是个无穷集合,而输出是一个有限集合,必然会存在碰撞的,也就是存在不同的URL算出相同的MD5。这会导致去重时误判,少抓数据!

好吧,从理论上来说,必然会出现这种情况。可是出现这种情况的概率是多少呢?下面就算算两个不同URL产生相同消息摘要的概率。

以下是三种常见的消息摘要算法,分别是32、64、128字节,每个字节是十六进制数字的字符,它们的可能值数量分别是:

md5: 16^32 = 2^128 = 3.4 * 10^38

sha256: 16^64 = 2^256 = 1.2 × 10^77

sha512: 16^128 = 2^512 = 1.3 × 10^154

以上是深圳IT编程培训整理的python网络爬虫知识全部内容。

热门推荐

更多
勤学培训网 python学习网 python网络爬虫知识