手机版

python爬虫正则表达式技巧和抓取个人博客示例

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

这个博客和我《数据挖掘与分析》课程中的正则表达式爬虫有关。主要介绍Python正则表达式爬虫,讲述常见的正则表达式分析方法。最后通过实例爬上作者的个人博客网站。希望这篇基础文章对你有帮助。如果文章有错误或不足,请问韩海。真的很忙,好久没写博客了,不好意思~

一.正则表达式

正则表达式(简称Regex或RE),也称为正则表示或常规表示,常用于检索和替换符合某种模式的文本。它首先设置一些特殊的字词组合,通过组合后的“正则字符串”对表达式进行过滤,从而得到或匹配我们想要的特定内容。它具有灵活性、逻辑性、功能性强的优点,可以通过表达式从字符串中快速找到需要的信息,但对于刚认识的人来说很难理解。

1.re模块

Python通过re模块支持正则表达式,在使用正则表达式之前需要导入库。

Import re import re的基本步骤是将正则表达式的字符串形式编译成Pattern实例,然后使用Pattern实例处理文本并获得Match实例,然后使用Match实例获得所需的信息。常用的函数是findall,原型如下:

查找全部(字符串[,位置[,结束位置]]) | re。find all (pattern,string [,flags])该函数表示搜索字符串,并以列表的形式返回所有可以匹配的子字符串。

参数re包括三个常用值:

(1)re。我(re。IGNORECASE):忽略大小写(括号内完整书写)

(2)re。M(re。多线):允许多线模式

(3)re。S(re。DOTALL):支持任意匹配模式的点

Pattern对象是一个编译好的正则表达式,文本可以通过Pattern提供的一系列方法进行匹配和搜索。模式不能直接实例化,必须使用re.compile()构造。

2 .复杂方法

re正则表达式模块包括一些常用的操作函数,如complie()函数。其原型如下:

编译(模式[,标志])该函数从包含正则表达式的字符串创建一个模式对象,并返回一个模式对象。参数标志是一种匹配模式,可以表示为按位或“|”,也可以在正则表达式字符串中指定。模式对象不能直接实例化,只能通过编译方法获取。

举个简单的例子,使用正则表达式获取字符串中的数字内容,如下所示:

导入re string='A1.45,b5,6.45,8.82' regex=re.compile(r'\d \。\ d *') printregex。findall (string) ['1.45 ',' 5 ',' 6.45 ',' 8.82'] 3。匹配方法

match方法从字符串的位置下标开始匹配模式,如果模式在末尾匹配,则返回一个Match对象;如果模式在匹配过程中无法匹配,或者匹配在结束前已经到达终点,则返回无。该方法的原型如下:

匹配(字符串[,位置[,结束位置]]) | re。match (pattern,string [,flags])参数string表示字符串;Pos代表下标,pos和endpos的默认值分别为0和LEN(String);编译模式时,参数标志用于指定匹配模式。

4 .搜索方法

Search方法用于查找字符串中可以成功匹配的子字符串。尝试从字符串的位置下标匹配模式,如果模式在末尾仍然可以匹配,则返回匹配对象;如果无法匹配,则在pos中添加1,然后再次尝试匹配;如果在pos=endpos之前没有匹配,将返回None。功能原型如下:

搜索(字符串[,位置[,结束位置]]) | re。search (pattern,string [,flags])参数string表示字符串;Pos代表下标,pos和endpos的默认值为0和len(string));分别为。编译模式时,参数标志用于指定匹配模式。

5 .分组和分组方法

组([组1,】)方法用于获取分组截取的一个或多个字符串,当指定多个参数时,将作为元组返回。group([default])方法以元组的形式返回所有截获的字符串,这相当于调用group(1,2,…last)。Default表示未截取字符串的组被该值替换,默认值为None。

2.通过正则表达式捕获网络数据的常用方法

第三节作者将介绍一些用正则表达式捕捉网络数据的技巧,是作者对自然语言处理和数据捕捉实际编程的总结,可能不是很系统,但也能给读者提供一些捕捉数据的思路,解决一些实际问题。

1.抓取标签之间的内容

HTML使用标签对编写网站,包括开始标签和结束标签,如head/head、tr/tr、scriptscript等。下面解释如何在标记对之间抓取文本内容。

(1)抓取标题标签之间的内容

首先,抓取网页的标题,正则表达式为‘title()。*?)/title ',抓取百度标题代码如下:

# coding=utf-8 import re import URL lib URL=' http://www . Baidu.com/' content=URL lib . URL open(URL)。read() title=re.findall(r'title()。*?)/title ',content)打印标题[0]#百度一下,就知道代码调用了urllib库的urlopen()函数打开超链接,并使用正则表达式库中的findall()函数查找标题标签之间的内容。由于findall()函数获取所有满足正则表达式的文本,因此可以输出第一个值title[0]。这是获取标签的另一种方法。

pat=r '(?=标题)。*?(?=/title)' ex=re。编译(pat,re。m | re。s) obj=re。搜索(例如,内容)标题=obj。group()打印标题#百度一下,就知道了(2)抓取超链接标签之间的内容

在HTML中,a href=URL/a用于标识超链接,test03_08.py文件用于获取超链接a和/a之间完整的超链接和内容.

# coding=utf-8导入重新导入URL lib URL=' http://www.baidu.com/'content=URL lib . urllopen(URL)。read () #获取完整的超链接res=r'a。*?href=。*?\/a ' URL=re。查找URLs 3360中u的全部(RES,content)打印unicode (u,' utf-8') #获取超链接a和/a res=r'a之间的内容。*?(.*?)/a' textures=re。findall (res,content,re。s | re。m)对于纹理:中的t打印unicode (t,' utf-8 ')输出结果如下。这里,如果直接输出print u或print t t,可能会出现乱码,所以需要调用函数unicode(u,' utf-8 ')

#获取完整的超链接a href=' http://news . Baidu.com ' rel=' external nofollow ' rel=' external nofollow ' name=' TJ _ trnews ' class=' mnav ' news/Aa href=' http://www . Hao 123.com ' rel=' external nofollow ' rel=' external nofollow ' name=' TJ _ trhao 123 ' class=' mnav ' Hao 123/Aa href=' http://map . Baidu.com ' rel='.#获取超链接A和/A之间的内容新闻,浩123地图视频.(3)抓取TR \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \

网页中常用的布局有表格布局或div布局,其中表格布局中常用的标签有tr、th和td、表格行tr、表格数据TD和th(表格标题th。那么如何抓取这些标签之间的内容呢?下面代码是为了获取它们之间的内容。

假设HTML代码如下所示:

html head title table/title/head dy table border=1 rth学号/th name/th/tr trtd 1001/tdtd yang张绣/TD/trtd 1002/tdtdtd阎娜/td/tr /table/body/html,那么对应值的Python代码如下爬取:

# coding=utf-8 import重新导入urllib内容=urllib.urllopen ('test.html ')。read () #打开本地文件#获取tr/tr res=r'tr()之间的内容。*?)/tr '纹理=re。查找所有(资源、内容、资源。s | re。m)对于文本:中的m,打印m #以获取文本:中m的th和th之间的内容res_th=r'th(。*?)/th' m _ th=re。查找全部(RES _ th,m,re。s | re。m)对于t in m _ th:打印t #直接获取TD和TD res=r'td(。*?)/tdtd(。*?)/td' textures=re。findall (res,content,re。s | re。m)对于纹理:中的m打印m [0],m [1]的输出结果如下:首先得到tr之间的内容,然后得到tr之间的内容中th和/th之间的值,即“学号”和“姓名”

学生编号/THH姓名/thtd1001/tdtd杨秀贞/tdtd1002/tdtd阎娜/td学生编号姓名1001杨秀贞1002阎娜2。获取标签中的参数

(1)抓取超链接标签的URL

HTML超链接的基本格式是“a href=URL链接内容/a”。现在你需要得到其中的网址链接地址。方法如下:

# coding=utf-8 import re content=' ' ' a href=' http://news . Baidu.com ' rel=' external nofollow ' rel=' external nofollow ' name=' TJ _ trnews ' class=' mnav ' news/Aa href=' http://www . Hao 123.com ' rel=' external nofollow ' rel=' external nofollow ' name=' TJ _ trhao 123 ' class=' mnav ' Hao 123/Aa href=' http://=href=\ ')。(?=\')|(?=href=\ ')。(?=\ ')' URL=re。findall (res,content,re。我| re。s | re。m)对于网址中的网址3360打印网址输出如下:

http://news.baidu.com http://www.hao123.com http://map.baidu.com http://v.baidu.com(2)抓取图片超链接标签的URL。

HTML插入图片使用的标签基本格式为“img src=图片地址/”,因此获取图片URL链接地址的方法如下:

content=' ' ' img alt=' Python ' src=' http :http://www.csdn.net/eastmount.jpg'/' ' ' URL=re . findall(' src=' http :(。*?)'',内容,re.i | re.s | re.m)打印网址#[' http://www . csdn . net/east mount . jpg ']图片对应的超链接为“http://www . csdn . net/east mount . jpg”。这些资源通常存储在服务器端。最后,那么如何获取URL中的最后一个参数呢?

(3)获取网址中的最后一个参数

通常在用Python爬行图片的过程中,会遇到图片对应的URL的最后一个字段通常是用来命名图片的,比如前面的“eastmount.jpg”,需要通过URL“/”后面的参数来获取图片。

content=' ' ' img alt=' Python ' src=' http :http://www.csdn.net/eastmount.jpg'/' ' '网址='http://www.csdn.net/eastmount.jpg'name=URLs . split('/')[-1]print name # eastmount.jpg这段代码表示用字符“/”来分割字符串,最后得到的值是图片名称。

3.字符串处理和替换

在使用正则表达式对网页文本进行爬网时,我们通常需要调用find()函数来查找指定的位置,然后进一步进行爬网,例如,获取class属性为“infobox”的表表,然后按位置进行爬网。

开始=内容。find(r ' table class=' info box ' ')# start position end=content . find(r '/table ')# key point position info box=text[start : end]print info box在抓取过程中可能会同时抓取不相关的变量,因此需要对不相关的内容进行过滤。这里建议使用replace函数和正则表达式进行处理。例如,爬网内容如下:

# coding=utf-8 import recontent=' ' ' trtd 1001/TDT yang张绣br//TD/trtd 1002/TDT yanna/TD/trtd 1003/TDT bpython/b/TD/tr ' ' ' RES=r ' TD(。*?)/tdtd(。*?)/TD' textures=re。findall (RES,content,re。s | re。m)对于纹理:中的m打印m [0],m [1]的输出如下:

1001杨br /1002 1003 BPython/B此时需要过滤掉多余的字符串,比如换行(br/)、空格()和加粗(B/B)。

过滤器代码如下:

# coding=utf-8 import recontent=' ' ' trtd 1001/TDT yang张绣br//TD/trtd 1002/TDT yanna/TD/trtd 1003/TDT bpython/b/TD/tr ' ' ' RES=r ' TD(。*?)/tdtd(。*?)/td' texts=re.findall(res,content,re。S|re。m)表示文本:中的m值0=m[0]。替换(' br /',' ')。替换(“”,“”)值1=m[1]。替换(' br /',' ')。如果值1: m_value=re.findall(r'B()中的“B”,则替换(“,”)。*?)/b ',值1,re。s | re。m) printvalue0,m _ value [0] else : printvalue0,value1采用replace将字符串“br/”或“'”替换为空白实现过滤,而bold (B/B)则需要通过正则表达式进行过滤,输出结果如下:

1001杨1002 1003蟒三。爬行个人博客的实际例子

在描述了正则表达式、常用的网络数据抓取模块、正则表达式抓取数据的常用方法之后,我们将描述一个简单的正则表达式抓取网站的例子。在这里,作者用正则表达式抓取作者个人博客网站的一个简单示例,以获取所需内容。

作者个人网站“http://www . eastmontyxz.com/”打开如下图所示。

假设我们现在需要爬行的内容如下:

1.博客网站标题的内容。

2.抓取所有图片的超链接,如img src="xxx.jpg "中的" xxx.jpg"/。

3.在博客首页抓取“再见北京理工大学:追忆北京研究生编程时光”等4篇文章的标题、超链接和摘要。

1.分析过程

第一步是定位浏览器源代码

首先通过浏览器定位这些元素的源代码,找到它们之间的规则,这叫做DOM树文档节点树分析,找到待爬节点对应的属性和属性值,如图3.6所示。

标题“再见北京理工大学:追忆北京研究生编程时光”位于div class="essay"/div节点下,包含一个h1/h1记录标题和一个p/p记录汇总信息,即:

div class=' essay ' h1 style=' text-align : center ' a href=' http://blog.csdn.net/eastmount/./52201984' rel=' external no follow '再见北京理工大学:回忆北京研究生的编程时光/a/h1p style=' text-index '两年前,我本科毕业,写了这样一篇文章:《回忆自己的大学四年得与失》,感受在北京软医学院四年的收入损失;两年后,我离开帝都,回到贵州老家,准备开始新的教学生涯,并在这里写一篇文章纪念一下!再次:这篇文章是给我自己的。我希望多年后,回忆起我在北京的六年,会是一段美好的回忆。文章可能有点长,但希望大家能像看小说一样耐心看完./p/div另外三篇文章也是div class=" essa 1 "/div,div class=" essa 2 "/div和div class=" essa 3 "/div。

正则表达式抓取标题

网站的标题通常位于标题之间./标题/标题。抓取博客网站“张绣学习世界”标题的方法是通过正则表达式“标题(。*?)/title”,代码如下。首先通过urlopen()函数访问博客URL,然后定义正则表达式爬行。如下图所示:

第三步是通过正则表达式抓取所有图片地址

由于HTML插入图片标签的格式为“img src=图片地址/”,所以使用正则表达式获取图片URL链接地址的方法如下:获取以“src=”开头,以双引号结尾的内容。

导入重新导入URL lib URL=' http://www . eastmontyxz.com/'内容=urllib.urlopen(url)。read()URL=re . findall(r ' src=' http :(。*?)'',内容)对于URL中的URLs :打印URL输出共显示6张图片,但每张图片中省略了博客地址“http://www . eastmontyxz.com/”,相关地址可以通过浏览器访问,如"http://www.eastmountyxz.com/images/11.gif"。

第四步是用正则表达式抓取博客内容

第一步描述了如何定位四篇文章的标题。第一篇文章位于div class="essay "和/div标签之间,第二篇文章位于div class="essay 1 "和/div之间,以此类推。但是HTML代码中有一个错误:class属性通常代表一种标签,它们的值应该是相同的,所以这四篇文章的class属性应该是“essay”,可以用名称或者id来标识它们唯一的值。

使用find()函数定位div class="essay "的开始和/div的结束,并得到它们之间的值。例如,获取第一篇文章的标题和超链接代码如下:

导入重新导入URL lib URL=' http://www . eastmontyxz.com/'内容=urllib.urlopen(url)。read()start=content . find(r ' div class=' essay ' ')End=content . find(r ' div class=' essay 1 ' ')打印内容[start : end]这部分代码分为三个步骤:

(1)调用urllib库的urlopen()函数打开博客地址,读取内容并赋给内容变量。

(2)调用find()函数查找具体内容,如类属性为“essay”的div标签,依次定位采集的开始和结束。

(3)进行下一步分析,获取源代码中的超链接和标题。

定位该内容后,通过正则表达式获取具体内容。代码如下:

导入重新导入URL lib URL=' http://www . eastmontyxz.com/'内容=urllib.urlopen(url)。read()start=content . find(r ' div class=' essay ' ')end=content . find(r ' div class=' essay 1 ' ')page=content[start : end]RES=r '(?=href=\ ')。(?=\')|(?=href=\ ')。(?=\')'t1=re.findall(res,page) #超链接打印t1[0]t2=re.findall(r'a。*?(.*?)/a ',页)# title print 2[0]T3=re。findall ('p style=。*?(.*?)/p ',page,re。M|re。S) # abstract (print t3[0]分别调用正则表达式获取内容。由于已爬网段落(p)包含换行内容,因此有必要添加re。m和re。支持换行搜索。最终输出如下:

http://blog.csdn.net/eastmount/article/details/52201984再见北京理工大学:回忆北京研究生的编程时光两年前,我本科毕业,写了这样一篇文章:《回忆自己的大学四年得与失》,感受在北京软医学院四年收入的流失;两年后,我离开帝都,回到贵州老家,准备开始新的教学生涯,并在这里写一篇文章纪念一下!再次:这篇文章是给我自己的。我希望多年后,回忆起我在北京的六年,会是一段美好的回忆。文章可能有点长,但希望大家能像看小说一样耐心看完.2.代码实现

完整的代码参考test03_10.py文件,代码如下所示。

# coding: utf-8导入重新导入URL lib URL=' http://www.eastmountyxz.com/'content。read () #爬网标题title=re.findall(r'title(。*?)/title ',内容)打印标题[0]#爬网图片地址URL=re . findall(r ' src=' http 3360(。*?)'',内容)对于urls:中的URL,打印URL #爬网内容开始=内容. find (r' div class=' essay ' ')结束=内容. find (r' div class=' essay 1 ' ')页面=内容[开始:结束] RES=r '(?=href=\ ')。(?=\')|(?=href=\ ')。(?=\')'t1=re.findall(res,page) #超链接打印t1[0]t2=re.findall(r'a。*?(.*?)/a ',页)# title print 2[0]T3=re。findall ('p style=。*?(.*?)/p ',page,re。M|re。s)# summary(print 3[0]print ' ' start=content . find(r ' div class=' essay 1 ' ')end=content . find(r ' div class=' essay 2 ' ')page=content[start=href=\ ')。(?=\')|(?=href=\ ')。(?=\')'t1=re.findall(res,page) #超链接打印t1[0]t2=re.findall(r'a。*?(.*?)/a ',页)# title print 2[0]T3=re。findall ('p style=。*?(.*?)/p ',page,re。M|re。S) #总结(打印t3[0]的输出结果如图所示。

通过上面的代码,读者会发现使用正则表达式抓取网站很麻烦,尤其是在定位网页节点时。后面我们会讲到Python提供的常用的第三方扩展包,利用这些包的功能进行定向抓取。

希望这篇文字对大家有所帮助,尤其是刚接触爬行动物或者遇到过类似问题的人。还建议您使用美化程序、Selenium、scratch和其他库来爬网数据。

以上关于python爬虫正则表达式使用技巧的讲解和爬个人博客的例子,都是边肖分享的内容,希望能给大家一个参考和支持。

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