借助有效率的工具,可以讓我們更加方便的寫(xiě)出爬蟲(chóng)程序。本篇使用request和bs4庫(kù)爬取豆瓣音樂(lè)榜單。
豆瓣音樂(lè)榜單:https://music.douban.com/top250
bs4:Beautiful Soup 4 是一個(gè)可以從HTML或xml文件中提取數(shù)據(jù)的Python庫(kù)。它能夠通過(guò)你喜歡的轉(zhuǎn)換器實(shí)現(xiàn)慣用的文檔導(dǎo)航、查找、修改文檔的方式。Beautiful Soup會(huì)幫你節(jié)省數(shù)小時(shí)甚至數(shù)天的工作時(shí)間。
不添加headers可能導(dǎo)致403,無(wú)法獲取網(wǎng)頁(yè)源碼,這是因?yàn)椴僮鞅环?wù)器認(rèn)為是爬蟲(chóng)而拒絕訪問(wèn)。服務(wù)器通過(guò)校驗(yàn)請(qǐng)求的U-A來(lái)識(shí)別爬蟲(chóng),這是一種相對(duì)簡(jiǎn)單的反爬蟲(chóng)機(jī)制。通過(guò)模擬瀏覽器的U-A,可以解決這個(gè)問(wèn)題。
通常,瀏覽器在向服務(wù)器發(fā)送請(qǐng)求的時(shí)候,會(huì)有一個(gè)請(qǐng)求頭——User-Agent,它用來(lái)標(biāo)識(shí)瀏覽器的類(lèi)型。當(dāng)我們使用requests來(lái)發(fā)送請(qǐng)求的時(shí)候,默認(rèn)的User-Agent是python-requests/2.8.1。如此我們嘗試將User-Agent偽裝成瀏覽器。我們通過(guò)手動(dòng)指定User-Agent為Chrome瀏覽器(F12–>Network中查看),再次訪問(wèn)得到網(wǎng)頁(yè)源碼。
我們使用了beautifulsoup來(lái)分析網(wǎng)頁(yè)源碼, 創(chuàng)建bs對(duì)象soup,并使用解析器html.parser來(lái)解析源碼。 按F12–>Element查看網(wǎng)頁(yè)源碼,發(fā)現(xiàn)<div class='indent'>標(biāo)簽下存在歌單(table標(biāo)簽);
用for循環(huán)獲取所有table,并對(duì)每一個(gè)table進(jìn)行分析;
在<div, class='pl2'>標(biāo)簽下的<a>標(biāo)簽下發(fā)現(xiàn)歌名, 
用此detail.find('a').getText() 函數(shù)獲取a標(biāo)簽下的文字內(nèi)容,并添加到列表中music_name_list.append(music_name) ,再把列表的元素寫(xiě)進(jìn)文件就可以了。
注: BeautifulSoup中的find和findAll用法相同,不同之處為find返回的是findAll搜索值的第一個(gè)值。
next_page是為了讓程序能夠翻頁(yè),next_page['href'] ,獲取下一頁(yè)url,通過(guò)while循環(huán)來(lái)反復(fù)訪問(wèn),進(jìn)而可以獲取完整歌單。 
最后,完整程序代碼如下:
#!/usr/bin/env python# encoding=utf-8import requestsfrom bs4 import BeautifulSoupimport codecsdef download_page(url): headers = { 'User-Agent':'查看自己的User-Agent,粘貼到此處' } data = requests.get(url, headers=headers).content return datadef parse_html(html): global count soup = BeautifulSoup(html, "html.parser") music_list_soup = soup.find('div', attrs={'class': 'indent'}) music_name_list = [] for music_li in music_list_soup.find_all('table'): detail = music_li.find('div', attrs={'class': 'pl2'}) count += 1 music_name = 'Top ' + str(count) music_name = music_name + detail.find('a').getText() + '/n' music_name_list.append(music_name) next_page = soup.find('span', attrs={'class': 'next'}).find('a') if next_page: return music_name_list, next_page['href'] else: return music_name_list, Nonedef main(): url = 'https://music.douban.com/top250' fp = codecs.open('music', 'w', encoding='utf-8') while url: html = download_page(url) musics, url = parse_html(html) fp.write(''.join(musics))新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注