python爬⾍之爬取百度⾳乐的实现⽅法
在上次的爬⾍中,抓取的数据主要⽤到的是第三⽅的Beautifulsoup库,然后对每⼀个具体的数据在⽹页中的selecter来到它,每⼀个类别便有⼀个select⽅法。对⽹页有过接触的都知道很多有⽤的数据都放在⼀个共同的⽗节点上,只是其⼦节点不同。在上次爬⾍中,每⼀类数据都要从其⽗类(包括其⽗节点的⽗节点)上往下寻ROI数据所在的⼦节点,这样就会使爬⾍很臃肿,因为很多数据有相同的⽗节点,每次都要重复的到这个⽗节点。这样的爬⾍效率很低。
因此,笔者在上次的基础上,改进了⼀下爬取的策略,笔者以实例来描述。
如图,笔者此次爬取的是百度⾳乐的页⾯,所爬取的类容是上⾯榜单下的所有内容(歌曲名,歌⼿,排名)。如果按照上次的爬⾍的⽅法便要写上三个select⽅法,分别抓取歌曲名,歌⼿,排名,但笔者观察得知这三项数据皆放在⼀个li标签内,如图:
这样我们是不是直接抓取ul标签,再分析其中的数据便可得到全部数据了?答案是,当然可以。
但Beaufulsoup不能直接提供这样的⽅法,但Python⽆所不能,python⾥⾯⾃带的re模块是我见过最迷
⼈的模块之⼀。它能在字符串中到我们让我们roi的区域,上述的li标签中包含了我们需要的歌曲名,歌⼿,排名数据,我们只需要在li标签中通过re.findall()⽅法,便可到我们需要的数据。这样就能够⼤⼤提升我们爬⾍的效率。
我们先来直接分析代码:
def parse_one_page(html):
soup = BeautifulSoup(html, 'lxml')
data = soup.select('div.ranklist-wrapper.clearfix div.bd ul.song-list li')
pattern1 = repile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?title="(.*?)".*?</li>', re.S)
pattern2 = repile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?target="_blank">(.*?)</a>', re.S)
wants = []
for item in data:
# print(item)
final = re.findall(pattern1, str(item))
if len(final) == 1:
# print(final[0])
wants.append(final[0])
else:
other = re.findall(pattern2, str(item))html播放音乐代码
# print(other[0])
wants.append(other[0])
return wants
上⾯的代码是我分析⽹页数据的全部代码,这⾥不得不说python语⾔的魅⼒,数⼗⾏代码便能完成java100⾏的任
务,C/C++1000⾏的任务。上述函数中,笔者⾸先通过Beautifulsoup得到该⽹页的源代码,再通过select()⽅法得到所有li标签中的数据。
到这⾥,这个爬⾍便要进⼊到最重要的环节了,相信很多不懂re模块的童靴们有点慌张,在这⾥笔者真的是强烈推荐对python 有兴趣的童靴们⼀定要学习这个⾮常重要的⼀环。⾸先,我们知道re的⽅法⼤多只针对string型数据,因此我们调⽤str()⽅法将每个list中的数据(即item)转换为string型。然后便是定义re的pattern了,这是个稍显复杂的东西,其中主要⽤到repile()函数得到要在string中配对的pattern,这⾥笔者便不累述了,感兴趣的童靴可以去⽹上查阅⼀下资料。
上述代码中,笔者写了两个pattern,因为百度⾳乐的⽹页⾥,li标签有两个结构,当⽤⼀个pattern在li中不到数据时,便使⽤另⼀个pattern。关于re.findadd()⽅法,它会返回⼀个list,⾥⾯装着tuple,但其实我们知道我们到的数据就是list[0],再将每个数据添加到另⼀个List中,让函数返回。
相信很多看到这⾥的⼩伙伴已经云⾥雾⾥,⽆奈笔者对re板块也知道的不多,对python感兴趣的同学可以查阅相关资料再来看⼀下代码,相信能够如鱼得⽔。
完整的代码如下:
import requests
from bs4 import BeautifulSoup
import re
def get_one_page(url):
wb_data = (url)
ding = wb_data.apparent_encoding
if wb_data.status_code == 200:
return
else:
return None
def parse_one_page(html):
soup = BeautifulSoup(html, 'lxml')
data = soup.select('div.ranklist-wrapper.clearfix div.bd ul.song-list li')
pattern1 = repile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?title="(.*?)".*?</li>', re.S)
pattern2 = repile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?target="_blank">(.*?)</a>', re.S)
wants = []
for item in data:
# print(item)
final = re.findall(pattern1, str(item))
if len(final) == 1:
# print(final[0])
wants.append(final[0])
else:
other = re.findall(pattern2, str(item))
# print(other[0])
wants.append(other[0])
return wants
if __name__ == '__main__':
url = 'music.baidu/'
html = get_one_page(url)
data = parse_one_page(html)
for item in data:
dict = {
'序列': item[0],
'歌名': item[1],
'歌⼿': item[2]
}
print(dict)
最后我们看到的输出结果如下:
好了,笔者今天就到这⾥了。希望喜欢python的萌新能够快速实现⾃⼰的spider,也希望⼀些⼤神们能够看到这篇⽂章时不吝赐教。
以上这篇python爬⾍之爬取百度⾳乐的实现⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。