Python爬虫入门——2. 2爬取酷狗音乐top1-500歌曲信息

        有了第一个程序的基础,我们现在来爬取酷狗音乐top500的歌曲信息。连接http://www.kugou.com/yy/rank/home/1-8888.html

我们第一个程序只爬取了一个页面的数据,而现在我们需要爬取多个页面的数据,即跨页面爬虫。这就需要我们观察网页URL来构造一个列表利用for循环,分次抓取了。接下来看代码:

#导入requests库
import requests
#导入BeautSoup库
from bs4 import BeautifulSoup
#定义请求头,请求头可以使爬虫伪装成浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
#定义连接网络的列表
url_list = ['http://www.kugou.com/yy/rank/home/{0}-8888.html'.format(str(i)) for i in range(1,24)]


for url in url_list:
    # 利用requests模块连接网络,它可以打开并读取从网络获取的对象
    html = requests.get(url, headers=headers)
    #BeautifulSoup通过定位HTML标签来格式化和组织复杂的网络信息
    soup = BeautifulSoup(html.text, 'lxml')
    #将歌曲名称,作者存放到列表里面
    rank_list = soup.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_num')
    #将歌曲名称存放到列表里面
    name_list = soup.select('#rankWrap > div.pc_temp_songlist > ul > li > a')
    #将歌曲时间存放到列表里面
    time_list = soup.select('#rankWrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span')
    #将名次,歌名,时间依次打印出来
    for rank, name, time in zip(rank_list,name_list,time_list):
        #get_txet()是为了提取文字,去除其他字符。strip()是为了去除空白字符
        print(rank.get_text().strip(), name.get_text().strip(), time.get_text().strip())

现在我们来分析一下代码:

        酷狗一个网页只有22个数据,由于要抓取Top500的数据,所以总共要抓取23页。但是酷狗不支持手动翻页。不过我们可以仔细观察一下酷狗的网页链接http://www.kugou.com/yy/rank/home/2-8888.html,当我们将数字  改为数字  之后,即可进入页面2,由此我们推断出,通过更改http://www.kugou.com/yy/rank/home/{ } - 8888.html链接即  { }  里面的数字就可以访问不同的页面。我们可以利用format()来进行填充。关于format函数可以参考博文Python字符串格式化--format()方法。在 { }里面填充字符串  1-23(注意,需要用str()函数将 数字 i 转换为字符串,因为网页链接是字符串类型,如果为数字,访问会出问题)

       1.首先导入requests库以及BeautifulSoup库,编写headers(关于headers的获取请参考我上一篇博文)

       2.利用  format()构造一个链接字符串列表:{0}表示填充的参数是format()里面第一个参数,{6}表示填充的是format()里面第七个参数,由于我们只需要填充一个参数,所以用{0}即可,也可以使用 { };  


.format(str(i)) for i in range(1,24)

 这一句使用了列表生成式,例 [  i  for  i  in range(10)  ]  ,意思是生成一个区间在 [ 0 ,  10 ) 的列表。而  i for in  range( 1 ,24)的意思是 生成一个 区间在 [ 1 ,  24)的列表。而str( i ) 把生成的数字  int  i  转换为字符 str i  。再利用format()填充到网络连接的 { 0 } 处。这样就可以构造所有的网络连接

http://www.kugou.com/yy/rank/home/1-8888.html
http://www.kugou.com/yy/rank/home/2-8888.html
http://www.kugou.com/yy/rank/home/3-8888.html
http://www.kugou.com/yy/rank/home/4-8888.html
http://www.kugou.com/yy/rank/home/5-8888.html
http://www.kugou.com/yy/rank/home/6-8888.html
http://www.kugou.com/yy/rank/home/7-8888.html
http://www.kugou.com/yy/rank/home/8-8888.html
http://www.kugou.com/yy/rank/home/9-8888.html
http://www.kugou.com/yy/rank/home/10-8888.html
http://www.kugou.com/yy/rank/home/11-8888.html
http://www.kugou.com/yy/rank/home/12-8888.html
http://www.kugou.com/yy/rank/home/13-8888.html
http://www.kugou.com/yy/rank/home/14-8888.html
http://www.kugou.com/yy/rank/home/15-8888.html
http://www.kugou.com/yy/rank/home/16-8888.html
http://www.kugou.com/yy/rank/home/17-8888.html
http://www.kugou.com/yy/rank/home/18-8888.html
http://www.kugou.com/yy/rank/home/19-8888.html
http://www.kugou.com/yy/rank/home/20-8888.html
http://www.kugou.com/yy/rank/home/21-8888.html
http://www.kugou.com/yy/rank/home/22-8888.html
http://www.kugou.com/yy/rank/home/23-8888.html

       3.构造完所有的网络连接之后就可以使用  for 循环不断的打印出每个页面的内容了。先利用 requests 来模仿浏览器访问目标网页,获取原网页内容;接着利用 BeautifulSoup 解析网页内容(你可以试着打印出BeautifulSoup解析之后的网页,观察一下是什么结构);然后利用select()来查找我们需要的内容(关于如何写入select的查找条件请参考我上一篇博文Python爬虫入门——2. 1 我的第一个爬虫程序),分别为排名列表,名称列表,时间列表。

       4.最后利用  for  循环打印以上内容即可

 

 

        

你可能感兴趣的:(Python爬虫入门,Python爬虫)