虎哥的python小技巧放送之实现简单爬虫(2)

image

虎哥的python小技巧放送之实现简单爬虫(1)

在第一次爬虫教学里虎哥带大家利用python将网页源代码爬取出来后再使用最简单的索引的方法找到所需的信息。但这种在真实应用的时候是不可能使用的方法,因为要一个一个去数它的位置。接下来我们要说一些现实可用的方法来获取我们想要的信息。

第二期我们要说的方法是使用正则表达式来匹配想要的信息。正则表达式是个非常常用的技巧,不仅是在爬虫中会用到,任何文本匹配都可以使用正则表达式;或者是文本中的查找信息等,都可以使用正则表达式的方法。

我们要做的第一步自然还是先引入正则表达式库re,re中有很多方法,在爬虫时常用到的两个方法是.findall()与.search()。两个方法的区别是.findall()可以匹配所有满足正则表达式的文本,.search()则只返回第一次匹配到的文本。

这两个函数中放的参数是一样的,第一个参数匹配的规则表达式,第二个参数放将要被匹配的文本,后面还可以放一些可选参数。

接下来我们还是做一个实战来讲解~

首先让我们先尝试使用.search()函数来提取出剧情部分的内容。先要用我们上次学习的方法定位到剧情部分的源代码:

image

观察这段源代码会发现我们想要获取的文本部分是被放在“”与“”之间的,所以我们在正则匹配的时候就可以搜索这两个部分,然后取他们之间的部分就可以。

匹配的规则有非常多,在这里虎哥只教大家两种爬虫最常用的匹配规则,这个规则是万能的,可以匹配任何文本:(.?)与(.)。(.?)是使用在要匹配的文字部分在句中的时候,(.)使用在要匹配的文本在句尾的时候。其中()表示最终被匹配的部分,可以将你要获取的部分用括号括起来,最终这部分就会被分出来;.表示可以匹配任何字符;表示多次匹配前面的字符。因此可以发现.的组合其实就是什么都可以匹配。

举个例子,如果虎哥想匹配上述剧情部分的文本,我就使用万能匹配法则(.?)就一定可以匹配到。但是这个万能匹配是所有都可以匹配的,所以在前后加上约束条件:(.?)。最终剧情部分就会被匹配出来啦~完整的代码如下:

image

这就是正则表达式匹配出我们想要的剧情的一个基本实现情况。里面还有一些细节的东西我们下面一点一点看~

url = '
r=requests.get(url)

这两句话是在第一讲中讲过的,今天在这里不再赘述。

match = r'(.*?)

这一句话中除了我们上面讲的匹配法则还有一点需要注意的,就是最前面的r。这个r是告诉程序后面的这串字符串就保留他原本的样子,不进行转义。因为在后面这段字符串中有/s,系统可能会判定这是一个转义字符,但其实不是,所以这种时候需要在字符串前面加r。

t1 = re.search(match,r.text,re.S)

在使用.search()函数时可以注意到虎哥加入了第三个参数:re.S。这是一个修饰符,在需要的时候可以选择添加。re.S的意思是匹配包括换行在内的所有字符。另一个比较常用的修饰符是re.I,他表示在匹配时对大小写不敏感。

print(t1.group(1))

.search()方法返回东西不能直接被输出,他返回的对象有两个方法。一个是.group():该方法返回匹配的内容。.span()返回匹配内容的范围:

image

以上是search()方法的一个例子。另一个常用的方法.findall()也为大家举一个例子:

.findall()可以返回所有符合规则的文本。

image

在网页中常常会有类似上图标蓝的地方,可以看出他的排版是比较整齐的,所以在这部分的源代码中也有一定的规律可言,接下来观察右边源代码部分会发现这些信息都被夹在<\span>中,其中一定含有属性property。所以当我们想要一下获取上面所有信息时,代码如下:

# coding: UTF-8
import requests
import re
url = 'https://movie.douban.com/subject/26667010/'
r=requests.get(url)
match = r'?property=".?".?>(.?)'
t1 = re.findall(match,r.text)
print(t1)

输出结果如下:

image

大家观察以上代码会发现.findall()与.search()的使用几乎一样,但是输出不太一样。.findall()返回的是一个列表,可以直接输出。这一点大家要注意哦~

使用正则表达式进行数据爬取就讲到这里啦希望大家有所收获

你可能感兴趣的:(虎哥的python小技巧放送之实现简单爬虫(2))