有了第一个程序的基础,我们现在来爬取酷狗音乐top500的歌曲信息。
我们第一个程序只爬取了一个页面的数据,而现在我们需要爬取多个页面的数据,即跨页面爬虫。这就需要我们观察网页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页。但是酷狗不支持手动翻页。当我们将数字 1 改为数字 2 之后,即可进入页面2,由此我们推断出,通过更改http://www.kugou.com/yy/rank/home/{ } - 8888.html链接即 { } 里面的数字就可以访问不同的页面。我们可以利用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 } 处。这样就可以构造所有的网络连接
3.构造完所有的网络连接之后就可以使用 for 循环不断的打印出每个页面的内容了。先利用 requests 来模仿浏览器访问目标网页,获取原网页内容;接着利用 BeautifulSoup 解析网页内容(你可以试着打印出BeautifulSoup解析之后的网页,观察一下是什么结构);然后利用select()来查找我们需要的内容,分别为排名列表,名称列表,时间列表。
4.最后利用 for 循环打印以上内容即可