python3爬虫之入门基础和正则表达式
前面的python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享;爬虫说的简单,就是去抓取网路的数据进行分析处理;这章主要入门,了解几个爬虫的小测试,以及对爬虫用到的工具介绍,比如集合,队列,正则表达式; 用python抓取指定页面: 代码如下: import urllib.request url= "http://www.baidu.com" data = urllib.request.urlopen(url).read()# data = data.decode('UTF-8') print(data) urllib.request.urlopen(url) 官方文档 返回一个 http.client.HTTPResponse 对象,这个对象又用到的read()方法;返回数据;这个函数返回一个 http.client.HTTPResponse 对象,这个对象又有各种方法,比如我们用到的read()方法; 查找可变网址: import urllib import urllib.request data={} data['word']='one peace' url_values=urllib.parse.urlencode(data) url="http://www.baidu.com/s?" full_url=url+url_values a = urllib.request.urlopen(full_url) data=a.read() data=data.decode('UTF-8') print(data) ##打印出网址: a.geturl() data是一个字典,然后通过urllib.parse.urlencode()来将data转换为 ‘word=one+peace'的字符串,最后和url合并为full_url python正则表达式介绍: 队列 介绍 在爬虫的程序中用到了广度优先级算法,该算法用到了数据结构,当然你用list也可以实现队列,但是效率不高。现在在此处介绍下:在容器中有队列:collection.deque #队列简单测试: 集合介绍: 在爬虫程序中,为了不重复爬那些已经爬过的网站,我们需要把爬过的页面的url放进集合中,在每一次要爬某一个url之前,先看看集合里面是否已经存在. 如果已经存在,我们就跳过这个url; 如果不存在,我们先把url放入集合中,然后再去爬这个页面. Python 还 包 含 了 一 个 数 据 类 型―― set ( 集 合 ) 。 集 合 是 一 个 无 序 不 重 复 元素 的 集 。 基 本 功 能 包 括 关 系 测 试 和 消 除 重 复 元 素 。 集 合 对 象 还 支 持 union( 联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算。 大括号或 set() 函数可以用来创建集合。 注意:想要创建空集合,你必须使用set() 而不是 {} 。{}用于创建空字典; 集合的创建演示如下: a={"peace","peace","nick"} 正则表达式 在爬虫时收集回来的一般是字符流,我们要从中挑选出url就要求有简单的字符串处理能力,而用正则表达式可以轻松的完成这一任务; 正则表达式的步骤:1,正则表达式的编译 2,正则表达式匹配字符串 3,结果的处理 下图列出了正则表达式的语法: 在pytho中使用正则表达式,需要引入re模块;下面介绍下该模块中的一些方法; 1.compile和match re模块中compile用于生成pattern的对象,再通过调用pattern实例的match方法处理文本最终获得match实例;通过使用match获得信息; import re # 将正则表达式编译成Pattern对象 pattern = re.compile(r'rlovep') # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None m = pattern.match('rlovep.com') if m: # 使用Match获得分组信息 print(m.group()) ### 输出 ### # rlovep re.compile(strPattern[,flag]): 这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern',re.I | re.M)与re.compile('(?im)pattern')是等价的。 可选值有: re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同) M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图) S(DOTALL): 点任意匹配模式,改变'.'的行为 L(LOCALE): 使预定字符类 w W b B s S 取决于当前区域设定 U(UNICODE): 使预定字符类 w W b B s S d D 取决于unicode定义的字符属性 X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。 Match:Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。 属性: string: 匹配时使用的文本。 方法: group([group1,…]): Pattern不能直接实例化,必须使用re.compile()进行构造。 Pattern提供了几个可读属性用于获取表达式的相关信息: pattern: 编译时用的表达式字符串。 match(string[,pos[,endpos]]) | re.match(pattern,string[,flags]): 2.re.match(pattern,string,flags=0) 函数参数说明:
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
演示如下: #re.match. import re print(re.match("rlovep","rlovep.com"))##匹配rlovep print(re.match("rlovep","rlovep.com").span())##从开头匹配rlovep print(re.match("com","http://rlovep.com"))##不再起始位置不能匹配成功 ##输出: <_sre.SRE_Match object; span=(0,6),match='rlovep'> (0,6) None 实例二:使用group import re line = "This is my blog" #匹配含有is的字符串 matchObj = re.match( r'(.*) is (.*?) .*',line,re.M|re.I) #使用了组输出:当group不带参数是将整个匹配成功的输出 #当带参数为1时匹配的是最外层左边包括的第一个括号,一次类推; if matchObj: print ("matchObj.group() : ",matchObj.group())#匹配整个 print ("matchObj.group(1) : ",matchObj.group(1))#匹配的第一个括号 print ("matchObj.group(2) : ",matchObj.group(2))#匹配的第二个括号 else: print ("No match!!") #输出: matchObj.group() : This is my blog matchObj.group(1) : This matchObj.group(2) : my 3.re.search方法 re.search 扫描整个字符串并返回第一个成功的匹配。 函数语法: re.search(pattern,flags=0) 函数参数说明:
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
实例一: import re print(re.search("rlovep","rlovep.com").span()) print(re.search("com","http://rlovep.com").span()) #输出: import re print(re.search("rlovep","http://rlovep.com").span()) 实例二: import re line = "This is my blog" #匹配含有is的字符串 matchObj = re.search( r'(.*) is (.*?) .*',matchObj.group(2))#匹配的第二个括号 else: print ("No match!!") #输出: matchObj.group() : This is my blog matchObj.group(1) : This matchObj.group(2) : my search和match区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。 python爬虫小试牛刀 利用python抓取页面中所有的http协议的链接,并递归抓取子页面的链接。使用了集合和队列;此去爬的是我的网站,第一版很多bug;代码如下: import re import urllib.request import urllib from collections import deque #使用队列存放url queue = deque() >前面的python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享;爬虫说的简单,就是去抓取网路的数据进行分析处理;这章主要入门,了解几个爬虫的小测试,以及对爬虫用到的工具介绍,比如集合,队列,正则表达式; <!--more--> #使用visited防止重复爬同一页面 visited = set() url = 'http://rlovep.com' # 入口页面,可以换成别的 #入队最初的页面 queue.append(url) cnt = 0 while queue: url = queue.popleft() # 队首元素出队 visited |= {url} # 标记为已访问 print('已经抓取: ' + str(cnt) + ' 正在抓取 <--- ' + url) cnt += 1 #抓取页面 urlop = urllib.request.urlopen(url) #判断是否为html页面 if 'html' not in urlop.getheader('Content-Type'): continue # 避免程序异常中止,用try..catch处理异常 try: #转换为utf-8码 data = urlop.read().decode('utf-8') except: continue # 正则表达式提取页面中所有队列,并判断是否已经访问过,然后加入待爬队列 linkre = re.compile("href=['"]([^"'>]*?)['"].*?") for x in linkre.findall(data):##返回所有有匹配的列表 if 'http' in x and x not in visited:##判断是否为http协议链接,并判断是否抓取过 queue.append(x) print('加入队列 ---> ' + x) 结果如下:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |