Python分布式爬虫原理[通俗易懂]

转载请注明出处:http://blog.csdn.net/yiliumu/article/details/21335245首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的。(1)打开浏览器,输入URL,打开源网页(2)选取我们想要的内容,包括标题,作者,摘要,正文等信息(3)存储到硬盘中上面的三个过程,映射到技术层面上,其实就是:网络请求,抓取结构化数据,数据存

大家好,又见面了,我是你们的朋友全栈君。

转载请注明出处:http://blog.csdn.net/yiliumu/article/details/21335245

首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的。

(1)打开浏览器,输入URL,打开源网页


(2)选取我们想要的内容,包括标题,作者,摘要,正文等信息


(3)存储到硬盘中




上面的三个过程,映射到技术层面上,其实就是:网络请求,抓取结构化数据,数据存储。


我们使用Python写一个简单的程序,实现上面的简单抓取功能。

[python] 
view plain  
copy

 
在CODE上查看代码片
派生到我的代码片

  1. #!/usr/bin/python  
  2. #-*- coding: utf-8 -*-  
  3. ”’ 
  4. Created on 2014-03-16 
  5.  
  6. @author: Kris 
  7. ”’  
  8. import urllib2, re, cookielib  
  9.   
  10. def httpCrawler(url):  
  11.     ”’ 
  12.     @summary: 网页抓取 
  13.     ”’  
  14.     content = httpRequest(url)  
  15.     title = parseHtml(content)  
  16.     saveData(title)  
  17.   
  18. def httpRequest(url):  
  19.     ”’ 
  20.     @summary: 网络请求 
  21.     ”’    
  22.     try:  
  23.         ret = None  
  24.         SockFile = None  
  25.         request = urllib2.Request(url)  
  26.         request.add_header(‘User-Agent’‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)’)  
  27.         request.add_header(‘Pragma’‘no-cache’)  
  28.         opener = urllib2.build_opener()  
  29.         SockFile = opener.open(request)  
  30.         ret = SockFile.read()  
  31.     finally:  
  32.         if SockFile:  
  33.             SockFile.close()  
  34.           
  35.     return ret  
  36.   
  37. def parseHtml(html):  
  38.     ”’ 
  39.     @summary: 抓取结构化数据 
  40.     ”’  
  41.     content = None  
  42.     pattern = ‘<title>([^<]*?)</title>’  
  43.     temp = re.findall(pattern, html)  
  44.     if temp:  
  45.         content = temp[0]  
  46.       
  47.     return content  
  48.       
  49. def saveData(data):  
  50.     ”’ 
  51.     @summary: 数据存储 
  52.     ”’  
  53.     f = open(‘test’‘wb’)  
  54.     f.write(data)  
  55.     f.close()  
  56.       
  57. if __name__ == ‘__main__’:  
  58.     url = ‘http://www.baidu.com’  
  59.     httpCrawler(url)  



看着很简单,是的,它就是一个爬虫入门的基础程序。当然,在实现一个采集过程,无非就是上面的几个基础步骤。但是实现一个强大的采集过程,你会遇到下面的问题:

(1)需要带着cookie信息访问,比如大多数的社交化软件,基本上都是需要用户登录之后,才能看到有价值的东西,其实很简单,我们可以使用Python提供的cookielib模块,实现每次访问都带着源网站给的cookie信息去访问,这样只要我们成功模拟了登录,爬虫处于登录状态,那么我们就可以采集到登录用户看到的一切信息了。下面是使用cookie对httpRequest()方法的修改:

[python] 
view plain  
copy

 
在CODE上查看代码片
派生到我的代码片

  1. ckjar = cookielib.MozillaCookieJar()  
  2. cookies = urllib2.HTTPCookieProcessor(ckjar)         #定义cookies对象  
  3. def httpRequest(url):  
  4.     ”’ 
  5.     @summary: 网络请求 
  6.     ”’    
  7.     try:  
  8.         ret = None  
  9.         SockFile = None  
  10.         request = urllib2.Request(url)  
  11.         request.add_header(‘User-Agent’‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)’)  
  12.         request.add_header(‘Pragma’‘no-cache’)  
  13.         opener = urllib2.build_opener(cookies)       #传递cookies对象  
  14.         SockFile = opener.open(request)  
  15.         ret = SockFile.read()  
  16.     finally:  
  17.         if SockFile:  
  18.             SockFile.close()  
  19.           
  20.     return ret  

(2)编码问题。网站目前最多的两种编码:utf-8,或者gbk,当我们采集回来源网站编码和我们数据库存储的编码不一致时,比如,163.com的编码使用的是gbk,而我们需要存储的是utf-8编码的数据,那么我们可以使用Python中提供的encode()和decode()方法进行转换,比如:

[python] 
view plain  
copy

 
在CODE上查看代码片
派生到我的代码片

  1. content = content.decode(‘gbk’‘ignore’)      #将gbk编码转为unicode编码  
  2. content = content.encode(‘utf-8’‘ignore’)    #将unicode编码转为utf-8编码  

中间出现了unicode编码,我们需要转为中间编码unicode,才能向gbk或者utf-8转换。




(3)网页中标签不完整,比如有些源代码中出现了起始标签,但没有结束标签,HTML标签不完整,就会影响我们抓取结构化数据,我们可以通过Python的BeautifulSoup模块,先对源代码进行清洗,再分析获取内容。




(4)某些网站使用JS来生存网页内容。当我们直接查看源代码的时候,发现是一堆让人头疼的JS代码。可以使用mozilla、webkit等可以解析浏览器的工具包解析js、ajax,虽然速度会稍微慢点。




(5)图片是flash形式存在的。当图片中的内容是文字或者数字组成的字符,那这个就比较好办,我们只要利用ocr技术,就能实现自动识别了,但是如果是flash链接,我们将整个URL存储起来了。




(6)一个网页出现多个网页结构的情况,这样我们如果只是一套抓取规则,那肯定不行,所以需要配置多套模拟进行协助配合抓取。




(7)应对源网站的监控。抓取别人的东西,毕竟是不太好的事情,所以一般网站都会有针对爬虫禁止访问的限制。


一个好的采集系统,应该是,不管我们的目标数据在何处,只要是用户能够看到的,我们都能采集回来。所见即所得的无阻拦式采集,无论是否需要登录的数据都能够顺利采集。大部分有价值的信息,一般都需要登录才能看到,比如社交网站,为了应对登录的网站要有模拟用户登录的爬虫系统,才能正常获取数据。不过社会化网站都希望自己形成一个闭环,不愿意把数据放到站外,这种系统也不会像新闻等内容那么开放的让人获取。这些社会化网站大部分会采取一些限制防止机器人爬虫系统爬取数据,一般一个账号爬取不了多久就会被检测出来被禁止访问了。那是不是我们就不能爬取这些网站的数据呢?肯定不是这样的,只要社会化网站不关闭网页访问,正常人能够访问的数据,我们也能访问。说到底就是模拟人的正常行为操作,专业一点叫“反监控”。




源网站一般会有下面几种限制:


1、一定时间内单个IP访问次数,一个正常用户访问网站,除非是随意的点着玩,否则不会在一段持续时间内过快访问一个网站,持续时间也不会太长。这个问题好办,我们可以采用大量不规则代理IP形成一个代理池,随机从代理池中选择代理,模拟访问。代理IP有两种,透明代理和匿名代理。




2、一定时间内单个账号访问次数,如果一个人一天24小时都在访问一个数据接口,而且速度非常快,那就有可能是机器人了。我们可以采用大量行为正常的账号,行为正常就是普通人怎么在社交网站上操作,并且单位时间内,访问URL数目尽量减少,可以在每次访问中间间隔一段时间,这个时间间隔可以是一个随机值,即每次访问完一个URL,随机随眠一段时间,再接着访问下一个URL。

如果能把账号和IP的访问策略控制好了,基本就没什么问题了。当然对方网站也会有运维会调整策略,敌我双方的一场较量,爬虫必须要能感知到对方的反监控将会对我们有影响,通知管理员及时处理。其实最理想的是能够通过机器学习,智能的实现反监控对抗,实现不间断地抓取。

下面是本人近期正在设计的一个分布式爬虫架构图,如图1所示:

Python分布式爬虫原理[通俗易懂]

图1

纯属拙作,初步思路正在实现,正在搭建服务器和客户端之间的通信,主要使用了Python的Socket模块实现服务器端和客户端的通信。如果有兴趣,可以单独和我联系,共同探讨完成更优的方案。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126547.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JavaScript onmousemove 事件

    JavaScript onmousemove 事件DefinitionandUsage定义与用法Theonmousemoveeventoccurswhenthemousepointerismoved.当鼠标移动时触发onmou

    2022年7月2日
    21
  • rsync远程同步文件_通过ssh传输文件

    rsync远程同步文件_通过ssh传输文件对于需要远程同步文件来说,我们常见的方式有scp或者rsync,但是想定时任务去同步的话,往往都需要设置免密登录,为安全起见,线上服务器没必要设置这个,且添加新的机器又要去设置免密,着实比较麻烦。采用rsync客户服务端的话,只需要设置一个密码即可。这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,…

    2022年10月13日
    2
  • 什么是DDR3_DDR3 SDRAM

    什么是DDR3_DDR3 SDRAMODT是什么鬼?为什么要用ODT?在很多关于DDR3的博文和介绍中都没有将清楚。在查阅了很多资料并仔细阅读DDR3的官方标准(JESD79-3A)之后,总算有点了头绪,下面来整理整理。1、首先ODT是什么?ODT(On-DieTermination),是从DDR2SDRAM时代开始新增的功能。其允许用户通过读写MR1寄存器,来控制DDR3SDRAM中内部的终端电阻的连接或者断开。在DDR3…

    2025年10月16日
    2
  • python anaconda和pycharm的区别_质量度三者关系

    python anaconda和pycharm的区别_质量度三者关系哈喽~大家好呀Python作为深度学习和人工智能学习的热门语言,你们知道Python、Pycharm、Anaconda三者之间的关系吗?学习一门语言,除了学会其简单的语法之外还需要对其进行运行和实现,才能实现和发挥其功能和作用。下面来介绍运行Python代码常用到的工具总结。一.Python、Pycharm、Anaconda关系介绍1.PythonPython是一种跨平台的计算机程序语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动…

    2022年8月29日
    4
  • 值得收藏!15个 Pythonic 的代码示例

    值得收藏!15个 Pythonic 的代码示例Python 由于语言的简洁性 让我们以人类思考的方式来写代码 新手更容易上手 老鸟更爱不释手 要写出 Pythonic 优雅的 地道的 整洁的 代码 还要平时多观察那些大牛代码 Github 上有很多非常优秀的源代码值得阅读 比如 requests flask tornado 这里小明收集了一些常见的 Pythonic 写法 帮助你养成写优秀代码的习惯 01 变量交换 Badtmp aa bb tmpPythonica b b a02 列表推导 Badmy list

    2025年6月7日
    4
  • qt中qmake的详解

    1.首先,感性的认识是,qmake可以利用源文件(包括头文件h,实现文件cpp,qt的ui文件等等)生成各种不同类型的工程,工程需要的Makefile文件,可执行的与不可执行的,这取决于所用的模板(包括app、lib、subdirs、vcapp、vclib)。2.创建pro文件,添加各种源文件,还可以设定平台相关的不同源文件,设置各种规则,利用qmake命令生成工程。后面会介绍pro文件可

    2022年4月3日
    177

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号