• 爬虫之正则解析


    一,介绍

    大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。

    因此数据爬取的流程为:

    1. 指定url
    2. 基于requests模块发起请求
    3. 获取响应中的数据
    4. 数据解析
    5. 进行持久化存储

    二,正则解析数据

    常用正则表达式回顾:

    单字符:
    . : 除换行以外所有字符
    [] :[aoe] [a-w] 匹配集合中任意一个字符
    d :数字 [0-9]
    D : 非数字
    w :数字、字母、下划线、中文
    W : 非w
    s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ f v]。
    S : 非空白
    数量修饰:
    * : 任意多次 >=0
    + : 至少1次 >=1
    ? : 可有可无 0次或者1次
    {m} :固定m次 hello{3,}
    {m,} :至少m次
    {m,n} :m-n次
    边界:
    $ : 以某某结尾
    ^ : 以某某开头
    分组:
    (ab)
    贪婪模式: .*
    非贪婪(惰性)模式: .*?

    re.I : 忽略大小写
    re.M :多行匹配
    re.S :单行匹配

    re.sub(正则表达式, 替换内容, 字符串)

    正则复习


    复制代码
    单字符:
            . : 除换行以外所有字符
            [] :[aoe] [a-w] 匹配集合中任意一个字符
            d :数字  [0-9]
            D : 非数字
            w :数字、字母、下划线、中文
            W : 非w
            s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ f
    
    	v]。
            S : 非空白
        数量修饰:
            * : 任意多次  >=0
            + : 至少1次   >=1
            ? : 可有可无  0次或者1次
            {m} :固定m次 hello{3,}
            {m,} :至少m次
            {m,n} :m-n次
        边界:
            $ : 以某某结尾 
            ^ : 以某某开头
        分组:
            (ab)  
        贪婪模式: .*
        非贪婪(惰性)模式: .*?
    
        re.I : 忽略大小写
        re.M :多行匹配
        re.S :单行匹配
    
        re.sub(正则表达式, 替换内容, 字符串)
    复制代码

    import re
    #提取出python
    key="javapythonc++php"
    re.findall('python',key)[0]
    #####################################################################
    #提取出hello world
    key="<html><h1>hello world<h1></html>"
    re.findall('<h1>(.*)<h1>',key)[0]
    #####################################################################
    #提取170
    string = '我喜欢身高为170的女孩'
    re.findall('d+',string)
    #####################################################################
    #提取出http://和https://
    key='http://www.baidu.com and https://boob.com'
    re.findall('https?://',key)
    #####################################################################
    #提取出hello
    key='lalala<hTml>hello</HtMl>hahah' #输出<hTml>hello</HtMl>
    re.findall('<[Hh][Tt][mM][lL]>(.*)</[Hh][Tt][mM][lL]>',key)
    #####################################################################
    #提取出hit.
    key='bobo@hit.edu.com'#想要匹配到hit.
    re.findall('h.*?.',key)
    #####################################################################
    #匹配sas和saas
    key='saas and sas and saaas'
    re.findall('sa{1,2}s',key)
    #####################################################################
    #匹配出i开头的行
    string = '''fall in love with you
    i love you very much
    i love she
    i love her'''

    re.findall('^.*',string,re.M)
    #####################################################################
    #匹配全部行
    string1 = """<div>静夜思
    窗前明月光
    疑是地上霜
    举头望明月
    低头思故乡
    </div>"""

    re.findall('.*',string1,re.S)

    正则练习


    复制代码
    import re
    #提取出python
    key="javapythonc++php"
    re.findall('python',key)[0]
    #####################################################################
    #提取出hello world
    key="<html><h1>hello world<h1></html>"
    re.findall('<h1>(.*)<h1>',key)[0]
    #####################################################################
    #提取170
    string = '我喜欢身高为170的女孩'
    re.findall('d+',string)
    #####################################################################
    #提取出http://和https://
    key='http://www.baidu.com and https://boob.com'
    re.findall('https?://',key)
    #####################################################################
    #提取出hello
    key='lalala<hTml>hello</HtMl>hahah' #输出<hTml>hello</HtMl>
    re.findall('<[Hh][Tt][mM][lL]>(.*)</[Hh][Tt][mM][lL]>',key)
    #####################################################################
    #提取出hit. 
    key='bobo@hit.edu.com'#想要匹配到hit.
    re.findall('h.*?.',key)
    #####################################################################
    #匹配sas和saas
    key='saas and sas and saaas'
    re.findall('sa{1,2}s',key)
    #####################################################################
    #匹配出i开头的行
    string = '''fall in love with you
    i love you very much
    i love she
    i love her'''
    
    re.findall('^.*',string,re.M)
    #####################################################################
    #匹配全部行
    string1 = """<div>静夜思
    窗前明月光
    疑是地上霜
    举头望明月
    低头思故乡
    </div>"""
    
    re.findall('.*',string1,re.S)
    复制代码

    ex:项目需求:爬取糗事百科指定页面的糗图,并将其保存到指定文件夹中 

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import requests
    import re
    import os
    if __name__ == "__main__":
         url = 'https://www.qiushibaike.com/pic/%s/'
         headers={
             'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
         }
         #指定起始也结束页码
         page_start = int(input('enter start page:'))
         page_end = int(input('enter end page:'))
    
         #创建文件夹
         if not os.path.exists('images'):
             os.mkdir('images')
         #循环解析且下载指定页码中的图片数据
         for page in range(page_start,page_end+1):
             print('正在下载第%d页图片'%page)
             new_url = format(url % page)
             response = requests.get(url=new_url,headers=headers)
    
             #解析response中的图片链接
             e = '<div class="thumb">.*?<img src="(.*?)".*?>.*?</div>'
             pa = re.compile(e,re.S)
             image_urls = pa.findall(response.text)
              #循环下载该页码下所有的图片数据
             for image_url in image_urls:
                 image_url = 'https:' + image_url
                 image_name = image_url.split('/')[-1]
                 image_path = 'images/'+image_name
    
                 image_data = requests.get(url=image_url,headers=headers).content
                 with open(image_path,'wb') as fp:
                     fp.write(image_data)

     原文:https://www.cnblogs.com/glh-ty/p/9873818.html

  • 相关阅读:
    Webcodecs解析GIF图
    bash 查询某文件夹,文件内容
    SpringBoot整合Quartz实现分布式调度
    SpringBoot实现本地(网络)文件下载和zip压缩包批量下载
    SpringBoot 接口防止恶意刷新和暴力请求
    vue3 如何使用ref引用dom来清除表单上一次值
    灵雀云+麒麟软件携手打造全栈云原生联合解决方案
    2022云原生网络趋势 | K8s托管整个基础设施、多云、边缘计算、安全等场景,将云原生网络带向新战场
    医疗机构如何利用云原生加速智慧医院建设?
    软件定义汽车变局下,车企如何通过云原生构建“核心壁垒”?
  • 原文地址:https://www.cnblogs.com/qq631243523/p/10445399.html
Copyright © 2020-2023  润新知