手机版

python3爬虫和正则表达式简介

时间:2021-10-01 来源:互联网 编辑:宝哥软件园 浏览:

之前的python3入门系列已经基本进入了python。从这一章开始,我们将介绍python的爬虫教程,并与大家分享。爬虫简单说就是抓取网络的数据进行分析处理;这一章主要是入门,了解一些爬行动物的小测试,介绍爬行动物使用的工具,比如集合、队列、正则表达式。

用python抓取指定页面:

代码如下:

导入URL lib . request URL=' http://www . Baidu.com ' data=URL lib . request . URL open(URL)。read()# data=data . decode(' UTF-8 ')print(数据)urllib.request.urlopen(url)官方文档返回一个http.client.HTTPResponse对象,该对象使用read()方法。返回数据;这个函数返回一个http.client.HTTPResponse对象,它有各种方法,比如我们使用的read()方法;

查找可变网址:

导入URL libimport URL lib . request data={ } data[' word ']=' one peace ' URL _ values=URL lib . parse . URL encode(数据)url='http://www.baidu.com/s?完整网址=网址网址值a=网址库。request . urllopen(full _ URL)data=a . read()data=data . decode(' utf-8 ')Print(data)# #打印出网址:a.geturl()data是一个字典。然后用urllib.parse.urlencode()将数据转换成一个' word=onepeace '的字符串,最后和url合并成full_url。

python正则表达式简介:

队列介绍

爬虫程序采用广度优先算法,采用数据结构。当然也可以用列表实现排队,但其效率不高。现在介绍一下:容器中有一个队列:collection.deque

# queue simple test:from collections import deque queue=deque([' peace ',' Rong ',' sisi '])queue . append(' nick ')queue . append(' pishi ')print(queue . popleft())print(queue . popleft())print(。

收藏介绍:

在爬虫程序中,为了不重复爬取已经被爬取的网站,我们需要将被爬取页面的url放入集合中,在每次爬取一个url之前,首先要检查集合中是否已经存在。如果它已经存在,我们将跳过这个网址。如果不存在,我们先把网址放入收藏,然后爬上这个页面。

Python还包括一个数据类类型——集。集合是一组无序且不复杂的复杂元素。基本功能包括相关性测试和消除多个复杂元素。合取图像还支持数学运算,如并集、交集、差集和系统差集。

大括号或set()函数可用于创建集合。请注意,想要创建一个空集合,必须使用set()而不是{}。{}用于创建空词典;

集合的创建演示如下:

a={'peace ',' peace ',' rong ',' rong ',' nick'}打印(a) 'peace' in a b=set(['peace ',' peace ',' rong ',' Rong'])打印(b) #演示联合打印(a|b) #演示交叉打印(ab) #演示差异打印(a-b) #对称差异集打印(a b) #输出:{'peace ',' Rong ',' nick'} {'peace ','。

正规表达式

一般来说,字符流是在爬行时收集的,所以我们需要简单的字符串处理能力来从中选择网址,正则表达式可以很容易地完成这个任务。

正则表达式的步骤:1。正则表达式的编译2。正则表达式3的匹配字符串。结果的处理。

下图列出了正则表达式的语法:

要在pytho中使用正则表达式,我们需要引入re模块。以下描述了本模块中的一些方法:

1 .编译和匹配。

re模块中的编译用于生成模式的对象,然后通过调用模式实例的match方法对文本进行处理,最终得到match实例。使用匹配获取信息;

将re#编译正则表达式导入Pattern对象Pattern=re.compile(r'rlovep')#使用Pattern匹配文本并获得匹配结果。将返回nonem=Pattern。Match ('rlovep.com ')如果m: #使用Match获取分组信息print(m . group())# # output # # # rlovepr.compile(strpattern[,flag]) :此方法是模式类的工厂方法,用于设置。第二个参数标志是匹配模式,它的值可以用按位or运算符“|”表示,如re。我| re。m此外,还可以在正则表达式字符串中指定模式,比如re.compile('pattern ',re。我| re。m)并重新编译('(?im)pattern’)是等效的。

可选值有:

Re。我(re。IGNORECASE):忽略大小写(括号内完整书写,下同)。

M(MULTILINE): multiline模式,改变''和' $ '的行为(见上图)。

S(DOTALL):点任意匹配模式,并改变“.”的行为。

L(LOCALE):使预定的字符类\w \W \b \B \s \S依赖于当前的语言环境。

U(UNICODE):使预定的字符类\ W \ b \ B \ s \ S \ d \ D依赖于UNICODE定义的字符属性。

X(VERBOSE):详细模式。在这种模式下,正则表达式可以是多行的,空白字符可以忽略,并且可以添加注释。

Match:Match对象是一个Match的结果,包含了很多关于这个Match的信息,可以通过使用Match提供的可读属性或方法来获取。

属性:

String:匹配时使用的文本。Re:匹配时使用的模式对象。Pos:文本中正则表达式开始搜索的索引。与值Pattern.match()和Pattern.seach()方法同名的参数相同。Endpos:文本中结束搜索的正则表达式的索引。与值Pattern.match()和Pattern.seach()方法同名的参数相同。Lastindex:文本中最后捕获的数据包的索引。如果没有捕获到数据包,则为无。Lastgroup:上次捕获的数据包的别名。如果此数据包没有别名或没有捕获的数据包,它将为无。

方法:

组([组1,】):获得由组截取的一个或多个字符串;当指定多个参数时,它们将作为元组返回。Group1可以使用数字或别名;0表示整个匹配的子字符串;未填写参数时,返回组(0);没有截获字符串的组返回无;多次截取的组返回最后截取的子串。group([default]):以元组的形式返回所有组截取的字符串。相当于主叫组(1,2,…最后)。Default表示未截取字符串的组被该值替换,默认值为None。Groupdict([default]):返回字典,其中别名组的别名作为关键字,该组截取的子字符串作为值。不包括没有别名的组。Default和上面的意思一样。Start([group]):返回字符串中指定组截取的子字符串的开始索引(子字符串第一个字符的索引)。组默认值为0。End([group]):返回字符串中指定组截取的子字符串的结束索引(子字符串最后一个字符的索引1)。组默认值为0。Span([group]):返回(开始(group),结束(group))。Expand(template):将匹配的数据包替换到模板中并返回。您可以在模板中使用\id或\gid或\gname引用分组,但不能使用数字0。\id相当于\ gid但是,10将被视为第10组。如果要在\1后表示字符“0”,只能使用\g10。Pattern:Pattern对象是一个编译良好的正则表达式,可以使用Pattern提供的一系列方法来匹配和查找文本。

模式不能直接实例化,必须使用re.compile()构造。

模式为获取表达式信息提供了几个可读的属性:

Pattern:编译中使用的表达式字符串。标志:编译的匹配模式。数字形式。Groups:表达式中的组数。Groupindex:字典,其关键字是表达式中带有别名的组的别名,其值是对应于该组的数字。不包括没有别名的组。示例[| re模块方法]:

Match (string [,pos [,end pos]]) | re.match (pattern,string [,flags]) :此方法将尝试从字符串的pos下标匹配模式;如果模式在最后仍然可以匹配,则返回一个匹配对象。如果模式在匹配过程中无法匹配,或者匹配在结束前已经到达终点,则返回无。pos和endpos的默认值分别为0和len(字符串);Re.match()不能指定这两个参数,参数标志用于在编译模式时指定匹配模式。注意:此方法不完全匹配。在模式结束时,如果字符串中还有字符,仍然会被视为成功。为了精确匹配,可以在表达式的末尾添加一个边界匹配器“$”。Search (string [,pos [,end pos]]) | re.search (pattern,string [,flags]) :此方法用于在可以成功匹配的字符串中查找子字符串。尝试从字符串的位置下标匹配模式,如果模式在末尾仍然可以匹配,则返回匹配对象;如果无法匹配,则在pos中添加1,再次尝试匹配;如果在pos=endpos之前没有匹配,则返回None。而pos和endpos的默认值是0和len(string));分别);Re.search()不能指定这两个参数,参数标志用于在编译模式时指定匹配的模式。Split (string [,maxsplit]) | re。split (pattern,string [,maxsplit]) :根据可以匹配的子字符串对字符串进行划分,并将其返回到列表中。Maxsplit用于指定拆分的最大数量,并不指定所有拆分。查找全部(字符串[,位置[,结束位置]]) | re。find all (pattern,string [,flags]) :搜索字符串,并以列表的形式返回所有可以匹配的子字符串。Finder (string [,pos [,end pos]]) | re.finder (pattern,string [,flags]) :搜索字符串并返回一个迭代器,该迭代器按顺序访问每个Matching结果(match对象)。Sub (repl,string [,count]) | re。sub (pattern,repl,string [,count]) :使用repl替换字符串中每个匹配的子字符串,然后返回替换后的字符串。当repl是字符串时,可以使用\id或\gid或\gname来表示分组,但不能使用数字0。当repl是一个方法时,这个方法应该只接受一个参数(Match对象)并返回一个字符串进行替换(返回的字符串不能再引用分组)。计数用于指定最大替换次数。如果未指定,则进行所有替换。Subn (repl,string [,count]) | re.sub (pattern,repl,string [,count]) :返回(sub(repl,string[,count]),替换次数)。

2.re.match(模式、字符串、标志=0)

参数描述:

描述与参数模式匹配的正则表达式字符串的字符串。flags标志用于控制正则表达式的匹配方式,如区分大小写、多行匹配等。我们可以使用group(num)或groups()匹配对象函数来获得匹配表达式。

matching object方法描述由group(num=0)匹配的整个表达式的字符串。Group()可以一次输入多个组号,在这种情况下,它将返回一个包含对应于这些组的值的元组。Groups()返回包含所有组字符串的元组,从1到包含的组号。演示如下:

# re . Match . import Republic(re . Match(' rlovep ',' rlovep.com ')# # Match rlovepprint(re . Match(' rlovep ',' rlovep.com ')。span ()) # #从头开始匹配rlovepprint(重新匹配()。http://rlovep.com ')##起始位置不再匹配成功# #输出:_sre。SRE _匹配对象;Span=(0,6),match=' r lovep' (0,6) none示例2:使用组。

Import reline='这是我的博客' # matches包含的字符串是matcheobj=re . matches(r '(。*)是(。*?).*,行,re。M|re。I)#使用组输出:当组没有参数时,是将成功匹配整个的输出#当参数为1时,匹配最外层左侧包含的第一个括号,类比一次;如果match obj : print ('matchobj . group()' : ',matchobj.group ()) #匹配整个打印(' matchObj.group(1) : ',MatchObj.group(1))#匹配第一个括号print(' match obj。第(2)组: ',matchobj。组(2)) #匹配的第二个括号else: print('不匹配!')#输出:matchobj.group () :这是我的blogmatchobj . group(1): this match obj . group(2): my 3 . re . search方法。

Re.search扫描整个字符串并返回第一个成功匹配的字符串。

函数语法:

re.search(模式、字符串、标志=0)

参数描述:

描述与参数模式匹配的正则表达式字符串的字符串。flags标志用于控制正则表达式的匹配方式,如区分大小写、多行匹配等。我们可以使用group(num)或groups()匹配对象函数来获得匹配表达式。

matching object方法描述由group(num=0)匹配的整个表达式的字符串。Group()可以一次输入多个组号,在这种情况下,它将返回一个包含对应于这些组的值的元组。Groups()返回包含所有组字符串的元组,从1到包含的组号。例1:

导入重印(re.search ('rlovep ',' rlovep.com ')。span ()) print (re.search ('com ',' http://rlovep.com ')。span ()) #输出:导入重新打印(re.search ('rlovep ')。R lovep.com ')。span ()) print (re.search ('com ',' http://r lovep.com ')。span())示例2:

导入重新链接='这是我的博客' #匹配包含的字符串是MatcheObj=re . search(r '(。*)是(。*?).*,行,re。M|re。I)#使用组输出:当组没有参数时,是将成功匹配整个的输出#当参数为1时,匹配最外层左侧包含的第一个括号,类比一次;如果match obj : print ('matchobj . group()' : ',matchobj.group ()) #匹配整个打印(' matchObj.group(1) : ',MatchObj.group(1))#匹配第一个括号print(' match obj。第(2)组: ',matchobj。组(2)) #匹配的第二个括号else: print('不匹配!')#输出:matchobj.group () :这是我的blogmatchobj . group(1): this match obj . group(2): my search和match区别:re.match只匹配字符串的开头,如果字符串不符合开头的正则表达式,匹配失败,函数返回None;并重新搜索整个字符串,直到找到匹配项。

Python爬虫小测试。

用python抓取页面中所有http协议的链接,递归抓取子页面的链接。使用集合和队列;这是我的网站,有很多bug在第一版中。代码如下:

导入重新导入urllib。请求从集合导入urllib导入deque #使用队列存储url队列=deque()。摆在我们面前的python3入门系列也基本进入了python。从这一章开始,我们将介绍python crawler教程并与大家分享。爬虫简单说就是抓取网络的数据进行分析处理;这一章主要是入门,了解一些爬行动物的小测试,介绍爬行动物使用的工具,比如集合、队列、正则表达式。-more-#使用visited防止在同一页面上重复爬网。visited=set()URL=' http://rlovep.com ' #入口页,它可以被另一个# queue替换。当queue: URL=queue时,追加(URL) CNT=0。popleft () #队列头元素出列已访问|={url} #标记为已访问打印(' :' str(cnt)已被抓取)。爬网—(网址)CNT=1 #爬网页面urlop=urllib.request.urllopen(网址)#如果“html”不在URL op . getheader(‘内容类型’)中,则确定它是否是html页面。3360继续#为避免程序异常终止,请尝试.catch来处理异常。try: #被转换为utf-8代码。Data=urlop.read()。decode ('UTF-8 ')除了3360continue #正则表达式提取页面中的所有队列,判断它们是否被访问过,然后加入要爬网的队列。re.com。)['\'].*?')用于linkre中的x。findall (data) : # #如果x和x中的' http '不在被访问的3360 # #中,则返回所有匹配列表,以判断它是否是http协议链接,以及queue . append(x)print(' join the queue-' x)是否已被爬网。结果如下:

版权声明:python3爬虫和正则表达式简介是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。