Python爬虫(四)数据解析—正则

113 阅读4分钟

数据解析原理概述:

解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储

1:进行指定标签的定位

2:标签或者标签对应的属性中存储的数据值进行提取(解析)

关于正则表达式的使用,后边找个时间可能会详细的看,这里先放一些python解析常用的正则语法:

1:单字符:

. :除换行符以外 的字符
[] :[aoe] [a-w]匹配集合中任意一个字符
\d :数字 [0-9]
\D :非数字
\w :数字、字母、下划线、中文
\W :非\w
\s :所有的空白字符包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]
\S :非空白

2:数量修饰

*:任意多次 >= 0
+:至少一次 >=1
?:可有可无,0次或者1次
{m}:固定m次 hello{3,}
{m,}:至少m次
{m,n}:m-n次

3:边界

$:以某某结尾
^:以某某开头

4:分组

(ab)

5:贪婪模式:

.*

6:非贪婪(惰性)模式:

.*?

7:python 正则模块

re.I :忽略大小写
re.M :多行匹配
re.S :单行匹配
re.sub(正则表达式,替换内容,字符串)

python解析html基本上上边的正则就够用了。

这里我使用贝壳网的链接做测试,爬取二手房展示页的所有的图片,链接如下:

dl.ke.com/ershoufang/

程序设计思路:

1:爬取上方链接显示网页的内容

# 引用request模块
import requests
# 引入 正则模块
import re
# 1:指定url
url = "https://dl.ke.com/ershoufang/"

# 2:UA伪装 将对应的User-Agent封装到一个字典中(浏览器标识去浏览器中用f12查看源代码获取就好了)
headers = {
    "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43'
}

# 3:模拟网络请求链接
responce = requests.get(url=url, headers=headers)

# 4:获取响应数据
content = responce.text

2:获取到内容之后,使用正则表达式获取页面中指定标签的图片链接

# 5: 声明正则
# ex = '<img src.*?\n               data-original="(.*?)"\n               alt.*?'
ex = '<img src.*? \s*? data-original="(.*?)"\s*? alt.*?'

#6: 使用正则解析爬取到的HTML字符串
imgList = re.findall(ex, content, re.S)
print(imgList)

上边的代码中,第一行正则表达式我是注释了的:src.?代表:src后边所有的字符,\n   是因为爬取下来的字符串是有格式的,有换行符,必须这样写。但是这样写就有点不太舒服,正则表达式中有去除换行符\n的语法\s,于是就有了下边我在用的正则表达式src.? \s*?,我要获取的url是存储在data-original中的,因此我将其使用()括起来,表示我要获取的数据。

3:将《Python爬虫(三)图片数据爬取》中的代码封装成一个方法

循环列表,调用上边封装的方法保存图片

代码如下:

def getImage(url,num):
    """
    :name 爬取网络图片
    :param url: 图片url
    :param num: 图片名称
    :return: 无返回值
    """
    # 1:指定url
    # url = "https://resource.guanchao.site/uploads/sowing/welcome-image3.jpg"
    # 2:模拟网络请求链接
    responce = requests.get(url=url)
    # 3:获取响应数据,content获取二进制数据
    content = responce.content
    filename = './img/'str(num) +'.jpg'
    # 4:持久化存储
    with open(filename, 'wb'as fe:
        fe.write(content)
        print('爬取完成')
 
i = 0
# 循环图片列表
for src in imgList:
    # 调用封装好的爬取图片数据的方法
    getImage(src, i)
    i += 1

这个就没啥可说的了,具体请查看 《Python爬虫(三)图片数据爬取》

以上的代码我就将页面中所有的图片链接爬取下来了。

完整代码如下所示:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2022/2/14 17:29
# @Author  : camellia
# @Email   : 805795955@qq.com
# @File    : pachong.py
# @Software: PyCharm
# 引用request模块
import requests
# 引入 正则模块
import re

def getImage(url,num):
    """
    :name 爬取网络图片
    :param url: 图片url
    :param num: 图片名称
    :return: 无返回值
    """
    # 1:指定url
    # url = "https://resource.guanchao.site/uploads/sowing/welcome-image3.jpg"
    # 2:模拟网络请求链接
    responce = requests.get(url=url)
    # 3:获取响应数据,content获取二进制数据
    content = responce.content
    filename = './img/'str(num) +'.jpg'
    # 4:持久化存储
    with open(filename, 'wb'as fe:
        fe.write(content)
        print('爬取完成')

# 1:指定url
url = "https://dl.ke.com/ershoufang/"

# 2:UA伪装 将对应的User-Agent封装到一个字典中(浏览器标识去浏览器中用f12查看源代码获取就好了)
headers = {
    "User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43'
}

# 3:模拟网络请求链接
responce = requests.get(url=url, headers=headers)

# 4:获取响应数据
content = responce.text

# 5: 声明正则
# ex = '<img src.*?\n               data-original="(.*?)"\n               alt.*?'
ex = '<img src.*? \s*? data-original="(.*?)"\s*? alt.*?'

#6: 使用正则解析爬取到的HTML字符串
imgList = re.findall(ex, content, re.S)
print(imgList)

i = 0
# 循环图片列表
for src in imgList:
    # 调用封装好的爬取图片数据的方法
    getImage(src, i)
    i += 1

# 7:将爬取到的html内容进行持久化存储
with open('tuchong.html''w', encoding='utf-8'as fe:
    fe.write(content)
    print('爬取完成!')

有好的建议,请在下方输入你的评论。

欢迎访问个人博客 guanchao.site