python爬虫防呆笔记:正则表达式篇之一
python爬虫笔记
第一部分:正则表达式
基本效果展示
加载猫眼电影网的html文本作为训练文本
这里先讲一下header,这里的header就写一项,不写就爬不出来,这一项是User-Agent,作用是告诉服务器请求是以什么工具发出,这里选择了浏览器
如何在chrome找到header:鼠标右键->检查->network->doc->header
import requests
url = "https://maoyan.com/board/4"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763'}
response = requests.get(url, headers = headers, timeout = 30)
response.encoding = 'utf8'
print(response.status_code)
html_text = response.text
filename = 'maoyan.txt'
with open(filename, 'w') as file_object:file_object.write(html_text)
200
下面先显示训练文本
filename = 'maoyan.txt'
with open(filename) as file_object:text = file_object.read()print(text)
下面用正则表达式匹配出排名前十的电影信息
import re
filename = 'maoyan.txt'
html = open(filename).read()
def get_movie_inf(html):pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'+'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'+'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)items = re.findall(pattern, html)for item in items:yield {'index': item[0],'image': item[1],'title': item[2],'actor': item[3].strip()[3:],'time': item[4].strip()[5:],'score': item[5]+item[6]}for item in get_movie_inf(html):print(item['actor']) #此处显示主演信息
结果显示:
葛优,巩俐,牛犇(bēn)
艾德里安·布洛迪,艾米莉娅·福克斯,米哈乌·热布罗夫斯基
梅尔·吉布森,苏菲·玛索,帕特里克·麦高汉
张国荣,张曼玉,刘德华
张国荣,梁朝伟,张学友
俞承豪,金艺芬,童孝熙
马里奥·毛瑞尔,平采娜·乐维瑟派布恩,阿查拉那·阿瑞亚卫考
莱昂纳多·迪卡普里奥,凯特·温丝莱特,比利·赞恩
雅克·贝汉,Philippe Labro
克里斯蒂安·贝尔,希斯·莱杰,阿伦·伊克哈特
易混淆的点
注意转义:在Python的string前面加上‘r’, 是为了告诉编译器这个string是个raw string,不要转意 ‘\’ 。
这样就不用专门去处理字符串里的特殊字符了
m = re.match('\bbaby','baby') #这里\b代表退格符,匹配失败
if m:m.group()
else:print('fail')m = re.match('\bbaby','\bbaby') #因为目标字符串也有退格符,匹配成功
if m:m.group()
else:print('fail')m = re.match(r'\bbaby','baby') #取消反斜杠转义的功能,传入re模块里代表单词边界,匹配成功
if m:m.group()
else:print('fail') m = re.match('\\bbaby','baby') #反斜杠再转义回纯粹的字符\b,同上匹配成功
if m:m.group()
else:print('fail')
fail'\x08baby''baby''baby'
一、下面是findall和finditer的区别,findall返回列表,finditer返回迭代器
import re
filename = 'maoyan.txt'
html = open(filename).read()
pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'+'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'+'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
links = re.finditer(pattern,html)
type(links)
next(links).groups() #迭代器用next函数来迭代
callable_iterator('1','https://p0.meituan.net/movie/4c41068ef7608c1d4fbfbe6016e589f7204391.jpg@160w_220h_1e_1c','活着','\n 主演:葛优,巩俐,牛犇(bēn)\n ','上映时间:1994-05-17(法国)','9.','0')
import re
filename = 'maoyan.txt'
html = open(filename).read()
pattern = re.compile(r'<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'+'.*?>(.*?)</a>.*?star">\s*(.*?)\s*</p>.*?releasetime">(.*?)</p>'+'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
links = re.findall(pattern,html)
type(links)
links[0]
list('1','https://p0.meituan.net/movie/4c41068ef7608c1d4fbfbe6016e589f7204391.jpg@160w_220h_1e_1c','活着','主演:葛优,巩俐,牛犇(bēn)','上映时间:1994-05-17(法国)','9.','0')
二、(?:xxx)和(?=xxx)的区别, 这两个可以看作是假的子组,因为它们不会保存结果
import re
from IPython.core.interactiveshell import InteractiveShell #使notebook输出多行
InteractiveShell.ast_node_interactivity = "all" #使notebook输出多行string = '123,456'
a = re.compile('123(?=,)') #使用(?=xxx)不会保存,也不会占用查询宽度
result = re.search(a, string)
result.group()b = re.compile('123(?:,)') # 使用(?:xxx)不会保存,但会占用查询宽度
result = re.search(b, string)
result.group()c = re.compile('123(?=,)\d+')
result = re.search(c, string)
if result != None:print('success')
else:print('fail')
'123''123,'fail
三、下面是条件正则表达的用法:
(?(1)x|y) 表示如果匹配到第一个匹配组的话,再匹配x,否则匹配y
从下面的执行结果可以看出,(x) 作为第一个匹配组,当匹配到的第一个字母位x的时候,后面只有接上y才能成功配对;如果第一个字母是y,则后面接着x也才能成功配对,此外xx和yy都是不行的
注意:(?:xxxxx)虽然不保存子组,但是里面的()却仍会保存,故(x)依然是第一个匹配组
import re
from IPython.core.interactiveshell import InteractiveShell #使notebook输出多行
InteractiveShell.ast_node_interactivity = "all" #使notebook输出多行pattern = re.compile(r'(?:(x)|y)(?(1)y|x)')
bool(re.search(pattern, 'xy'))
bool(re.search(pattern, 'xx'))
bool(re.search(pattern, 'yx'))
bool(re.search(pattern, 'yy'))
TrueFalseTrueFalse
四、给部分表达式起别名
(?P<name>[表达式])
:表示给里面的表达式起别名,同时也会匹配
如何使用别名 :
1.\g<name> :在sub里的替换后的式子里使用
2.(?P=name):在同一个正则表达式里使用, 注意别名与原式匹配的必须是同样式子
import re
re.sub(r'(?P<firstname>\w+) (?P<lastname>\w+)', '\g<lastname> \g<firstname>', 'Yifang Wu')
'Wu Yifang'
import re
mails = re.search(r'(?P<year>\d{4})-(?P<month>\d{2}) \d{6}(?P=year)(?P=month)\d{6}', '2020-08 440000202008010000')
if mails is not None:mails.group()
else:print('fail')#偷偷改一下年份2020->2019,就匹配不到了
mails = re.search(r'(?P<year>\d{4})-(?P<month>\d{2}) \d{6}(?P=year)(?P=month)\d{6}', '2020-08 440000201008010000')
if mails is not None:mails.group()
else:print('fail')
'2020-08 440000202008010000'fail
五、其他
其他一些扩展的正则表达式用法,可能用得不多,但还是要记一下:
- (?i) 不区分大小写
- (?m) 逐行搜索,一行即为一个整体,而不是整个字符串
- (?s) 使得点 . 也可以匹配换行符了
- (?x) 可以使用[ ] 来匹配字符串里的空白符
python爬虫防呆笔记:正则表达式篇之一相关推荐
- 无敌python爬虫教程学习笔记(一)
python爬虫系列文章目录 无敌python爬虫教程学习笔记(一) 无敌python爬虫教程学习笔记(二) 无敌python爬虫教程学习笔记(三) 无敌python爬虫教程学习笔记(四) 本文目录 ...
- 无敌python爬虫教程学习笔记(二)
系列文章目录 无敌python爬虫教程学习笔记(一) 无敌python爬虫教程学习笔记(二) 无敌python爬虫教程学习笔记(三) 无敌python爬虫教程学习笔记(四) 手刃一个小爬虫 系列文章目 ...
- Python入门基础总结笔记——正则表达式
Python入门基础总结笔记--正则表达式 完整基础知识参看网站:正则表达式 总结重点 用\d可以匹配一个数字,\w可以匹配一个字母或数字 用*表示任意个字符(包括0个),用+表示至少一个字符 用?表 ...
- python爬虫之爬取多篇含有关键词的文章标题和内容
python爬虫之爬取多篇含有关键词的文章标题和内容 实现的功能 需要用到的库 需要对html一些标签有一定的了解 代码设计思想 源代码 功能优化 Java版本 实现的功能 输入想要搜索的关键字和输入 ...
- python爬虫实践 —— 一、入门篇
Scrapy爬虫实践 -- 一.入门篇 前言 一.选择爬虫框架--Scrapy 二.Scrapy安装 1.引入库 2.安装 3.验证 三.Scrapy的第一个爬虫工程 1. 使用框架创建新工程 2. ...
- python爬虫简易到进阶实战篇——(1)
python简易实战(1)--猫眼top100 第一篇文章介绍python基本环境搭建,简单实战,希望我们一同进步. 首先,对于初学者,python相比于c.java语言较容易入手,而写爬虫更是简单了 ...
- 【最全笔记】基础Python爬虫入门全笔记
第一章 网络爬虫之规则 一.Requests库入门 request库:http://www.python-requests.org 安装方法:pip install requests 抓取百度 imp ...
- python爬虫防屏蔽_python爬虫程序如何预防被限制
有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的身份.此时,我们就可以通过设置Use ...
- 【python爬虫】学习笔记1-爬取某网站妹子图片
最近刚刚学习爬虫,看了视频之后准备自己写一个爬虫练习,爬妹子图 这次准备爬取的网站是:http://www.umei.cc/p/gaoqing/xiuren_VIP/ 接下来先说一下我的思路: 首先我 ...
最新文章
- [转]div 让文字或图片居中
- Linux_RHEV虚拟化_基础理论KVM
- 使用GeocodeService进行地理位置检索
- /lib64/libc.so.6 is not a symbolic link 解决方法
- linux下直接使用base64就可转换图片为二进制
- electron打包
- 论文致谢走红后,中科院博士回信了!
- RTX5 | 内存池04 - 共享内存用于线程之间的通讯(阻塞方式)- 使用信号量
- 信息学奥赛一本通 1925:【03NOIP普及组】麦森数 | OpenJudge NOI 4.4 1708:麦森数 | 洛谷 P1045 [NOIP2003 普及组] 麦森数
- 在java程序中怎么造成死锁_java – 了解为什么在此实现中发生死锁
- map Codeforces Round #Pi (Div. 2) C. Geometric Progression
- Kali Linux 更新源 操作完整版教程
- c语言公路竖曲线要素代码,竖曲线要素
- K歌、短视频技术最佳实践——“唱吧”音视频技术探索
- 华为鲲鹏计算机考试时间,华为鲲鹏认证考试中心落地我院信息工程系
- android dlna 服务器,安卓手机DLNA功能使用方法
- 国内CDN的排名情况
- 想考阿里云ACE需要做什么准备?考下来难不难?
- Win10 WiFi连接不上,如何重新配置DNS地址
- Wireshark抓取网络聊天