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

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

(1)打开浏览器,输入URL,打开源网页
(2)选取我们想要的内容,包括标题,作者,摘要,正文等信息
(3)存储到硬盘中

上面的三个过程,映射到技术层面上,其实就是:网络请求,抓取结构化数据,数据存储。
我们使用Python写一个简单的程序,实现上面的简单抓取功能。

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

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

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

[python]  view plain copy
  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. return ret

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

[python]  view plain copy
  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所示:

图1

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

Python分布式爬虫原理相关推荐

  1. 第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理...

    第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认 ...

  2. Python分布式爬虫打造搜索引擎

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 未来是什么时代?是数据时代!数据分析服务.互联网金融,数据建模.自 ...

  3. 【视频教程免费领取】聚焦Python分布式爬虫必学框架Scrapy 打造搜索引擎

    领取方式 关注公众号,发送Python0407获取下载链接. 扫码关注公众号,公众号回复 Python0407 获取下载地址 目录结构 目录:/读书ReadBook [57.6G] ┣━━48G全套J ...

  4. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  5. 基于PyHusky的分布式爬虫原理及实现

    原理 爬虫是我们获取互联网数据的一个非常有效的方法,而分布式爬虫则是利用许多台机器协调工作来加快抓取数据效率的不二途径.分布式爬虫是由访问某些原始网址开始,在获取这些网址的内容后,根据某些规则从中提取 ...

  6. python分布式爬虫框架_python之简单Scrapy分布式爬虫的实现

    分布式爬虫:爬虫共用同一个爬虫程序,即把同一个爬虫程序同时部署到多台电脑上运行,这样可以提高爬虫速度. 在默认情况下,scrapy爬虫是单机爬虫,只能在一台电脑上运行,因为爬虫调度器当中的队列queu ...

  7. Python分布式爬虫-elasticsearch搭建搜索引擎

    Python分布式爬虫-elasticsearch搭建搜索引擎 一.elasticsearch使用 1.elasticsearch介绍 ElasticSearch是一个基于Lucene的搜索服务器.它 ...

  8. 第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查...

    第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)基本的索引和文档CRUD操作.增.删.改.查 elasticsearch(搜索引擎)基本的索引 ...

  9. 三十七 Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中...

    Python分布式爬虫打造搜索引擎Scrapy精讲-将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如 ...

最新文章

  1. GetCurrentProcessID、OpenProcessToken、LookupPrivilegeValue
  2. 软件测试入门三年经验
  3. 对应生成树的基本回路_2011秋季学期离散数学语音答疑提纲下(全书考试内容)
  4. BZOJ.4727.[POI2017]Turysta(哈密顿路径/回路 竞赛图)
  5. Servlet3.0
  6. tornado celery mysql_tornado中使用celery实现异步MySQL操作
  7. iOS图片高斯模糊处理
  8. WinRAR v5.10 正式版
  9. 基于Matlab人脸识别(PCA算法)
  10. iOS 性能优化之内存优化
  11. 《职场人士必读的88个寓言》摘要
  12. C#加密Excel文件
  13. Schema for type Unit is not supported
  14. 《暖暖环游世界》:突破女性休闲游戏的商业化局限
  15. 微信公众号(服务号)申请时候需要补充的资料
  16. Linux全套完整视频教程
  17. wxpython 下拉列表的实现
  18. 想去阿里大厂去面试测试工程师?想月薪15k?这篇文章一定对你有所帮助
  19. centos8无法nmcli connection up ens33 或无法ifconfg到ens33网卡信息
  20. Cesium加载GeoJson数据(shp转化的json数据)

热门文章

  1. Linux用户、用户组的管理
  2. 研究生招生信息网服务器异常,2012研究生网上报名常见问题汇总
  3. Java开发者跳槽必备,面试:Redis为什么这么快呢
  4. Twister: 迭代MapReduce计算框架
  5. vi/vim中复制粘贴命令
  6. sqlite数据库使用
  7. 移位操作---左移和右移
  8. 基于SpringBoot+Vue的在线音乐网站 音乐管理系统(源码调试+文档)
  9. 寒假每日一题——贝茜的报复
  10. R740 U盘启动设置和安装centos7报错处理