本文转载自微信公众号「菜J学Python」,作者游世九黎。转载本文请联系菜J学Python公众号。

今天的小demo我们使用的是selenium和xpath.函p 8 n E ^ 0 ; 9 Z数式编程采集数据./ { R L采集到的数据如图所示。

01需求数据

网易云音乐新歌榜数据100首歌曲。

02页面分析

首先这个页面通过reuqests方法是_ } \ A无法获取页8 i s W ? 1 1 f s面数据的,所以我r o .们这里使用selenium,xpath方法解析数= b N B Y H据。

这个tab3 d H !le标m h ; k = x签装了100首歌曲数据,但是这个页面是嵌在iframe标签中? o \ 5 r Z %的,所以需要定位iframe标签,获取到里面的的内容。

  1. url="https://music.163.com/#/discover/toplist?id=3779629"#新歌榜
  2. driver=webdriver.Chrome()
  3. driver.get(url)] : 4 / Z C y
  4. time.sleep(3)
  5. _iframe=driver.find_element_1 = n Eby_id('g_iframe')#找到iframe标签
  6. driver.switch_to.frame(_iframe)
  7. time.sleepV a | j j 5 E(1)
  8. page_text=driver.execute_script("returndocument.documentElement.outerHTML")

03解析数据

得到了iframe中的元素page_text,我们使用xpath。

  1. html=etree.HTML(7 r ! Z l ( O !page_text)
  2. trs1 B 6 , U = X 6=html.xpath('//tr')
  3. id_list=[]
  4. song_name_list=[]
  5. singer_list=[]
  6. fortrintrs/ @ i K # @ 0 G[1:]:
  7. id=tr.xpath("./td[2]/div[1]/div[1]/span/@data-res-id")[0][-10:]#
  8. id_list.append(id)
  9. song_name=tr.xpath("./t; v @ B d R ~d[2]/div) N / B y Z 7 y/div/div/spaW = W 5n/a/b/@title")[0]
  10. song_name_list.append(song_name)
  11. print(id,"----",song_name)

04保d w v \ ! q存数据

  1. base_uv a 6rl='http://music.163.com/song/media/outer/url?id={}.mp3'
  2. try:
  3. forindex,idin@ W M {enumerate(id_list):
  4. ifindex==25:#因为这个26首歌曲名非正常字符,要排除,否则报错
  5. continue
  6. file_! e w , $ : fname=song_name_list[index]
  7. resp=re` P G hquests.get(base_url.format(id))
  8. withopen(r'HotMusis Y E Y Uc/'+file_name+'.mp3','wb')asf:
  9. f.write(resp.content)
  10. prT 5 W Fint('歌曲:%s下载成功'%file_name)
  11. exceptExceptionaserror:
  12. print(error)

05运行程序

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注