Python爬虫〇五———数据解析之正则解析
我们前面的爬虫基本上都是通用爬虫,下面我们要讲到的是聚焦爬虫。聚焦爬虫得实现就要求我们在数据持久化前对指定的数据进行解析。聚焦爬虫用于爬取页面中指定部分的数据,而不是整个数据。隐藏我们就需要对爬到底数据按照一定方式解析。我们一般用下面三种方法实现数据解析。
- 正则解析
- beautifulsoup
- 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参数中的,思路一样,稍微修改一下就可以了!