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参数中的,思路一样,稍微修改一下就可以了!

posted @ 2021-02-15 01:08  银色的音色  阅读(93)  评论(0编辑  收藏  举报