关于爬虫学习的一些小小记录(二)——正则表达式匹配

关于爬虫学习的一些小小记录——正则表达式匹配


前面说了怎么访问一个 url,并读取返回的网页源码。有了源码文件,我们还要学会怎么从文件中查找、提取我们需要的数据。这次我们就简单讲讲怎么从源码文件中提取数据

正则表达式

说起提取数据,我就想到了正则表达式(此处不开花)
那什么是正则表达式?
请看,官方介绍
简单说,匹配字符串的
知道了是什么,再看看怎么学
这里列出可能要用到的匹配字符:
要用到的

Python的re模块

Python 绝对是个处理数据的好能手,它的标准库中提供了强大的re模块,完整地实现了正则表达式的方法功能。简直天衣无缝,恐怖如斯!
这里是学习教程
同样列举一下可能会用到的方法(以及我理解的用法):

findall(pattern, string[, pos[, endpos]])

findall()方法,字面意思,可以在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。其中,
pattern 匹配的正则表达式
string 待匹配的字符串
pos 可选参数,指定字符串的起始位置,默认为 0
endpos 可选参数,指定字符串的结束位置,默认为字符串的长度

举个小栗子

演示一下从豆瓣上爬取2019版《倚天屠龙记》的演职员信息:
网页地址:https://movie.douban.com/subject/25865815/celebrities

我们先打开网页,右键查看源文件。找到演职员列表部分的源码,分析一下
我们发现,演职员的主要信息都在span标签中,再找我们需要提取的信息周围的特征

比如说,演职员名字信息前后,这是前面的部分
网页源码1
以及后面的部分
网页源码2
而恰好,演职员列表中刚好是49个人,所以我们只需要匹配正则表达式

" class="name">(.*)</a></span>

就可以获取我们需要的演职员姓名信息

代码如下

# 爬虫--爬取豆瓣 2019版 《倚天屠龙记》 全体演职员

import re
from urllib import request

url = 'https://movie.douban.com/subject/25865815/celebrities'

response = request.urlopen(url)  # 访问 url
page = response.read().decode()  # 以 utf-8 的格式读取数据
names = re.findall('" class="name">(.*)</a></span>', page)  # 正则表达式匹配

print(names)

运行结果:

['蒋家骏 Jeffrey Chiang', '曾舜晞 Joseph Zeng', '陈钰琪 Yukee Chen', '祝绪丹 Xudan Zhu', '张超人 Chaoren Zhang', '林雨申 Shen Lin', '曹曦月 Xiyue Cao', '周海媚 Kathy Chow', '王德顺 Deshun Wang', '李东学 Ethan Li', '宗峰岩 Fengyan Zong', '黑子 Zi Hei', '樊少皇 Siu-Wong Fan', '肖荣生 Rongsheng Xiao ', '陈创 Chuang Chen', '杨明娜 Minna Yang', '陈欣予 Xinyu Chen', '许雅婷 Kabby Hui', '孙安可 Anke Sun', '杨一威 Yiwei Yang', '纪沨 Feng Ji', '李泰延 Taiyan Li', '宁文彤 Wentong Ning', '曾黎 Li Zeng', '金钊 Zhao Jin', '李浩轩 Hao-xuan Li', '阮圣文 Shengwen Ruan', '徐爱珉 Aimin Xu', '李曼铱 Manyi Li', '于波 Bo Yu', '李依晓 Xiaoyi Li', '李解 Jie Li', '李泽宇 Zeyu Li', '郭军 Jun Guo', '贺刚 Gang He', '宫正楠 Zhengnan Gong', '邬靖靖 Jingjing Wu', '韩昊霖 Haolin Han', '芦展翔 Zhanxiang Lu', '沈保平 Baoping Shen', '姜彦希 Yanxi Jiang', '侯瑞祥 Ruixiang Hou', '康嘉泽 Jiaze Kang', '林以政 Yizheng Lin', '谢雨辰 Yuchen Xie', '曲吉 Ji Qu', '欧阳小如 Xiaoru Ouyang', '关展博 Edwin Chin-Pok Kwan', '金庸 Louis Cha']

小小扩展

作为一个心中永远向往着学习的优秀者,当然是不能只满足于爬那么一两个名字信息
毕竟,来都来了,不如把图片也爬一下

我们接着分析源码,找一下图片链接
网页源码3
发现了吗,一下子就找到了关键点,简直不要太容易
明显的,括号里面就是我们需要的图片链接,不防打开看看
图片链接
当然,链接毕竟不是图片文件。有了图片链接,我们还需要访问链接下载图片

这里介绍urllib库中的urlretrieve()方法,可以访问 url 并把网页源码下载到本地

urlretrieve(url, filename=None, reporthook=None, data=None)

url 指定待访问的网页地址
filename 指定了保存到本地的路径(如果参数未指定,urllib会生成一个临时文件保存数据)
reporthook 一个回调函数,可显示当前的下载进度。
data 指定 post 服务器的数据,返回一个包含两个元素的 (filename, headers) 元组,filename 表示保存到本地的路径,headers 表示服务器的响应头

简单点,再顺便把职位爬一下,过程跟爬名字信息的差不多

下面是扩展后的代码

# 爬虫--爬取豆瓣 2019版 《倚天屠龙记》 全体演职员

import re
from urllib import request

url = 'https://movie.douban.com/subject/25865815/celebrities'

response = request.urlopen(url)  # 访问 url
page = response.read().decode()  # 以 utf-8 的格式读取数据

names = re.findall('" class="name">(.*)</a></span>', page)  # 正则表达式匹配
roles = re.findall('span class="role" title="(.*)">', page)  # 匹配职位
imgs = re.findall('style="background-image: url\((.*)\)">', page)  # 匹配图片链接

i = 0
while i < len(names):
	role_list = roles[i].split(' ')  # 避免因文件名过长无法建立,只好从这里切短
	role = role_list[0] + ' (' + role_list[-1]  # 切碎了重新拼一下
	img_name = r'19版《倚天屠龙记》演职员/' + names[i] + ' ' + role + r'.jpg'
	img = request.urlretrieve(imgs[i], img_name)
	i += 1

运行结果
程序运行结果
我咧个去!!!
怎么会有 50 个???

重新打开网页
网页更新了
天ya噜!!在我刚刚改代码的时候,他又多了个人

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值