zoukankan      html  css  js  c++  java
  • Python爬虫〇五———数据解析之正则解析

    我们前面的爬虫基本上都是通用爬虫,下面我们要讲到的是聚焦爬虫。聚焦爬虫得实现就要求我们在数据持久化前对指定的数据进行解析。聚焦爬虫用于爬取页面中指定部分的数据,而不是整个数据。隐藏我们就需要对爬到底数据按照一定方式解析。我们一般用下面三种方法实现数据解析。

    1. 正则解析
    2. beautifulsoup
    3. xpath

    今天我们就先看一下最基础的正则解析

    通过正则爬取单一页面上的图片

    正则解析是用到我们以前学习过的正则表达式来索引到需要的数据(点击查看)前面的链接里讲了最基础的正则表达式的使用方法。

    至于如何使用正则,在较为聚焦爬虫中还是比较简单的,主要用于所需要的数据是存储在html代码中的情形,比方我们要爬取一个网站的图片(糗百的热图:https://www.qiushibaike.com/imgrank/)

    我们检查一下网页,可以发现每个图片的链接代码是都是这样的结构

    <div class="thumb">
      <a href="/article/124071390" target="_blank">
        <img src="//pic.qiushibaike.com/system/pictures/12407/124071390/medium/4MSP6AZL0CDG5FDC.jpg" alt="糗事#124071390" class="illustration" width="100%" height="auto">
      </a>
    </div>

    所以下面要做的,就是利用以前大致了解过的正则表达式把整个页面html代码中所有的class名为thumb的div下的img标签拿到就可以了,而对应的正则表达式,就可以简单的写成这样

    import requests
    import re
    
    url = 'https://www.qiushibaike.com/imgrank/'
    
    resp = requests.get(url=url)
    page_html = resp.text
    
    ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
    img_url_list = re.findall(ex,page_html,re.S)

    最后返回的img_utl_list就是所有img标签里的链接地址所组成的。最后把代码放出来

     1 import requests
     2 import re
     3 import os
     4 
     5 if  not os.path.exists('./qiushibaikeLib'):
     6     os.mkdir('./qiushibaikeLib')
     7 url = 'https://www.qiushibaike.com/imgrank/'
     8 
     9 resp = requests.get(url=url)
    10 page_html = resp.text
    11 
    12 
    13 ex = '<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>'
    14 img_url_list = re.findall(ex,page_html,re.S)
    15 
    16 for img in img_url_list:
    17     print(img)
    18     url = 'https:'+img
    19     img_data = requests.get(url=url).content
    20     img_name = img.split('/')[-1]
    21     img_path = './qiushibaikeLib/'+img_name
    22     with open(img_path,'wb') as f:
    23         f.write(img_data)
    24     print(img_name,'finish!')

    这里加了一个其他的功能:创建一个新的文件夹用来放爬取的图片!并且在创建前判断一下该文件夹是否已经存在。

    通过正则爬取多页面数据的图片

    这一段其实已经不属于要本章要讲到内容了。比较简单。

    上面的一段代码我们爬取了糗百上一页的图片,那么如果想要爬取多个页面上的图片又该怎么实现呢?实现的方法很简单,因为通过正则索引数据的方法没有变,所以在原有的代码上加一个for循环就好了。

     1 import requests
     2 import re
     3 import os
     4 
     5 if  not os.path.exists('./qiushibaikeLib'):
     6     os.mkdir('./qiushibaikeLib')
     7 
     8 for i in range(1,6):
     9     url = 'https://www.qiushibaike.com/imgrank/page/{}/'.format(str(i))
    10     resp = requests.get(url=url)
    11     page_html = resp.text
    12 
    13 
    14     ex = '<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>'
    15     img_url_list = re.findall(ex,page_html,re.S)
    16 
    17     for img in img_url_list:
    18         print(img)
    19         url = 'https:'+img
    20         img_data = requests.get(url=url).content
    21         img_name = img.split('/')[-1]
    22         img_path = './qiushibaikeLib/'+img_name
    23         
    24         with open(img_path,'wb') as f:
    25             f.write(img_data)
    26         print(img_name,'finish!')

    上面的代码爬取了5页的数据。由于糗百里糗图的页码是直接包含在url里的,所以在代码里直接用for循环写在了url里,有些情况是包含在param参数中的,思路一样,稍微修改一下就可以了!

  • 相关阅读:
    CCNA 6.9
    CCNA 6.5
    Google search
    CCNA 4.14 TP Correction
    CCNA 6.3
    CCNA 6.6
    有关 英语学习的一些网站
    法语学习笔记
    垃圾邮件分类(Scala 版本)
    SQL 面试经典问题 行列互相转化
  • 原文地址:https://www.cnblogs.com/yinsedeyinse/p/14403120.html
Copyright © 2011-2022 走看看