关于爬虫学习的一些小小记录(二)——正则表达式匹配_爬虫 正则表达式怎么看匹配-程序员宅基地

技术标签: 爬虫  Python 爬虫  Python  

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


前面说了怎么访问一个 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噜!!在我刚刚改代码的时候,他又多了个人

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42039417/article/details/88632507

智能推荐

【新手科研指南5】深度学习代码怎么读-小白阶段性思路(以手写数字识别应用为例)_深度学习程序怎么读-程序员宅基地

文章浏览阅读6.2k次,点赞6次,收藏26次。我是一个深度学习代码小白,请你用中文写上注释,能让我能轻松理解下面这段代码。注意包含所有函数、调用和参数的注释。以同样的python代码块样式返回你写的代码给我。代码看累了,就看《动手学深度学习》文档:基于PyTorch框架,从底层函数实现基础功能,再到框架的高级功能。努力上路的小白一枚,麻烦路过的大佬指导一二,同时希望能和大家交流学习~争取更新学习这个文档的专栏,记录学习过程。量身定做了一套话术hhh,亲身测试还不错。这个感觉更浅一点儿,之后复习看吧。20天吃掉那只Pytorch。_深度学习程序怎么读

Java学习路线图,看这一篇就够了!-程序员宅基地

文章浏览阅读2.7w次,点赞126次,收藏1.2k次。耗废1024根秀发,Java学习路线图来了,整合了自己所学的所有技术整理出来的2022最新版Java学习路线图,适合于初、中级别的Java程序员。_java学习路线

PCL_Tutorial2-1.7-点云保存PNG_pcl::io:savepng-程序员宅基地

文章浏览阅读4.4k次。1.7-savingPNG介绍代码详情函数详解savePNGFile()源码savePNGFile()源码提示savePNGFile()推荐用法处理结果代码链接介绍PCL提供了将点云的值保存到PNG图像文件的可能性。这只能用有有序的云来完成,因为结果图像的行和列将与云中的行和列完全对应。例如,如果您从类似Kinect或Xtion的传感器中获取了点云,则可以使用它来检索与该云匹配的640x480 RGB图像。代码详情#include <pcl / io / pcd_io.h>#incl_pcl::io:savepng

知乎问答:程序员在咖啡店编程,喝什么咖啡容易吸引妹纸?-程序员宅基地

文章浏览阅读936次。吸引妹子的关键点不在于喝什么咖啡,主要在于竖立哪种男性人设。能把人设在几分钟内快速固定下来,也就不愁吸引对口的妹子了。我有几个备选方案,仅供参考。1. 运动型男生左手单手俯卧撑,右手在键盘上敲代码。你雄壮的腰腹肌肉群活灵活现,简直就是移动的春药。2.幽默男生花 20 块找一个托(最好是老同学 or 同事)坐你对面。每当你侃侃而谈,他便满面涨红、放声大笑、不能自已。他笑的越弱_咖啡厅写代码

【笔试面试】腾讯WXG 面委会面复盘总结 --一次深刻的教训_腾讯面委会面试是什么-程序员宅基地

文章浏览阅读1.2w次,点赞5次,收藏5次。今天 (应该是昨天了,昨晚太晚了没发出去)下午参加了腾讯WXG的面委会面试。前面在牛客上搜索了面委会相关的面经普遍反映面委会较难,因为都是微信的核心大佬,问的问题也会比较深。昨晚还蛮紧张的,晚上都没睡好。面试使用的是腾讯会议,时间到了面试官准时进入会议。照例是简单的自我介绍,然后是几个常见的基础问题:例如数据库索引,什么时候索引会失效、设计模式等。这部分比较普通,问的也不是很多,不再赘述。现在回想下,大部分还是简历上写的技能点。接下来面试官让打开项目的代码,对着代码讲解思路。我笔记本上没有这部分代码,所_腾讯面委会面试是什么

AI绘画自动生成器:艺术创作的新浪潮-程序员宅基地

文章浏览阅读382次,点赞3次,收藏4次。AI绘画自动生成器是一种利用人工智能技术,特别是深度学习算法,来自动创建视觉艺术作品的软件工具。这些工具通常基于神经网络模型,如生成对抗网络(GANs),通过学习大量的图像数据来生成新的图像。AI绘画自动生成器作为艺术与科技结合的产物,正在开启艺术创作的新篇章。它们不仅为艺术家和设计师提供了新的工具,也为普通用户提供了探索艺术的机会。随着技术的不断进步,我们可以预见,AI绘画自动生成器将在未来的创意产业中发挥越来越重要的作用。

随便推点

Flutter ListView ListView.build ListView.separated_flutter listview.separated和listview.builder-程序员宅基地

文章浏览阅读1.7k次。理解为ListView 的三种形式吧ListView 默认构造但是这种方式创建的列表存在一个问题:对于那些长列表或者需要较昂贵渲染开销的子组件,即使还没有出现在屏幕中但仍然会被ListView所创建,这将是一项较大的开销,使用不当可能引起性能问题甚至卡顿直接返回的是每一行的Widget,相当于ios的row。行高按Widget(cell)高设置ListView.build 就和io..._flutter listview.separated和listview.builder

2021 最新前端面试题及答案-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏14次。废话不多说直接上干货1.js运行机制JavaScript单线程,任务需要排队执行同步任务进入主线程排队,异步任务进入事件队列排队等待被推入主线程执行定时器的延迟时间为0并不是立刻执行,只是代表相比于其他定时器更早的被执行以宏任务和微任务进一步理解js执行机制整段代码作为宏任务开始执行,执行过程中宏任务和微任务进入相应的队列中整段代码执行结束,看微任务队列中是否有任务等待执行,如果有则执行所有的微任务,直到微任务队列中的任务执行完毕,如果没有则继续执行新的宏任务执行新的宏任务,凡是在..._前端面试

linux基本概述-程序员宅基地

文章浏览阅读1k次。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。(3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。_linux

JavaScript学习手册十三:HTML DOM——文档元素的操作(一)_javascript学习手册十三:html dom——文档元素的操作(一)-程序员宅基地

文章浏览阅读7.9k次,点赞26次,收藏66次。HTML DOM——文档元素的操作1、通过id获取文档元素任务描述相关知识什么是DOM文档元素节点树通过id获取文档元素代码文件2、通过类名获取文档元素任务描述相关知识通过类名获取文档元素代码文件3、通过标签名获取文档元素任务描述相关知识通过标签名获取文档元素获取标签内部的子元素代码文件4、html5中获取元素的方法一任务描述相关知识css选择器querySelector的用法代码文件5、html5中获取元素的方法二任务描述相关知识querySelectorAll的用法代码文件6、节点树上的操作任务描述相关_javascript学习手册十三:html dom——文档元素的操作(一)

《LeetCode刷题》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量-程序员宅基地

文章浏览阅读132次。《LeetCode学习》172. 阶乘后的零(java篇)_java 给定一个整数n,返回n!结果尾数中零的数量

php 公众号消息提醒,如何开启公众号消息提醒功能-程序员宅基地

文章浏览阅读426次。请注意,本文将要给大家分享的并不是开启公众号的安全操作风险提醒,而是当公众号粉丝给公众号发消息的时候,公众号的管理员和运营者如何能在手机上立即收到消息通知,以及在手机上回复粉丝消息。第一步:授权1、在微信中点击右上角+,然后选择“添加朋友”,然后选择“公众号”,然后输入“微小助”并关注该公众号。2、进入微小助公众号,然后点击底部菜单【新增授权】,如下图所示:3、然后会打开一个温馨提示页面。请一定要..._php微信公众号服务提示

推荐文章

热门文章

相关标签