正则表达式_爬取豆瓣电影排行Top250

前言:

利用简单的正则表达式,获取响应内容爬取数据。

Part1 正则表达式(Regular Expression)

1.1 简介

正则表达式,又称规则表达式,它是一种文本模式,就是通过事先定义好的一些特定字符及这些特定字符的组合成一个规则,对文本字符串进行匹配筛选过滤。

比如:“A1bc23ef45”这个字符串,我只想要里面的数字,通过正则表达式中的“\d”就可以快速的提取出来。

注:正则表达式在线测试工具:开源中国——实用工具——https://tool.oschina.net

正则表达式_爬取豆瓣电影排行Top250

正则表达式_爬取豆瓣电影排行Top250

1.2 常用字符

字符 描述
[...] 匹配 [...] 中的所有字符,如[eno],将匹配Python is fun中的e n o字母(若有)
[^...] 匹配除了 [...] 中字符的所有字符,上面的例子取反
\w 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
\s 匹配任何空白字符,包括空格、制表符、换页符等
\S 匹配任何非空白字符
( ) 标记一个子表达式的开始和结束位置。
* 匹配前面的子表达式零次或多次。
. 匹配除换行符 \n 之外的任何单字符。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
\ 转义字符
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结尾位置
+ 匹配前面的子表达式一次或多次
\d 匹配数字
\D 匹配非数字
{n} n 是一个非负整数,匹配确定的 n 次
{n,} n 是一个非负整数,至少匹配n 次
{n,m} m 和 n 均为非负整数,其中n <= m,最少匹配 n 次且最多匹配 m 次
.* 贪婪匹配,匹配所有内容
.*? 非贪婪匹配,在所有内容中匹配一次

1.3 re模块中的常用方法

1.3.1 findall 查找字符串中所有内容,返回符合条件的数据,返回的数据是列表形式

1 lst = re.findall('o','Python is fun otoy')
2 print(lst)
3 # 查找字符串中所有的o,返回三个['o', 'o', 'o']

1.3.2 search 返回匹配到的第一个结果,如果没有返回None

lst = re.search('o','Python is fun otoy')
print(lst)
# <re.Match object; span=(4, 5), match='o'>​ lst = re.search('a','Python is fun otoy')
print(lst)
# None

1.3.3 match 只能从字符串开头进行匹配

1 lst = re.match('o','Python is fun otoy')
2 print(lst)
3 # None
4
5 ​lst = re.match('P','Python is fun otoyPPPP')
6 print(lst)
7 # <re.Match object; span=(0, 1), match='P'>

1.3.4 finditer 和findall差不多,但是返回值是一个迭代器

 1 lst = re.finditer('o','Python is fun otoy')
2 print(lst)
3 # <callable_iterator object at 0x000002820BCF6B20>​
4
5 # 获取迭代器里的内容
6 for i in lst:
7 print(i)
8 # <re.Match object; span=(4, 5), match='o'>
9 # <re.Match object; span=(14, 15), match='o'>
10 # <re.Match object; span=(16, 17), match='o'>​
11
12 # 只想要o
13 for i in lst:
14 print(i.group())# o# o# o

注:从finditer中获取内容,使用group方法,从search中获取也是使用这个方法

 

Part2 思路

2.1 目标

地址:https://movie.douban.com/top250

访问地址,F12打开开发者工具查看源代码,可以看到需要数据都在前端页面,开始分析需要的数据所在位置

正则表达式_爬取豆瓣电影排行Top250网址:yii666.com

2.2 步骤

发起请求——获取响应文本——正则表达式解析获取数据——数据存储

Part3 编写脚本​

3.1 导入库

1 import requests
2 import re
3 import csv

re模块和csv为python自带,不需要安装,这里使用csv文本模式储存数据,是因为csv储存数据的特点:a,b,c 以逗号分割的格式,方便爬取数据后做进一步的处理分析。

3.2 撸代码

1 url = 'https://movie.douban.com/top250'
2 headers = {
3 "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0)Gecko/20100101 Firefox/85.0"
4 }
5
6 resp = requests.get(url=url, headers=headers).text
7 # 获取到响应数据之后,转换成text文本数据,这样才能使用re来进行操作

3.3 分析

需要获取到电影的链接,电影名字,年份/地区/分类,评分,评价人数文章来源地址https://www.yii666.com/article/754187.html

正则表达式_爬取豆瓣电影排行Top250

3.4 提前定义一个正则表达式,方便后面调用文章地址https://www.yii666.com/article/754187.html

1 obj = re.compile(r'<li>.*?<div class="item">.*?<a href="(?P<link>.*?)">.*?<span class="title">(?P<name>.*?)</span>.*?<br>(?P<year>.*?)</p>.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<comments>.*?)</span>', re.S)

注:使用 .*? 匹配过滤掉中间的所有的内容,使用(.*?)将匹配到内容提取,(?P<name>.*?)将匹配到的内容赋值给"name"

3.5 获取数据,写入保存

 1 result = obj.finditer(resp)
2 fp = open('data.csv', 'w', encoding='utf-8')
3 wp = csv.writer(fp)​
4
5 for it in result:
6 dic = it.groupdict()
7 dic['year'] = dic['year'].strip().replace("&nbsp;", "")
8 # 去除空格,替换字符
9 wp.writerow(dic.values())
10 fp.close()

注:从响应的文本里匹配到数据,使用groupdict()方法,将数据放到字典里,“year”匹配到的数据里含有空格和特殊字符,使用strip()方法去除空格,然后使用replace()方法把特殊字符替换成空文章来源地址:https://www.yii666.com/article/754187.html

Part4 完整代码

4.1 说明

按照上面的代码,爬取到的是第一页的内容,只有25条数据,通过分析URL参数,改变参数内容发起请求即可获取全部的数据。网址:yii666.com<

 1 import requests
2 import re
3 import csv
4
5 fp = open('data.csv', 'w', encoding='utf-8')
6 wp = csv.writer(fp)
7
8 for i in range(0, 256, 25):
9 url = f'https://movie.douban.com/top250?start={i}&filter='
10 headers = {
11 "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0"
12 }
13
14 resp = requests.get(url=url, headers=headers).text
15
16 # 数据解析
17 obj = re.compile(r'<li>.*?<div class="item">.*?<a href="(?P<link>.*?)">.*?'
18 r'<span class="title">(?P<name>.*?)</span>.*?<br>(?P<year>.*?)</p>.*?'
19 r'<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?'
20 r'<span>(?P<comments>.*?)</span>', re.S)
21
22 result = obj.finditer(resp)
23
24 for it in result:
25 dic['year'] = dic['year'].strip().replace("&nbsp;", "")
26 # 去除空格,替换字符
27 wp.writerow(dic.values())
28
29 fp.close()
30 print('top250已下载完成')

4.2 运行结果

正则表达式_爬取豆瓣电影排行Top250

奇盛测试攻城狮 专业就是不断地学习,除去偶然性,你永远无法发现认知以外的BUG。——C_N_Candy 公众号

版权声明:本文内容来源于网络,版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。文本页已经标记具体来源原文地址,请点击原文查看来源网址,站内文章以及资源内容站长不承诺其正确性,如侵犯了您的权益,请联系站长如有侵权请联系站长,将立刻删除

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信图片_20190322181744_03.jpg

微信扫一扫打赏

请作者喝杯咖啡吧~

支付宝扫一扫领取红包,优惠每天领

二维码1

zhifubaohongbao.png

二维码2

zhifubaohongbao2.png