前三节我们基本掌握了抓取整个⽹⻚的基本技能,但是,还是第一节说的话,大多数情况下, 我们并不需要整个⽹⻚的全部内容,而是仅仅其中一小部分。在抽丝剥茧,挑出最需要的那部分数据时就需要合理利用一些数据提取工具,常用且非常好用的3个解析工具隆重出场。
1. re解析,又叫正则表达式,这个很重要,可以做几乎所有你想解析的事情,难度也最大;
2. bs4解析,如果说re是常规手段解决问题,那么bs4就是利用灵巧的手段解决部分具体问题;
3. xpath解析,那就再灵活一点,代码短了,但是理解起来也会难度大一点。
接下来我会详细介绍一下这三种解析方式。
1.1 正则表达式(regular expression)
一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。简而言之,⼀种使⽤表达式的⽅式对字符串进⾏匹配的语法规则。我们抓取到的⽹⻚源代码本质上是⼀个超⻓的字符串,正则表达式正是对字符串进行加工处理,抽取解析的一大利器。所以,学会编写正则表达式的逻辑关系是重点。
1.2构造正则表达式
构造正则表达式的方法和创建数学表达式的方法一样。通过多种元字符与运算符将多个小运算组合成一个大运算。那么我先介绍下有一些常用的元字符。
. 匹配除换⾏符以外的任意字符
\w 匹配字⺟或数字或下划线
\s 匹配任意的空⽩符
\d 匹配数字
\n 匹配⼀个换⾏符
\t 匹配⼀个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
() 匹配括号内的表达式,也表示⼀个组
* 重复零次或更多次
? 重复零次或⼀次
不同的元字符之间还可以组合使用,其中贪婪匹配和惰性匹配是常用的两个组合。
.* 贪婪匹配
.*? 惰性匹配
举个例子
我在家读一本散文集《我与地坛》,妈妈正准备用坛子腌蒜。
正则:我.*坛
匹配结果:我在家读一本散文集《我与地坛》,妈妈正准备用坛
正则:我.*?坛
匹配结果:我在家读一本散文集《我与地坛
1.3 运算优先级
这个我就不详细说了,给大家一个网站
https://www.runoob.com/regexp/regexp-operator.html
1.4 re模块
说这么多肯定有小伙伴想问,怎么在python中写啊。
这又要依赖一个模块,re模块。
说一下几个常用的功能。
re.findall 查找所有符合匹配规则的, 返回list;
re.search 查找第一个符合匹配规则的;
re.finditer 查找所有符合匹配规则的,返回的是迭代器(重点);
re.compile 把⼀个⻓⻓的正则表达式预加载, ⽅便以后使⽤
1.5 梦斩天龙
这个例子是我精心准备的。我特别喜欢Bing这个搜索引擎,其中很大部分是因为它的首页背景图特别好看,而且往往会带一点小故事。所以,我的电脑桌面也是从它上面弄出来的。我在网上找了找代码,发现出乎意料的是竟然没人选择用正则去爬,这是非常符合正则标准的一个网页,代码放在下面了,欢迎大家指点。
import requests
import re
url = "https://cn.bing.com"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
}
resp = requests.get(url,headers=headers)
# print(resp.text)
page_content = resp.text
obj = re.compile(r'href="h(?P<name>.*?)" as="image"', re.S)
result = obj.finditer(page_content)
for it in result:
ur = it.group("name")
image= "h"+ur
print(image)
# 下载图片
img_resp = requests.get(image)
# img_resp.content # 这里拿到的是字节
img_name = "Bing背景图.jpg"
with open("img/" + img_name, mode="wb") as f:
f.write(img_resp.content) # 图片内容写入文件
print("over!!!", img_name)
我本打算继续往下写的,发现不知不觉写了1700多字了,再多大家就失去阅读兴趣了,bs4下一章在写。