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

在这里插入图片描述

正则匹配工具

链接:https://pan.baidu.com/s/13Pw7zO6EWiR97kwgBnxAxA
提取码:bdns

打开后傻瓜式安装就好了

在这里插入图片描述

比较重要的正则表达式使用 示例

简单的就直接看上面的图了,这里就吧哪些比较难懂的说一下

匹配邮箱:

\w*@(163|qq)\.com

在这里插入图片描述
\num 引用分组字符串

<([A-Za-z]+)><([A-Za-z]+)>.*</\2></\1>

在这里插入图片描述
特别说明:必须和所引用的分组匹配到的字符串相同,不然匹配不上:
在这里插入图片描述
还有一种起别名的引用方式:

<(?P<name1>[A-Za-z]+)><(?P<name2>[A-Za-z]+)>.*</(?P=name2)></(?P=name1)>

在这里插入图片描述

re模块使用

match 匹配

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

str = "18874@163.com"
result = re.match(r"\w{4,20}@163\.com$", str)

if result:
    print("匹配成功")
    #拿到结果
    print(result.group())
else:
    print("匹配失败")

特别说明:
在这里插入图片描述
ps正则表达式字符串前面加上“r”表示:让正则中的""不再具有转义功能

search 匹配
和 match 的区别就是 search 不一定要从第一位开始匹配

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

str = ",当前上: 123线人数: 123为";
# search 不一定要从第一位开始匹配
result = re.search(r": \d*", str)

if result:
    print("匹配成功")
    #拿到结果
    print(result.group())
else:
    print("匹配失败")
**findall 匹配*

findall 匹配
在这里插入图片描述

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

str = ",当前上: 123线人数: 123为";
# search 不一定要从第一位开始匹配
result = re.findall(r": \d*", str)

if result:
    print("匹配成功")
    # 如果使用 findall 匹配的话用这里
    for i in result:
        print(i)
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/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400",
}


# 获取当前目录 放循环里边会有问题
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/qingchun_3_{page+1}.html", headers=header)
    # 因为那个网址设置成的是 gb2312 如果不一样会乱码的哦
    response.encoding = "gb2312"
    # 请求成功就执行这里
    if response.status_code == 200:
        # 这是请求 html 源码的全部内容
        # print(response.text)
        # 这是通过 正则表达式 找符合条件的内容,并且返回 
        # (""" 是因为里边有 ” 和 ')
        #(.*?)这是分组的作用,如果这么写返回的 结构就会成 元祖 里面就是我们分组中的数据,这样我们就可可以只拿 sec 和 alt 中的数据
        # 去除了我们不要的数据,非常方便
        result = re.findall("""<a target='_blank' href=".*?"><img src="(.*?)" alt="(.*?)"></a>""", response.text)
        i = 1
        for r in result:
            # 拿到图片地址 
            path = r[0]
            # 拿到图片名
            name = r[1].replace("<b>", "").replace("</b>", "")
            # # 根据图片地址,再次请求
            response = requests.get(path, headers=header);
            # 将图片存起来 wb代表是以二进制的方式存储,而不是字符串
            with open(f"{str(i)+name}.jpg", "wb") as f:
                f.write(response.content)
            print(f"{str(i)+name} : {path} 保存成功")
            time.sleep(0.5)
            i += 1
    print(f"第{page+1}页抓取成功,请慢慢欣赏")
    time.sleep(2)

运行代码后执行效果:
在这里插入图片描述
在这里插入图片描述
这妹子好好看 嘿嘿嘿:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值