深入理解Python分布式爬虫原理

互联网 20-11-26
python视频教程栏目介绍分布式爬虫原理。

免费推荐:python视频教程

(3)存储到硬盘中

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

#!/usr/bin/python  #-*- coding: utf-8 -*-  '''''  Created on 2014-03-16    @author: Kris  '''  import urllib2, re, cookielib    def httpCrawler(url):    '''''    @summary: 网页抓取    '''    content = httpRequest(url)    title = parseHtml(content)    saveData(title)    def httpRequest(url):    '''''    @summary: 网络请求    '''     try:      ret = None      SockFile = None      request = urllib2.Request(url)      request.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)')      request.add_header('Pragma', 'no-cache')      opener = urllib2.build_opener()      SockFile = opener.open(request)      ret = SockFile.read()    finally:      if SockFile:        SockFile.close()          return ret    def parseHtml(html):    '''''    @summary: 抓取结构化数据    '''    content = None    pattern = '<title>([^<]*?)</title>'    temp = re.findall(pattern, html)    if temp:      content = temp[0]        return content      def saveData(data):    '''''    @summary: 数据存储    '''    f = open('test', 'wb')    f.write(data)    f.close()      if __name__ == '__main__':    url = 'http://www.baidu.com'    httpCrawler(url)

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

ckjar = cookielib.MozillaCookieJar()  cookies = urllib2.HTTPCookieProcessor(ckjar)     #定义cookies对象  def httpRequest(url):    '''''    @summary: 网络请求    '''     try:      ret = None      SockFile = None      request = urllib2.Request(url)      request.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)')      request.add_header('Pragma', 'no-cache')      opener = urllib2.build_opener(cookies)    #传递cookies对象      SockFile = opener.open(request)      ret = SockFile.read()    finally:      if SockFile:        SockFile.close()          return ret

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

content = content.decode('gbk', 'ignore')   #将gbk编码转为unicode编码  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)一个网页出现多个网页结构的情况,这样我们如果只是一套抓取规则,那肯定不行,所以需要配置多套模拟进行协助配合抓取。

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

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

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

以上就是深入理解Python分布式爬虫原理的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 分布式爬虫
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:python之Xpath语法

相关资讯