从零开始学Python爬虫(四):正则表达式

Python013

从零开始学Python爬虫(四):正则表达式,第1张

Regular Expression, 正则表达式, 种使 表达式的 式对字符串进 匹配的语法规则。

我们抓取到的 源代码本质上就是 个超 的字符串, 想从 提取内容。 正则再合适不过了。

正则的优点: 速度快, 效率 , 准确性 正则的缺点: 新 上 难度有点 。

不过只要掌握了正则编写的逻辑关系, 写出 个提取 内容的正则其实并不复杂

正则的语法: 使 元字符进 排列组合 来匹配字符串

在线测试正则表达式网址:

https://tool.oschina.net/regex/

元字符: 具有固定含义的特殊符号 常 元字符:

量词: 控制前 的元字符出现的次数

贪婪匹配和惰性匹配

这两个要着重的说 下,因为我们写爬 的最多的就是这个惰性匹配。

先看案例

那么接下来的问题是, 正则我会写了, 怎么在python程序中使 正则呢?答案是re模块

re模块中我们只需要记住这么 个功能就 够我们使 了。

下面一个案例,是练习用正则表达式提取豆瓣电影top250的数据并保存,一起来学一下吧。

初步接触python爬虫(其实python也是才起步),发现一段代码研究了一下,觉得还比较有用处,Mark下。 

上代码:

#!/usr/bin/python#coding=utf-8#Author: Andrew_liu#mender:cy"""

一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称

Anthor: Andrew_liu

mender:cy

Version: 0.0.2

Date: 2017-03-02

Language: Python2.7.12

Editor: JetBrains PyCharm 4.5.4

"""import stringimport reimport urllib2import timeclass DouBanSpider(object) :

"""类的简要说明

主要用于抓取豆瓣Top100的电影名称

Attributes:

page: 用于表示当前所处的抓取页面

cur_url: 用于表示当前争取抓取页面的url

datas: 存储处理好的抓取到的电影名称

_top_num: 用于记录当前的top号码

"""

def __init__(self):

self.page = 1

self.cur_url = "h0?start={page}&filter=&type="

self.datas = []

self._top_num = 1

print u"豆瓣电影爬虫准备就绪, 准备爬取数据..."

def get_page(self, cur_page):

"""

根据当前页码爬取网页HTML

Args:

cur_page: 表示当前所抓取的网站页码

Returns:

返回抓取到整个页面的HTML(unicode编码)

Raises:

URLError:url引发的异常

"""

url = self.cur_url        try:

my_page = urllib2.urlopen(url.format(page=(cur_page - 1) * 25)).read().decode("utf-8")        except urllib2.URLError, e:            if hasattr(e, "code"):                print "The server couldn't fulfill the request."

print "Error code: %s" % e.code            elif hasattr(e, "reason"):                print "We failed to reach a server. Please check your url and read the Reason"

print "Reason: %s" % e.reason        return my_page    def find_title(self, my_page):

"""

通过返回的整个网页HTML, 正则匹配前100的电影名称

Args:

my_page: 传入页面的HTML文本用于正则匹配

"""

temp_data = []

movie_items = re.findall(r'<span.*?class="title">(.*?)</span>', my_page, re.S)        for index, item in enumerate(movie_items):            if item.find("&nbsp") == -1:

temp_data.append("Top" + str(self._top_num) + " " + item)

self._top_num += 1

self.datas.extend(temp_data)    def start_spider(self):

"""

爬虫入口, 并控制爬虫抓取页面的范围

"""

while self.page <= 4:

my_page = self.get_page(self.page)

self.find_title(my_page)

self.page += 1def main():

print u"""

###############################

一个简单的豆瓣电影前100爬虫

Author: Andrew_liu

mender: cy

Version: 0.0.2

Date: 2017-03-02

###############################

"""

my_spider = DouBanSpider()

my_spider.start_spider()

fobj = open('/data/moxiaokai/HelloWorld/cyTest/blogcode/top_move.txt', 'w+')    for item in my_spider.datas:        print item

fobj.write(item.encode("utf-8")+'\n')

time.sleep(0.1)    print u"豆瓣爬虫爬取完成"if __name__ == '__main__':

main()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

运行结果: