今天,一个小伙伴发给我一个网站,我一看,哦,原来是一个歌曲排行榜。我说,这是怎么了。小伙伴说,他在爬取这个网站的时候呢,遇到了一些困难,主要是数据的提取非常的不方便。数据是一大段一大段的写在script标签中的,就算拿到了script标签,想要从中拿到自己所需要的一部分,也挺麻烦的,问我应该怎么办?
我问他说,你是用什么方法提取数据的呢?小伙伴说,就是用beautifulsoup啊,自己学习的时候,老师就是这么教的。我问他,parsel更好用,你为什么不尝试使用一下parsel呢?小伙伴非常疑惑,parsel是一个什么东西呢?好吧,看来这个小伙伴没有好好看我以前的文章啊,不过不要紧,今天我们就来帮助小伙伴解决这个问题
关于parsel的使用,以及parsel为什么这么好,我在往期的文章中已经写过了,如果你还不知道的话,可以查看parsel解析器的使用,简单的来说,像这样通过节点和标签不可以直接提取出来的数据,一般要么是使用正则表达式,要么是先使用xpath的提取,然后再使用正则表达式。像bs4虽然既可以使用xpath,又可以使用css选择器,非常的不错,但是如果你使用的是parsel的话,就可以直接使用正则表达式了
在parsel中使用正则表达式,比起原始python中的re模块的使用,还要更简单一些。你只需要写出正则表达式,就可以立刻提取出数据了
因此,我非常的建议,在爬虫的数据提取中可以多使用parsel,尤其是在需要使用正则表达式的情况下。当然,我也观察到现在使用parsel的用户并不是很多,这可能是之前lxml和bs4的使用非常广泛的缘故,不过如果你希望学习更简单,更好的方法,我要强烈的推荐parsel
- import requests
- import json
- import pandas as pd
- from parsel import Selector
- from base64 import b64decode
-
-
- headers = {"user-agent": "Mozilla/5.0"}
-
- url = b64decode("aHR0cHM6Ly95LnFxLmNvbS9uL3J5cXEvdG9wbGlzdC82Mg==").decode()
- r = requests.get(url, headers=headers)
-
- s = Selector(r.text)
- t = s.re_first("rankList.*?(\[{.*?}\])")
-
- t = json.loads(t)
-
- l = list()
- for i in t:
- l.append([i["rank"], i["rankValue"], i["title"], i["singerName"]])
-
- data = pd.DataFrame(l, columns=["排名", "评分", "标题", "歌手名"])
-
- data.to_csv("yinyue.csv", index=False)
程序的实际使用的效果展示如下

存入csv文件以后,就可以像excel那样打开了,非常的方便

可能有很多小伙伴在看完这个程序以后,非常的不理解啊。“其实你这个程序也没使用到xpath啊,也就只用了一个正则表达式,那直接使用re模块不就行了吗?为什么还非得用什么parsel呢?“
对,当然这样说也没错,其实不管你用什么方式提取数据,只要最后能够顺利的提取出数据,而且你还不在意性能的话,都是没什么差别的,因此你喜欢使用哪个,就用哪个就好了。不一定非要争论谁比谁更好。但我个人的建议是,parsel的使用简单而且方便,我更喜欢这个,我也强烈建议你也可以试试