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

五、其他

其他一些扩展的正则表达式用法,可能用得不多,但还是要记一下:

  1. (?i) 不区分大小写
  2. (?m) 逐行搜索,一行即为一个整体,而不是整个字符串
  3. (?s) 使得点 . 也可以匹配换行符了
  4. (?x) 可以使用[ ] 来匹配字符串里的空白符

python爬虫防呆笔记:正则表达式篇之一相关推荐

  1. 无敌python爬虫教程学习笔记(一)

    python爬虫系列文章目录 无敌python爬虫教程学习笔记(一) 无敌python爬虫教程学习笔记(二) 无敌python爬虫教程学习笔记(三) 无敌python爬虫教程学习笔记(四) 本文目录 ...

  2. 无敌python爬虫教程学习笔记(二)

    系列文章目录 无敌python爬虫教程学习笔记(一) 无敌python爬虫教程学习笔记(二) 无敌python爬虫教程学习笔记(三) 无敌python爬虫教程学习笔记(四) 手刃一个小爬虫 系列文章目 ...

  3. Python入门基础总结笔记——正则表达式

    Python入门基础总结笔记--正则表达式 完整基础知识参看网站:正则表达式 总结重点 用\d可以匹配一个数字,\w可以匹配一个字母或数字 用*表示任意个字符(包括0个),用+表示至少一个字符 用?表 ...

  4. python爬虫之爬取多篇含有关键词的文章标题和内容

    python爬虫之爬取多篇含有关键词的文章标题和内容 实现的功能 需要用到的库 需要对html一些标签有一定的了解 代码设计思想 源代码 功能优化 Java版本 实现的功能 输入想要搜索的关键字和输入 ...

  5. python爬虫实践 —— 一、入门篇

    Scrapy爬虫实践 -- 一.入门篇 前言 一.选择爬虫框架--Scrapy 二.Scrapy安装 1.引入库 2.安装 3.验证 三.Scrapy的第一个爬虫工程 1. 使用框架创建新工程 2. ...

  6. python爬虫简易到进阶实战篇——(1)

    python简易实战(1)--猫眼top100 第一篇文章介绍python基本环境搭建,简单实战,希望我们一同进步. 首先,对于初学者,python相比于c.java语言较容易入手,而写爬虫更是简单了 ...

  7. 【最全笔记】基础Python爬虫入门全笔记

    第一章 网络爬虫之规则 一.Requests库入门 request库:http://www.python-requests.org 安装方法:pip install requests 抓取百度 imp ...

  8. python爬虫防屏蔽_python爬虫程序如何预防被限制

    有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的身份.此时,我们就可以通过设置Use ...

  9. 【python爬虫】学习笔记1-爬取某网站妹子图片

    最近刚刚学习爬虫,看了视频之后准备自己写一个爬虫练习,爬妹子图 这次准备爬取的网站是:http://www.umei.cc/p/gaoqing/xiuren_VIP/ 接下来先说一下我的思路: 首先我 ...

最新文章

  1. [转]div 让文字或图片居中
  2. Linux_RHEV虚拟化_基础理论KVM
  3. 使用GeocodeService进行地理位置检索
  4. /lib64/libc.so.6 is not a symbolic link 解决方法
  5. linux下直接使用base64就可转换图片为二进制
  6. electron打包
  7. 论文致谢走红后,中科院博士回信了!
  8. RTX5 | 内存池04 - 共享内存用于线程之间的通讯(阻塞方式)- 使用信号量
  9. 信息学奥赛一本通 1925:【03NOIP普及组】麦森数 | OpenJudge NOI 4.4 1708:麦森数 | 洛谷 P1045 [NOIP2003 普及组] 麦森数
  10. 在java程序中怎么造成死锁_java – 了解为什么在此实现中发生死锁
  11. map Codeforces Round #Pi (Div. 2) C. Geometric Progression
  12. Kali Linux 更新源 操作完整版教程
  13. c语言公路竖曲线要素代码,竖曲线要素
  14. K歌、短视频技术最佳实践——“唱吧”音视频技术探索
  15. 华为鲲鹏计算机考试时间,华为鲲鹏认证考试中心落地我院信息工程系
  16. android dlna 服务器,安卓手机DLNA功能使用方法
  17. 国内CDN的排名情况
  18. 想考阿里云ACE需要做什么准备?考下来难不难?
  19. Win10 WiFi连接不上,如何重新配置DNS地址
  20. Wireshark抓取网络聊天

热门文章

  1. 火山视窗选择框,分组框,单选框,状态条,工具条组件介绍
  2. 任意进制与十进制之间的转换
  3. MybatisPlus+mbg(代码生成器)
  4. TextRank算法学习及使用
  5. 2019-1-19 object祖宗类的equals重写
  6. 【机器学习项目实战10例目录】项目详解 + 数据集 + 完整源码
  7. Python递归求和(列表)
  8. 百度手机操作系统命名为秋实 传年前推出
  9. 高等数学:第八章 多元函数的微分法及其应用(7)方向导数与梯度
  10. 大数据毕业设计 招聘网站数据分析可视化 - python flask 网络爬虫