实例2:酷狗Top500信息爬取

前端的知识对爬虫真的很重要哇,比如一个CSS的div、strong标签我以为是子标签取搜索,结果就懵逼了。原来这些属性的标签是不算的。故,需要小补一哈前端知识开爬虫会好一点。

进入正题,这个和我之前的那个实例爬取中国大学排名有明显的不同,虽然都是html代码解析,还没出现JavaScript,不用正则表达式,但还是有值得探索的地方。对比:之前的样例仅仅是所有信息都在同一个名字的标签里面,只要一次下行遍历找到里面的非属性字符串就完事了,但是这个实例就一样了,它的每一个信息都在不同的标签里面,这时候就需要搜索所在的标签。此处有新方法soup.select()方法这个方法之前也没见过,慕课也没见过,python书上也没有。。但是在好用哇。通过edge浏览器结合谷歌浏览的的分析。。PS:这里先强烈吐槽一下edge浏览器,简直是强迫症患者的灾难。

用这个方法的重点就是:要提取的信息所在的标签,他们同在什么区域,能否用一种独一无二的方式将要提取的信息的共同所在找到。所以你就要找这一批标签所在的位置的共同点和其他地方的不同点嘛。。。

还有就是get_text()方法和.string方法的区别,.string方法如果标签里面是子节点的非属性字符串才可,否则会返回None,而get_text()方法只要是子孙节点的非属性字符串都可以提取

上代码

from bs4 import BeautifulSoup
import requests
import pickle
import time

def get_html(url):
    '''通用获取网页源代码的模板'''
    key_value = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
            'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}
    try:
        r = requests.get(url,headers = key_value)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return None

def get_info(html,mylist):
    soup = BeautifulSoup(html,'lxml')#之前一直用'html.parser',这个lxml的速度更快
    titles = soup.select('div.pc_temp_songlist > ul > li > a')
    ranks = soup.select('span.pc_temp_num')#这三个式子是关键
    times = soup.select('span.pc_temp_time')
    for rank,title,time in zip(ranks,titles,times):#利用zip和序列解包代替三重循环
  	data = [
            '排名:',rank.get_text().strip(),
            '歌手名:',title.get_text().split('-')[0],#或title.string.split('-')[0]
            '歌名:',title.get_text().split('-')[1],#或title.string.split('-')[1]
            '歌曲时长:',time.get_text().strip()
        ]
    	mylist.append(data)#注意此处缩进,开始就是没注意。发现都相差22,因为一页有22首歌。
# obj = open('D:/myteest.txt','ab+')
# pickle.dump(data,obj)
# obj.close()  

def write_flie(mylist):
    for j in range(500):
        x = mylist[j]#这个文件写入关键是要加encoding = 'UTF-8'网页源代码清晰的写了编码格式为UTF-8
        with open('D:/thetest.txt','a',encoding='UTF-8') as obj:
            print(x,file=obj)

if __name__ == '__main__':
    mylist = []
    part_of_url = 'https://www.kugou.com/yy/rank/home/'
    for i in range(1,24):
        real_url = part_of_url + str(i) + '-8888.html'#对换页链接进行分析
        html = get_html(real_url)
        get_info(html,mylist)
    write_flie(mylist)
    time.sleep(1)#防止访问过快而造成爬取失败

Result!!!

在这里插入图片描述
热爱生活,热爱编程!坚持每天一个实例,争取自己想要的东西。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值