前言:

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

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("&nbsp;", "")
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("&nbsp;", "")
26 # 去除空格,替换字符
27 wp.writerow(dic.values())
28
29 fp.close()
30 print('top250已下载完成')

4.2 运行结果

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

正则表达式_爬取豆瓣电影排行Top250的更多相关文章

  1. 爬取豆瓣电影排行top250

    功能描述V1.0: 爬取豆瓣电影排行top250 功能分析: 使用的库 1.time 2.json 3.requests 4.BuautifulSoup 5.RequestException 上机实验 ...

  2. python2.7爬取豆瓣电影top250并写入到TXT,Excel,MySQL数据库

    python2.7爬取豆瓣电影top250并分别写入到TXT,Excel,MySQL数据库 1.任务 爬取豆瓣电影top250 以txt文件保存 以Excel文档保存 将数据录入数据库 2.分析 电影 ...

  3. 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用

    学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...

  4. 爬虫——正则表达式爬取豆瓣电影TOP前250的中英文名

    正则表达式爬取豆瓣电影TOP前250的中英文名 1.首先要实现网页的数据的爬取.新建test.py文件 test.py 1 import requests 2 3 def get_Html_text( ...

  5. urllib+BeautifulSoup无登录模式爬取豆瓣电影Top250

    对于简单的爬虫任务,尤其对于初学者,urllib+BeautifulSoup足以满足大部分的任务. 1.urllib是Python3自带的库,不需要安装,但是BeautifulSoup却是需要安装的. ...

  6. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  7. scrapy爬取豆瓣电影top250

    # -*- coding: utf-8 -*- # scrapy爬取豆瓣电影top250 import scrapy from douban.items import DoubanItem class ...

  8. python 爬虫&爬取豆瓣电影top250

    爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...

  9. 【转】爬取豆瓣电影top250提取电影分类进行数据分析

    一.爬取网页,获取需要内容 我们今天要爬取的是豆瓣电影top250页面如下所示: 我们需要的是里面的电影分类,通过查看源代码观察可以分析出我们需要的东西.直接进入主题吧! 知道我们需要的内容在哪里了, ...

随机推荐

  1. ansible常用方法

    1.安装ansible yum -y install ansible 2.主机清单推荐格式 [root@controller ~]# vi /etc/ansible/hosts [controller ...

  2. Windows 常用Cmd命令行 (持续更新...)

    查看IP ipconfig 查看WIFI密码 netsh wlan show profiles wifi_name key = clear 系统探针 systeminfo CMD重定向 输出符号> ...

  3. 云计算OpenStack核心组件---cinder存储服务(10)

    一.cinder介绍 1.Block Storage 操作系统获得存储空间的方式一般有两种: (1)通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系统: ...

  4. Python数学建模-02.数据导入

    数据导入是所有数模编程的第一步,比你想象的更重要. 先要学会一种未必最佳,但是通用.安全.简单.好学的方法. 『Python 数学建模 @ Youcans』带你从数模小白成为国赛达人. 1. 数据导入 ...

  5. [论文阅读笔记] Are Meta-Paths Necessary, Revisiting Heterogeneous Graph Embeddings

    [论文阅读笔记] Are Meta-Paths Necessary? Revisiting Heterogeneous Graph Embeddings 本文结构 解决问题 主要贡献 算法原理 参考文 ...

  6. Go语言练习---判断闰年以及根据现在的秒数求现在的年月日

    package main import ( "fmt" "math" "time" ) /* @闰年判断 ·封装一个函数判断某一个年份是不是 ...

  7. win系统下如何安装xgboost,开发环境是anaconda,以及这中间需要注意的问题

    最近学到了xgboost,但是anaconda并没有这个环境只好自己安装了... 注: (1)并没有测试anaconda在2.x的版本下是如何安装的, 基本上应该是大同小类的,我的anaconda版本 ...

  8. NOIP模拟5 T2

    题面:求出满足以下条件的 n*m 的 01 矩阵个数:   (1)第 i 行第 1~li 列恰好有 1 个 1 (li+1到ri-1不能放1)   (2)第 i 行第 ri~m 列恰好有 1 个 1. ...

  9. 快速人体姿态估计:CVPR2019论文阅读

    快速人体姿态估计:CVPR2019论文阅读 Fast Human Pose Estimation 论文链接: http://openaccess.thecvf.com/content_CVPR_201 ...

  10. PyTorch中的MIT ADE20K数据集的语义分割

    PyTorch中的MIT ADE20K数据集的语义分割 代码地址:https://github.com/CSAILVision/semantic-segmentation-pytorch Semant ...