• 【Python】【爬虫】爬取酷狗TOP500


    好啦好啦,那我们来拉开我们的爬虫之旅吧~~~

    这一只小爬虫是爬取酷狗TOP500的,使用的爬取手法简单粗暴,目的是帮大家初步窥探爬虫长啥样,后期会慢慢变得健壮起来的。

    环境配置

    在此之前需要下载一个谷歌浏览器,下好后由于谷歌搜索是需要翻墙的,可设置打开网页为百度来使用

    我们用到的是bs4,要求这两个库来提取,这是简称,全称是BeautifulSoup库。中文名也叫“美丽的汤”,安装也很简单。

    :cmd命令行(win + r),输入pip install bs4完成安装,如下图:

    bs4安装.PNG

    请求库同样,pip安装请求

    可能遇到的安装错误

    如果执行pip install bs4后报错为“ pip不是重置的命令”

    这是因为没有把pip的路径加入“环境变量”,加入环境变量即可

    构造请求网址

    我们是爬取酷狗音乐TOP500的'音乐名','歌手','歌名','播放时间'这几个数据网址如下:

    https://www.kugou.com/yy/rank/home/1-8888.html?from=rank

    :后只能看到前22名的数据,如下:

    第一页数据显示.PNG

    网址也叫url,唯一资源定位符,我们观察url如下几个细分:

    https:传输协议,一般都是http或https

    www.kugou.com:为域名

    yy / rank / home / abs:为域名下的子网页

    .html:代表此网页是静态的,后面会讲

    ?:问号后面的一般都是一些请求参数

    我们可以看到,其中有一个1-8888这个参数,打开上述网址后我们只能看到前22首歌,想继续查看后面的歌曲就得翻页,就像“淘宝”那样查看下一页商品需要翻页,这里也是一样的道理,把1-8888改成2-8888,就会看到下一页的22首歌,如下:

    第二页数据.PNG

    我们翻到第500首音乐那一页,可以看到页码如下有23页:

    最后一页.PNG

    到这里我们我们需要提取的数据就知道在哪里了。

    在知道了有多少页以及url的含义后,通过以下代码构造所有的url:

    urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'
                    .format(str(i)) for i in range(1, 24)]

    构造请求头

    什么是请求头?

    别人网页区别是人还是机器访问的一种手段,我们设置请求头为浏览器的请求头,对方就会认为我们是人为的访问,从而不会反爬,当然这只是最简单的一种防反爬的手段,一般我们都会带上,代码如下:

    headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53
            7.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
        }

    这并不是一个一个手敲的!!!

    我们来看看它在哪里,按F12出现开发者工具,再按F5刷新出现如下图:

    f12.png

    按照红线提示,找到用户代理

    找header.PNG

    最后复制粘贴得到上面的代码

    请求访问网页

    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        return

    响应= request.get(URL,headers = headers)

    使用请求库的get方法,去访问网页,第一个参数为网址,第二个参数为请求头,请求结果赋值给变量response,其中里面有很多结果,状态响应码,网页二进制代码,二进制等

    response.status_code == 200

    调用请求结果响应中的status_code查看请求状态码,200代表请求成功,就返回,否则返回一个None,状态码一般有2xx,4xx,3xx,5xx,分别代表请求成功,客户端访问失败,重定向,服务器问题。

    返回response.text

    返回响应结果的text,代表返回网页html源码

    解析网页

    在上面返回了一个响应后,我们需要解析网页html源码,需要结构化,可以提取

    html = BeautifulSoup(html)

    提取数据

    我们来提取排名,鼠标放在排名这个元素这里,右键检查:

    快捷检查.PNG

    li:nth-​​child(1)需要改成li,因为nth-child(在右边可以看到一串二进制。其中有个高两个,就是刚刚那个排名的元素,快捷跟随提示选择然后复制过去,其中li:nth-​​child(1) 1)是获取li标签下的一条数据,我们是要获取这一页的所有排名

    选择排名.PNG

    # 排名
    ranks = html.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_num')

    同样的方法提取歌手歌名,播放时间

    # 歌手 + 歌名
    names = html.select('#rankWrap > div.pc_temp_songlist > ul > li > a')
    # 播放时间
    times = html.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span')

    获得数据

    for r,n,t in zip(ranks,names,times):
            r = r.get_text().replace('
    ','').replace('	','').replace('
    ','')
            n = n.get_text()
            t = t.get_text().replace('
    ','').replace('	','').replace('
    ','')

    用了zip函数,意思是把对应的排名,歌名歌手,播放时间打包,可以这样理解zip函数的结果是一个列表[(排名,歌手歌名,播放时间),(排名,歌手歌名,播放时间)。。。。。]

    每一次循环的r,n,t一次对应元组中的元素

    get_text()

    我们提取到的是这个数据所在的标签信息,并不是实际数据,所以需要使用get_text()获得实际数据

    .replace(' n','')。replace(' t','')。replace(' r','')

    去掉实际数据中多余的字符串

    最后把数据打包成字典打印

    结束

    到这里我们的关键步骤就完成了,大家好好理解一下,很容易的。

    在这里说一下,这种提取方式是不会常见的,因为效果很不健壮,可能过几天被人网页改了改结构,就不能使用了,这里只是让大家初步了解一下爬虫的大致提取流程,后面会使用其他更健壮的方法的。

    运行结果:

    最终代码

    import requests
    import time
    from bs4 import BeautifulSoup
    
    
    def get_html(url):
        '''
        获得 HTML
        '''
        headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53
            7.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
        }
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        else:
            return
    
    
    def get_infos(html):
        '''
        提取数据
        '''
        html = BeautifulSoup(html)
        # 排名
        ranks = html.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_num')
        # 歌手 + 歌名
        names = html.select('#rankWrap > div.pc_temp_songlist > ul > li > a')
        # 播放时间
        times = html.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span')
    
        # 打印信息
        for r,n,t in zip(ranks,names,times):
            r = r.get_text().replace('
    ','').replace('	','').replace('
    ','')
            n = n.get_text()
            t = t.get_text().replace('
    ','').replace('	','').replace('
    ','')
            data = {
                '排名': r,
                '歌名-歌手': n,
                '播放时间': t
            }
            print(data)
    
    
    def main():
        '''
        主接口
        '''
        urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'
                    .format(str(i)) for i in range(1, 24)]
        for url in urls:
            html = get_html(url)
            get_infos(html)
            time.sleep(1)
    
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    架构设计
    OpenRisc-37-OpenRISC的CPU&core的整体架构分析
    QFrame好像是万能的(可以随意画线,或者图片,放在其它元素之间做点缀,还可OnClick)
    QTableWidget的使用和美工总结
    QTableWidget表格合并若干问题及解决方法
    24篇HTTP博客
    利用VS2005进行dump文件调试(17篇博客)
    英语提问方式
    架构和框架的区别
    数据访问组件性能
  • 原文地址:https://www.cnblogs.com/HGNET/p/12082719.html
Copyright © 2020-2023  润新知