爬虫软件python功能_Python 网络爬虫程序详解

#!/usr/bin/python #调用python

from sys import argv #导入sys是导入python解释器和他环境相关的参数

from os import makedirs,unlink,sep  #os主要提供对系统路径,文件重命名和删除文件所需的函数

#makedirs是创建递归文件夹的函数。

#比如说我们要创建一个新的目录,/python/HTML/crawl,但是目前这三个文件夹都不存在,如果使用mkdir命令的话需要使用三次才能完成,

#但是使用os.makedir只需使用一次就可以创建好整个目录。

#os.makedirs(os.path.join(os.erviron["HOME"],"python","HTML","crawl")

#os.unlink(path)删除file路径,和remove()相同。

#sep os.sep系统用此来分割路径名

from os.path import dirname,exists,isdir,splitext

#使用os中的这些模块来提取dirname路径名,exists,isdir是文件类型测试,测试是否是一个目录,splitext是将文件名和文件后缀分离。分成目录文件名和后缀两部分。

from string import replace,find,lower  #导入string模块,用于字符串的替换,查找,和小写化。

from htmllib import HTMLParser

from urllib import urlretrieve  #urlretrieve()函数用于将HTML文件整个下载到你的本地硬盘中去。

from urlparse import urlparse,urljoin  #urlparse用于将URL分解成6个元素,而urljoin用于将baseurl和newurl组合在一起

from formatter import DumbWriter,AbstractFormatter  #formatter函数主要用于格式化文本

from cStringIO import StringIO  #调用cStringIO函数对内存中的文件进行处理

#Retriever类负责从网上下载网页并对每一个文档里面的连接进行分析,如果符合下载原则就添加到“待处理”队列中。

#从网上下载到的每个主页都有一个与之对应的Retriever实例。Retriever有几个帮助实现功能的方法,分别是:

#构造器(__init__()),filename(),download()和parseAndGetLinks()。

class Retriever:

def __init__(self,url):

#定义构造器,指向当前类的当前实例的引用。self 指向新创建的对象,另外一个参数是url.

#构造器实例化一个Retriever对象,并且把URL字符串和从filename()返回的与之对应的文件名保存为本地属性。

self.url=url  #将url的值付给self.url

self.file=self.filename(url)

def filename(self,url,deffile="index.html"):  #定义filename方法,涉及另外两个参数,url,deffile,很明显deffile是后缀

parsedurl=urlparse(url,"http:",0)

urlparse(urlstr,defProtsch=None,allowFrag=None),defProtsch定义了缺醒的网络协议和下载方式,allow是一个表示是否允许在URL中使用不完整成分的操作标志。allow_fragment如果是false,即使在URL addressing scheme支持fragment identifiers得情况下fragment identifiers也不允许,默认情况下fragment的默认值是true.

path=parsedurl[1]+parsedurl[2]

从urlparse分离出来的六个元素分别是(prot_shc,net_loc,path,params,query,frag).

parseurl[1]是net_loc,parseurl[2]是path.

和在一起正好是整个路径

ext=splitext(path)

将path分解成目录文件名和后缀标志。

if ext[1]=="":

如果没有文件。ext是一个字符串,ext[0]就是目录文件名,而ext[1]就是后缀名,说明没有后缀

if path[-1]=="/":

并且path是比如说是以我的博客为例,http://blog.csdn.net/yangwenchao1983,分离后path[-1]=3,也就是字符串的最后一个字母,如果是/,说明有文件内容,

path=path+deffile

如果URL没有尾缀的文件名,就用缺性的"index.html“作为文假名,可以说是一个主王爷,上面有各种文件公下载,现在没有合适的文件,我们酒吧index.html作为补充。

else:

path=path+"/"+deffile  #如果是一个完整的文件名,我们需要在后面加上/index.html  如果不含有"/"符号的话,

dir=dirname(path)  #提取path字符串的目录名称

if sep!="/":  #如果文件的分割符不是/

dir=replace(dir,"/",sep)  #将dir中的/替换成分割符,/

if not isdir(dir):  #使用isdir辨别文件类型不是目录。

if exists(dir): unlink(dir)  #如果不是目录文件,就是用unlink移除,

makedirs(dir)  #重新使用makedirs创建目录文件

return path  #返回经过整理的路径

def download(self):  #定义download()方法,使用try...except...来进行异常处理,

try:

retval=urlretrieve(self.url,self.file)

urlretrieve()不像urlopen()那样对URL进行读操作,它只是简单的把位于urlstr处的HTML文件整个下载到你的本地硬盘中去,如果没有给出localfile,它就会把数据保存到一个临时文件中去。很明显,这行程序的意思就是将self.url从望上的某个地方拷贝到硬盘的self.file中去。

except IOError:

如果文件不存在,就会引发IOerror,

retval=("***ERROR: invalid URL "%s"" %\self.url,)

没有在有效的网址上找到这个文件,就将"***ERROR: invalid URL "%s""打印出来

return retval  #返回得到的文件

def parseAndGetLinks(self):

如果上面的的处理没有发现任何错误,就会调用parseAndGetLinks()对新下载打破的主页进行分析,确定对那个主页上的每一个连接应该采取什么样的行动。

self.parser=HTMLParser(AbstractFormatter(DumbWriter(StringIO())))

使用HTMLParser的方法进行处理,StringIO是从内存中读取数据,DumbWriter将事件流转换为存文本文档。

self.parser.feed(open(self.file).read())

将self.file文件打开并且一次性读入上面定义的的文件中去

self.parser.close()  #关闭文件

return self.parser.anchorlist  #返回地址和日期

class Crawler:

Crawler由三个数据项组成,这三个数据项是由构造器在实例化阶段报存在这里的。

count = 0   #静态下载主页计数器

def __init__(self,url):

self.q=[url]

第一个数据是q,这是一个有下载连接组成的队列,这个清单在执行过程中是会变化的,没处理一个主页它就缩短一次,而在各下载主页中发现一个新的连接就会被加长。

self.seen=[]

Crawler的另外两个数据项包括seen-这是我们已经下载过的全体连接所组成的一个列表;

self.dom=urlparse(url)[1]

把主连接的域名报存在dom中,用这个值核对后续连接是否属于这同一个区域。

def getPage(self,url):

getPage()方法用第一个连接实例化出一个Retriever对象,从她开始进行后续的处理。

r=Retriever(url)

使用上面定义过得Retriever类,付给r。

retval=r.download()  #下载网页连接,

if retval[0]=="*":

print retval,"...skipping parse"

return

Crawler.count=Crawler.count+1

Crawler还有一个静态数据叫做count。这个计数器的作用就是记录我们呢已经从望红色那个下载到的对象的个数,每成功下载一个主页,就让它增加一个数。

print "\n(",Crawler.count,")"

print "URL:",url

print "FILE:",retval[0]

self.seen.append(url)

links=r.parseAndGetLinks()

for eachLink in Links:

if eachLink[:4]!="http" and find(eachLink,"://")==-1

print "*",eachLink,

以下链接将被忽略,不会被添加到待处理队列里去的:属于另外一个域的连接,已经被下载过得链接,已经放入待处理队列里去的连接或者是"mailto:"连接。

if find(lower(eachLink),"mailto:")!=-1:应该是超连接

print "...discard,mailto link"

contine

if eachlink not in self.seen:

if find(eachLink,self.dom)==-1:

print "...discarded,not in domain"

else:

if eachLink not in self.q:

self.q.append(eachLink)

print "...new,aded to Q"

else:

print "...discarded,already in Q"

else:

print "...discarded,already processed"

def go(self):

while self.q:

url=self.q.pop()

self.getPage(url)

def main():

if len(argv)>1:

url=argv[1]

else:

try:

url=raw_input("Enter starting URL:")

except(KeyboardInterrupt,EOFError):

url=""

if not url: return

robot=Crawler(url)

robot.go()

if __name__=="__main__":

main()

main()只有在这个脚本程序在直接被调用时才会执行,它是程序的出发点,其他导入了crawl.py的模块需要明确的调用main()才能开始处理。要让main()开始执行,需要给它一个URL,如果已经在一个命令行给出URL(例如我们直接调用这个脚本程序的时候),它就会从给定的URL起开始运行;否则,脚本程序将进入交互模式,提示用户输入一个URL。有了初始连接之后,程序将对Crawler类进行实例化并开始执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

价钱转换python_如何在python中转换货币?

我正在做一个虚拟助手项目。我想让它告诉我其他货币的美元汇率。我用beauthoulsoup编写了以下代码,它从给定的网站获取数据,对其进行解析并在命令行中打印结果供我阅读。但这只是美元对巴基斯坦卢比。如何修改程序,使其接受任何货币并告诉我该…

char qt 转unicode_Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 乱码与转码问题...

2012-03-22 14:00175人阅读评论(0)代码如下:如果不不设全局的字符集是utf-8,那么网上一般的方法是可以转的。如下程序中 #define DD 1的情况下;但是如果设置了全局的utf-8,再用以前的方法:QByteArraybaaaa.toLatin1();…

计算机图形学考试题及答案_计算机图形学考试题及答案

3、在图形文件中,常用来描述图形元素(点,线,圆,弧等);而在光栅扫描图形显示器中,采用显示所有图形。4、当三维物体用透视变换方程投影到观察平面上,物体中不与观察平面平行任一簇平行线投影成收…

子窗体中组合框联动_一张表实现组合框联动

嗨,大家中午好!最近,有网友给我私信,想要一个联动的示例,一个有关于部门联动的操作。其实关于联动的操作有很多,可以是组合框的联动,列表框联动,组合框与列表框也可以联动&#xff0…

中如何实现文字转语音_录音转文字、文字转语音,学会这一招就够了!手把手教你如何操作...

阅读文章时候想着有人可以把文章读给我听就好了,写作时想着语音直接可以转换成文字就好了,大家是不是有时会突然冒出这样的想法?七十这些看似天真的想法,还真的有办法解决,这里就手把手教你如何操作才能将的文字转换成…

图像 理想低通滤波_图像处理之滤波(下)

[toc]目录一、常规滤波低通高通带通带阻二、非局部均值滤波三、维纳滤波四、卡尔曼滤波前言所谓滤波,其实就是从混合在一起的诸多信号中提取出所需要的信号。信号的分类:确定型信号,可以表示为确定的时间函数,可确定其在任何时刻的…

泰山行宫碧霞元君祠_临清市泰山行宫碧霞元君祠5月4号(农历三月三十日)举行大型泰山奶奶接驾法会...

临清是泰山奶奶的娘家,每年的四月泰山奶奶要回临清省亲临清市道教协会定于2019年农历三月三十(5月4号星期六)于临清桑树园泰山行宫碧霞元君祠举行大型泰山奶奶迎鸾接驾庙会。届时,将有架鼓会、云龙会、狮胞会、钢叉会、高跷会、天音会、彩船会、秧歌会等…

充分条件反过来是必要条件吗_“充分必要条件”引发的现实思考

昨天看了一篇文章是介绍“充分条件和必要条件”,大致就是A能直接推导出B,那A就是B的充分条件。A不一定能推导出B,但是没A一定推导不出B,那A就是B必要条件。举个简单的例子:对你好(A)与喜欢你&am…

手机游戏降低游戏延迟的软件_怎么降低手机网络延迟(减少网络延迟的5个小技巧)...

在过去的几十年里,用户或开发人员并不担心延迟。在上世纪90年代和本世纪初,个人互联网连接速度要慢得多,因此发送请求和接收响应之间的延迟要远远小于下载完成所需的时间。如今,更高的带宽连接使下载速度更快,因此延迟…

mysql常用的开发软件下载_强烈推荐!14款经典的MySQL客户端软件

【IT168 评论】不用我说,大家都知道MySQL是一个怎么样的数据库。虽然它的命运比较坎坷,但是丝毫没有影响到我们对MySQL的热情。不论是个人程序或者网站,还是企业数据库,MySQL的身影无处不在。无论做什么数据库的开发,一…

mysql最大值最小值_mysql最大值,最小值,总和查询与计数查询

1、最大值查询:mysql> select max(score) from 4a;------------| max(score) |------------| 93 |------------1 row in set (0.06 sec)2、最小值查询:mysql> select max(4a.score),min(4inall.score) from 4a,4inall;-------------------…

阿里云 centos mysql_在阿里云的CentOS环境中安装配置MySQL的教程

1 常规错误的yum安装方法:在前文中记述了CentOS 6.5系统中通过yum方式快速地搭建了LNMP环境,那么是否也能在CentOS 7或CentOS 7.1系统中依葫芦画瓢安装MySql5.6.24呢?答案是否定的。[roottypecodes ~]# yum -y install mysql mysql-server my…

mysql文件脱机_SQL数据库的脱机与联机操作

online : 可对数据库进行访问offline:数据库无法使用1、使用查询语句select state_desc from sysdatabases where name 数据库名 2、使用databasepropertyex( database,property)函数select databasepropertyex( 数据库 ,’ status )分离数据库:EXEC…

dockerfile 安装mysql_dockerfile构建mysql镜像

使用dockerfile构建mysql,镜像构建完成后,运行容器后,启动mysql服务总是报错Fatal error: Cant open and lock privilege tables: Table storage engine for db doesnt have this optionmysql安装使用的官方的压缩包mysql-5.7.20-linux-glibc…

ubunt11 安装mysql_ubuntu 11.10安装mysql

1. 安装devadmdevserver:~$ sudo apt-get install mysql-server......The following NEW packages will be installed:libdbd-mysql-perl libdbi-perl libhtml-template-perl libmysqlclient16libnet-daemon-perl libplrpc-perl mysql-client-5.1 mysql-client-core-5.1mysql-c…

mysql 取交集 php_mysql 查询结果取交集的方法

本文将详细介绍MySQL中如何实现以SQL查询返回的结果集取交集的实现方法,需要的朋友可以参考1MySQL中如何实现以下SQL查询(SELECT S.NameFROM STUDENT S, TRANSCRIPT TWHERE S.StudId T.StudId AND T.CrsCode CS305)INTERSECT(SELECT S.NameFROM STUDENT S, TRANSC…

mysql极客_极客mysql16

1.MySQL会为每个线程分配一个内存(sort_buffer)用于排序该内存大小为sort_buffer_size1>如果排序的数据量小于sort_buffer_size,排序将会在内存中完成2>如果排序数据量很大,内存中无法存下这么多数据,则会使用磁盘临时文件来辅助排序&a…

mysql触发器生成流水_利用mysql触发器生成流水号

http://blog.csdn.net/bluestream/article/details/5755176利用mysql触发器可以生成如日期(20100721)编号(0001)的流水号,编号每天都会从0001开始计算create table orders(orders_id int(10) primary key,customer_name varchar(100) );--------------------------------------…

linux 测试环境启用jar_Linux下搭建测试环境

一、下载安装包https://pan.baidu.com/s/1h-Nk8HcWKKtqbjrn0J_t1g 457jJDK1.8安装包、Tomcat8安装包本文用的远程连接Linux操作系统的客户端工具为Xshell,相关使用请自行百度二、安装JDK1、先检查该环境是否已经安装过jdk。输入java -version。如果有,…

代码中 密码存储_你还记得浏览器自动存储的密码吗?用js代码恢复一下记忆吧...

哈喽大家好我是无知便是罪专注于收集和分享互联网上不为人知的好东西正常来说我们的手机和浏览器都有一个非常实用的功能就是可以自动的加密存储我们的常用密码了然后呢在我们需要的时候呢它可以自动填入进来非常非常的省时省力不过呢这种功能的我们用久了就很容易忘记自己当初…