python爬虫架构

来源:互联网 发布:马略改革 知乎 编辑:程序博客网 时间:2024/05/16 15:47

点开这篇博客的人,几乎都多多少少写过爬虫或者用过python。在此梳理下python爬虫的概念与框架,敬请指点。
(一)、了解网络爬虫之前,我们先来了解下搜索引擎的工作原理:
做过网页的人都明白,网络上HTML文档使用超链接连接了以来,把这些虚拟化的东西可以形象成一张网,也就是万维网。当你在搜索引擎中输入关键字的时候,就相当于放出了很多的网络爬虫。别忘了,你的电脑正处于万维网的一个节点(一个网站),而你输入的关键字正指定了一系列的网站。也就是所说的url,而关键字与url的索引,正是有爬虫建立的。这些索引经过了一系列的排序算法才呈现在我们的面前。简单的说,就是我们输入关键字,放出爬虫,爬虫将关键字与相对的网站建立索引,然后经过复杂算法排序呈现出来。只不过这些索引有的早就已经建立完成了,所以我们输入关键字后才会那么快出来网站。
(二)、知道了网络爬虫的概念,再来了解下网络爬虫的原理。知道了这些大致的原理,我们才会在写爬虫的时候有全局观念。
上面所说,url对应了一个网页,既然是网页,就会有相应的HTML页面。网络爬虫会把这个HTML页面全部抓下来,也页面是字符串。也就是说网络爬虫会把字符串抓下来,然后解析这些字符串,有的字符串解析成图片,有的解析成电影的网址(也就是我们所说的种子!),总而言之会把文本信息提取出来。而这些文本信息保存在你的电脑运行内存里,并非磁盘,如果想要留下来,只需要保存,就可以把相应的文本信息存下来,这就是爬虫最可怕的地方。因为爬取url和解析文本的时间极短,比你点击鼠标的时间短得多,简单来说,网速正常的情况下,单线程的爬虫,一分钟下载数百张的图片不是问题。
(三)、我们来了解下为何使用python来写爬虫:
首先,python是脚本语言,这一点是C,C++,java等比不上的,最简单来说,python执行不需要编译,写一行执行一行,知道有错误的地方才会停止运行。它不需要申请太大的进程空间,所以运行效果很好。
其次,python有很强大的库,只要import,就可以运行,不需要与库函数再进行链接,这一点C,C++比不上。当然C、C++也有python没有的优点,因为今天python主场,不再讨论。
最后,python书写的语法很简单,正则表达式更是简介到不可思议,她还有很好的缩进,使得再多的代码也会显得简洁明了。
(四)、写python前,我们需要了解下python如何访问网络。
使用过python的人都了解,python自带了很强大的库,而这些库里面又包含很多函数模块。python访问互联网用到的库就是urllib,而请求访问网络的是urllib.request模块。下面的代码让你清楚python如何访问网络:

import urllib.requestres = urllib.request.urlopen("http://www.dlmu.edu.cn")html = res.read().decode("utf-8") print(html)

下面需要对以上的代码做一些解释:
(1)有人在网上查询python如何连接网络的时候会看到以下的代码:

import urllibres = urllib.urlopen("XXX")

为什么上面的代码没有加上request,很简单。因为上面的代码python2.x版本写的,在此有必要说明一下,python2.x与python3.x的版本是不兼容的。与url有关的库,在2.x的版本中分为urllib和urllib2两个,而在python3.x版本中则只有urllib这一个库。在2.x的版本中,访问网络使用的模块在urllib库中,而函数正是urlopen。在3.x中,访问网络使用的是库中request模块。
(2)urlopen是一个函数,一个urllib.request模块中的函数,它的返回值为一个python对象,一个实例化的对象。如果把它直接read()出来,就是一系列的二进制代码。因为网页的书写标准是utf-8格式,所以使用utf-8进行decode()就能按照网页形式进行显示。
(五)、python爬虫需要注意的几点:
(1)在此,需要了解下python中的文件操作。在文件操作中,会涉及到一系列关于文档的操作,比如打开文件,写入文件,读出文档,关闭文档。这一系列的操作网上都有详细的讲解,在此不再赘述。我们在此提及一个特殊的语句:with-as语句,我们下次重点详细了解。
(2)python访问网络的存在隐藏问题,一般网页访问服务器的时候,都会有一个headers,就是我们常说的“过滤消息头”,这个消息头中会有一个User-Agent。当我们访问服务器的时候,服务器会检查访问来源headers里面的消息头,一般的消息头内容都是浏览器的版本与系统架构。而代码访问的消息头几乎都是使用编程软件的版本。因此,如果不在代码中人工修改代理的话,就会被服务器自动过滤掉。添加消息头的办法很简单,因为上面提到过, urlopen函数返回的是一个python对象,而这个对象可以直接调用add_header函数直接添加消息头。
(3)使用代理IP的问题。为什么使用代理IP呢?我们上面讲到,python访问服务器的时候,我们把消息头已经改写,服务器会让代码访问。但是代码的运行周期是很短的,如果在一定的期限内,访问服务器的次数过多,服务区就会发现问题。它就会把这个访问的IP地址封锁。这样一来,可谓釜底抽薪。因此我们不使用真实的IP地址,使用服务器“认识”的IP地址,这样即使服务器发现端倪,因为消息头和IP都没有错,也不会拒绝访问。
(六),注意点我们都已经提到了,下面该上代码了:

#首先做的就是导入库文件:需要什么都要导入,导入方式有两种。import urllib.requestimport osimport re#抽象出来的爬取网页的函数,传入的参数为一个url。还有为了使函数能够顺利运行或者报错,一般使用try-except函数;def get_html(url):    try:        res = urllib.request.Request(url)        res.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36') #(消息头在审查浏览器审查元素中找。网上有教程)        html = urllib.request.urlopen(res).read().decode('utf-8')    except:        print('网页打开失败.....')    return html#抽象出来的获得网页文件的函数,传入函数为html;def get_page(html):    z = r'<div class="postTitle"><a target="_blank" href="/(\d+.html)">.+</a></div>'    page = re.findall(z,html)    pagelist = []    for each in page:        pagelist.append('http://tt.mop.com/' + each)    return pagelist#抽象出的爬取图片的函数;def get_img(html):    z = r'<p class="tc mb10"><img src="([^"]+\.jpg)"></p>'    imglist = re.findall(z,html)    x = 1    for each in imglist:        filename = each.split('/')[-1]        urllib.request.urlretrieve(each,filename,None)        x +=1    print('成功下载%d张图片' % x)#这种模块化的写法,不仅仅是显得好看,更重要的是,模块化的思想,可以为以后的拓展做好准备。if __name__ == "__main__":    url = 'http://tt.mop.com/c35.html'    urllist = get_page(get_html(url))    if not os.path.exists('picture'):        os.mkdir('picture')    os.chdir('picture')    print('一共%d个图片帖子' % len(urllist))    y = 1    for each in urllist:        print('第%d页。。。。。。。' % y)        get_img(get_html(each))        y += 1    if y > len(urllist):        print('网页完全爬结束!!')

以上就是简单的爬虫程序,很多细节没有涉及到。这些细节在学习python的时候只要稍加注意就能很好的处理。利用python爬虫,可以写出很多有意思的代码,比如可以很精确的知道你们学校的男女比例,精确到小数点后四位。等等。。
注意:
(1)以上代码为windows下运行,并没有在linuxs下运行过;
(2)上面的网站只是很好的例子,只是因为图片较多才选取此网站;
(3)上面的代码为单线程代码,运行效率较低;
(4)有何不足,望众才子佳人批评!!!

0 0
原创粉丝点击