前端的知识对爬虫真的很重要哇,比如一个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!!!
热爱生活,热爱编程!坚持每天一个实例,争取自己想要的东西。