借助有效率的工具,可以讓我們更加方便的寫出爬蟲程序。本篇使用request和bs4庫爬取豆瓣音樂榜單。
豆瓣音樂榜單:https://music.douban.com/top250 bs4:
Beautiful Soup 4
是一個可以從HTML或xml文件中提取數據的Python庫。它能夠通過你喜歡的轉換器實現慣用的文檔導航、查找、修改文檔的方式。Beautiful Soup會幫你節省數小時甚至數天的工作時間。
不添加headers可能導致403,無法獲取網頁源碼,這是因為操作被服務器認為是爬蟲而拒絕訪問。服務器通過校驗請求的U-A來識別爬蟲,這是一種相對簡單的反爬蟲機制。通過模擬瀏覽器的U-A,可以解決這個問題。
通常,瀏覽器在向服務器發送請求的時候,會有一個請求頭——User-Agent,它用來標識瀏覽器的類型。當我們使用requests來發送請求的時候,默認的User-Agent是python-requests/2.8.1。如此我們嘗試將User-Agent偽裝成瀏覽器。我們通過手動指定User-Agent為Chrome瀏覽器(F12–>Network中查看),再次訪問得到網頁源碼。
我們使用了beautifulsoup來分析網頁源碼, 創建bs對象soup,并使用解析器html.parser來解析源碼。 按F12–>Element查看網頁源碼,發現<div class='indent'>
標簽下存在歌單(table標簽); 用for循環獲取所有table,并對每一個table進行分析;
在<div, class='pl2'>
標簽下的<a>
標簽下發現歌名,
用此detail.find('a').getText()
函數獲取a標簽下的文字內容,并添加到列表中music_name_list.append(music_name)
,再把列表的元素寫進文件就可以了。
注: BeautifulSoup中的find和findAll用法相同,不同之處為find返回的是findAll搜索值的第一個值。
next_page是為了讓程序能夠翻頁,next_page['href']
,獲取下一頁url,通過while循環來反復訪問,進而可以獲取完整歌單。
最后,完整程序代碼如下:
#!/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))新聞熱點
疑難解答