Python 网络爬虫之解析网页【正则表达式-re模块】

使用re模块进行正则表达式进行验证

match

# match("者则表达式","匹配值")(从第一个开始匹配,若第一个不对则不匹配)
str = "X_lady@163.com"
result = re.match("\w{4,20}@163\.com", str)
if result:
    print("恭喜:匹配成功")
    # group在无下标的时候默认打印
    print(result.group())
else:
    print("遗憾:匹配失败")
    # $(表示结束)

单个标签

# <div>Python</div>
# 正则表达式
# ()分组 \num(与第几个相对应)
# <([A-Za-z]+)>.*</\1>

多个标签

# <div><span>Python</span></div>
# 正则表达式为
# <([A-Za-z]+)><([A-Za-z+]+)>.*</\2></\1>

# str = "<div><span>Python</span></div>"
# result = re.match("<(?P<a>[A-Za-z]+)><(?P<b>[A-Za-z]+)>.*</(?P=b)></(?P=a)>", str)
# if result:
# print("恭喜:匹配成功")
# # group在无下标的时候默认打印
# print(result.group())
# else:
# print("遗憾:匹配失败")
# # $(表示结束)

起别名

# 起别名
# 格式 (?P<name1>正则表达式) 引用(?P=name1)

match 和search()区别

# match 和search()区别
str = "你好:123,感谢碰见你:889"
# result = re.match("\d*", str)
# result = re.search(":\d*", str)
# findall 是集合须要遍历
result = re.findall("\d*", str)

if result:
    print("恭喜:匹配成功")
    # group在无下标的时候默认打印
    for i in result:
        print(i)
# match <re.Match object; span=(0, 0), match=''> 匹配成功却无值
# <re.Match object; span=(0, 3), match='123'> 须要把字符串去掉才会有值
else:
    print("遗憾:匹配失败")
# $(表示结束)

贪婪和非贪婪模式用

# 贪婪和非贪婪模式用 ?区分
""" 变量:第一个字符必须是字母数字下划线 使用re模块进行正则表达式进行验证 """
import re

# match("者则表达式","匹配值")(从第一个开始匹配,若第一个不对则不匹配)
# str = "X_lady@163.com"
# result = re.match("\w{4,20}@163\.com", str)
# if result:
# print("恭喜:匹配成功")
# # group在无下标的时候默认打印
# print(result.group())
# else:
# print("遗憾:匹配失败")
# $(表示结束)

# <div>Python</div>

# 正则表达式
# ()分组 \num(与第几个相对应)
# <([A-Za-z]+)>.*</\1>

# <div><span>Python</span></div>
# 正则表达式为
# <([A-Za-z]+)><([A-Za-z+]+)>.*</\2></\1>


# 起别名
# 格式 (?P<name1>正则表达式) 引用(?P=name1)

# str = "<div><span>Python</span></div>"
# result = re.match("<(?P<a>[A-Za-z]+)><(?P<b>[A-Za-z]+)>.*</(?P=b)></(?P=a)>", str)
# if result:
# print("恭喜:匹配成功")
# # group在无下标的时候默认打印
# print(result.group())
# else:
# print("遗憾:匹配失败")
# # $(表示结束)

# match 和search()区别
str = "你好:123,感谢碰见你:889"
# result = re.match("\d*", str)
# result = re.search(":\d*", str)
# findall 是集合须要便利
result = re.findall("\d*", str)

if result:
    print("恭喜:匹配成功")
    # group在无下标的时候默认打印
    for i in result:
        print(i)
# match <re.Match object; span=(0, 0), match=''> 匹配成功却无值
# <re.Match object; span=(0, 3), match='123'> 须要把字符串去掉才会有值
else:
    print("遗憾:匹配失败")
# $(表示结束)

# 贪婪和非贪婪模式用 ?区分

综合案例

""" 爬取妹子图全部的妹子图片 """
import requests
import re
import time
import os



header = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
}

# 获取当前目录
root = os.getcwd()

for page in range(8):
    # 进入当前目录
    os.chdir(root)

    # 建立文件夹
    os.mkdir(f"第{page+1}页")

    # 改变当前文件目录
    os.chdir(f"第{page+1}页")

    response = requests.get(f"https://www.meizitu.com/a/list_1_{page+1}.html", headers=header)
    response.encoding = "gb2312"
    if response.status_code == 200:
        # print(response.text)
        result = re.findall("""<a target='_blank' href=".*?"><img src="(.*?)" alt="(.*?)"></a>""", response.text)
        i = 1
        for i in result:
            name = i[1].replace("<b>", "").replace("</b>", "")
            path = i[0]
            print(f"{name}{path}")
            #根据图片地址再次请求(解析)
            response = requests.get(path, headers=header)
            # 图片为二进制 wb则为二进制保存
            # Python 数字和字符串不能够相加,须要转换类型
            with open(f"{str(i)+name}.jpg", "wb") as f:
            # 响应的文本,内容content
                f.write(response.content)
            print(f"{str(i)+name}:{path} 保存成功")
            time.sleep(1)
            i += 1
    print(f"第{page+1}获取成功,请慢慢欣赏")
    time.sleep(4)