首页 > 编程 > Python > 正文

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

2020-02-16 10:50:42
字体:
来源:转载
供稿:网友

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

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

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

(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             
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表