正则表达式_爬取豆瓣电影排行Top250
前言:
利用简单的正则表达式,获取响应内容爬取数据。
Part1 正则表达式(Regular Expression)
1.1 简介
正则表达式,又称规则表达式,它是一种文本模式,就是通过事先定义好的一些特定字符及这些特定字符的组合成一个规则,对文本字符串进行匹配筛选过滤。
比如:“A1bc23ef45”这个字符串,我只想要里面的数字,通过正则表达式中的“\d”就可以快速的提取出来。
注:正则表达式在线测试工具:开源中国——实用工具——https://tool.oschina.net


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打开开发者工具查看源代码,可以看到需要数据都在前端页面,开始分析需要的数据所在位置

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 分析
需要获取到电影的链接,电影名字,年份/地区/分类,评分,评价人数

3.4 提前定义一个正则表达式,方便后面调用
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(" ", "")
8 # 去除空格,替换字符
9 wp.writerow(dic.values())
10 fp.close()
注:从响应的文本里匹配到数据,使用groupdict()方法,将数据放到字典里,“year”匹配到的数据里含有空格和特殊字符,使用strip()方法去除空格,然后使用replace()方法把特殊字符替换成空
Part4 完整代码
4.1 说明
按照上面的代码,爬取到的是第一页的内容,只有25条数据,通过分析URL参数,改变参数内容发起请求即可获取全部的数据。
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(" ", "")
26 # 去除空格,替换字符
27 wp.writerow(dic.values())
28
29 fp.close()
30 print('top250已下载完成')
4.2 运行结果

奇盛测试攻城狮 专业就是不断地学习,除去偶然性,你永远无法发现认知以外的BUG。——C_N_Candy 公众号
正则表达式_爬取豆瓣电影排行Top250的更多相关文章
- 爬取豆瓣电影排行top250
功能描述V1.0: 爬取豆瓣电影排行top250 功能分析: 使用的库 1.time 2.json 3.requests 4.BuautifulSoup 5.RequestException 上机实验 ...
- python2.7爬取豆瓣电影top250并写入到TXT,Excel,MySQL数据库
python2.7爬取豆瓣电影top250并分别写入到TXT,Excel,MySQL数据库 1.任务 爬取豆瓣电影top250 以txt文件保存 以Excel文档保存 将数据录入数据库 2.分析 电影 ...
- 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用
学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...
- 爬虫——正则表达式爬取豆瓣电影TOP前250的中英文名
正则表达式爬取豆瓣电影TOP前250的中英文名 1.首先要实现网页的数据的爬取.新建test.py文件 test.py 1 import requests 2 3 def get_Html_text( ...
- urllib+BeautifulSoup无登录模式爬取豆瓣电影Top250
对于简单的爬虫任务,尤其对于初学者,urllib+BeautifulSoup足以满足大部分的任务. 1.urllib是Python3自带的库,不需要安装,但是BeautifulSoup却是需要安装的. ...
- scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250
scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...
- scrapy爬取豆瓣电影top250
# -*- coding: utf-8 -*- # scrapy爬取豆瓣电影top250 import scrapy from douban.items import DoubanItem class ...
- python 爬虫&爬取豆瓣电影top250
爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...
- 【转】爬取豆瓣电影top250提取电影分类进行数据分析
一.爬取网页,获取需要内容 我们今天要爬取的是豆瓣电影top250页面如下所示: 我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西.直接进入主题吧! 知道我们需要的内容在哪里了, ...
随机推荐
- Spark 集群安装部署
安装准备 Spark 集群和 Hadoop 类似,也是采用主从架构,Spark 中的主服务器进程就叫 Master(standalone 模式),从服务器进程叫 Worker Spark 集群规划如下 ...
- 归一化方法总结 | 又名“BN和它的后浪们“
前言: 归一化相关技术已经经过了几年的发展,目前针对不同的应用场合有相应的方法,在本文将这些方法做了一个总结,介绍了它们的思路,方法,应用场景.主要涉及到:LRN,BN,LN, IN, GN, FRN ...
- 多表联合查询 - 基于注解SQL
作者:汤圆 个人博客:javalover.cc 前言 背景:Spring Boot + MybatisPlus 用MybatisPlus就是为了不写SQL,用起来方便: 但是如果需要多表联合查询,还是 ...
- 【进阶之路】多线程条件下分段处理List集合的几种方法
这两个月来因为工作和家庭的事情,导致一直都很忙,没有多少时间去汲取养分,也就没有什么产出,最近稍微轻松了一点,后续的[进阶之路]会慢慢回到正轨. 开门见山的说,第一次接触到多线程处理同一个任务,是使用 ...
- Python+Selenium学习笔记17 - HTML测试报告
运行少量case时 1 # coding = utf-8 2 3 from selenium import webdriver 4 import unittest 5 import time 6 fr ...
- The Superego 实验四 团队作业1:软件研发团队组建
项目 内容 课程班级博客链接 班级博客链接 这个作业要求链接 作业要求链接 团队名称 The Superego 团队的课程学习目标 (1)组建团队,建设团队文化,申请开通团队博客 (2)团队之间相互协 ...
- ASP.NET Core MVC 入门到精通 - 1. 开发必备工具 (2021)
环境: .NET 5 ASP.NET Core MVC 1. .NET 5 作为一个资深.NET工程师,说句实话,.NET没落了,在国内更加的没落.之前做过8年node.js/前端,现如今又转回了.N ...
- GPU编程和流式多处理器(三)
GPU编程和流式多处理器(三) 3. Floating-Point Support 快速的本机浮点硬件是GPU的存在理由,并且在许多方面,它们在浮点实现方面都等于或优于CPU.全速支持异常可以根据每条 ...
- Pass Infrastructure基础架构(下)
Pass Infrastructure基础架构(下) pass注册 PassRegistration该类在示例中简要显示了各种pass类型的定义 .该机制允许注册pass类,以便可以在文本pass管 ...
- 如何为应用选择最佳的FPGA(上)
如何为应用选择最佳的FPGA(上) How To Select The Best FPGA For Your Application 在项目规划阶段,为任何一个项目选择一个FPGA部件是最关键的决策之 ...