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

今天的小demo我们使用的是selenium和xpath.函w 0 T @数式编程采集数据.采集到的数据如图所示。

01需x J } _ 4 y c求数据

网易云音乐新歌榜数据100首歌{ @ [ 4 F S曲。

02页面分析

首先这个页面通过reuqests方法是无T k F法获取页面数据的,所以我们这里使用seleniuH p q %m,xpath方法解析数据。

这个ta. [ q m l Eble标签装了100首歌曲数– T b 5 B \ 5u % x r p ; \ J{ 5 ^ 3 } @据,但是这G w y }个页面是嵌在iframe标签中的,所以需要定位iframe标签,获取到里面的的内容\ 0 C 2 d

    1. url=“httpsj 9 5 *://music.163.com/#/discover/toplist?id=3779629″#新歌}% 9 ` z @2 % ^ c _ r Y ~_ 0 h 9 * l – _ `

 

 

    1. driver=w/ K T W G * xebdriver.Chrome()

 

&n1 ~ K j v L ^bsp;

    1. driver.get(url)

 

 

    1. time.sleep(3)w O h R S R [

 

 

    1. _iframe=driver.find_element_by_iQ r Z K 6 Gd(u u 9 F Y L 1‘g_ifR h W :rame’)#找到iframe标X * f i 3 E i Ag I @ { i / 9

 ) e ~ Y

 

    1. driver.switch_to.frame(_if3 k ) ? w {rame){ / / + ]

 y P M 9

 

    1. time.sleep(1)

 

&nbso ` Dp;

    1. page_text=driver.execute_script(“returndocument.documentElez * O V f ( M _ Cme, T 1 F ]nt.outV O : , z z \erHTML”)

 3 u w W , Z


03解析数据

得到了iframe中的元素p$ a Jag$ \ ae_text,我们使用xpath。

    1. html=etree.HTML(page_textY m ! D ~ N k)

 

 

    1. trs=html.xpath(‘//tr’)

 

    1. id_list=[]

 

    1. songk ? y ^_name_list=\ r } 5 %[]

 

    1. singeO o R } { 4 :r_W T B N y! y B p z g = 9 ` Elist=[]

 

 

    1. fortrintrs[1:]:

&nbI y ` – % * D usp;

    1. id=tr.xpath(2 ( ^ *./td[2]/div[1]/div[1]/span/@data-res-id”)[0][-10:]#

&n, d u W obsp;

    1. id_list.b I I g \ Q 9 W $append(id)

 

    1. song_name=t A 6 ! P \ e K Ntr.xpath(“./td[2]/div/div/div/span/a/b/@titleG I + F)[0]

 j \ \ 1 E a

    1. song_name_list.append(song_name)

 

    1. prinz 9 1t(id,“—-“,song_na] 2 : 8me)

 


04保存数据

    1. base_url=‘http:/: 7 \ D/music.163.com/song/media/outer/url?id={}.mp3′o f 6 x B y b

 

    1. try:

 

    1. forindex,z ( b , a m Eidinenumerate(id_lio hr X 4 H W jst):

 

    1. ifindex==25:#因为这个26首歌曲名非正常R 8 L , 8 g =字符,要排p N M x v B w .除,否则报错

 

    1. continue

 

    1. file_name=sj ) 3 l p c G Rong_name_list[index]

 

    1. resp; 9 W=requests.get(base_url.formaC l [ x lt(id))

 

    1. withopen(r‘HotMG l m 4 B u c |usic/’+file_name+‘.mp3’,‘wb_ 1 \ e X)asf:

M r D ( `

    1. f_ u e N \ r s *.write(resp.conten\ * } $ o . e I 5t)

 

    1. print(‘歌曲:%s下载成功’%file_n~ c % % r a ! v –ame)

 

    1. exceptExce1 V [ i @pP r r 0 ` = W Htionaserror:

 

    1. print(error)

 


05运行程序