国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

【爬蟲(chóng)二】爬取豆瓣音樂(lè)榜單

2019-11-14 10:32:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友


前言

  借助有效率的工具,可以讓我們更加方便的寫(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í)間。

一、獲取網(wǎng)頁(yè)html

def download_page(url): headers = { 'User-Agent':'查看自己的User-Agent,粘貼到此處' } data = requests.get(url, headers=headers).content return data

  不添加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è)源碼。

二、獲取當(dāng)前頁(yè)歌名

def 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, None

  我們使用了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è)值。

三、翻頁(yè)

  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))

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 澄城县| 黔西县| 石城县| 彭阳县| 米易县| 驻马店市| 中牟县| 巴马| 伊宁市| 仪征市| 安阳县| 贵德县| 南涧| 深水埗区| 陆川县| 郧西县| 原平市| 禄劝| 南京市| 靖西县| 仲巴县| 黑山县| 拉萨市| 斗六市| 宁明县| 盐边县| 仁化县| 柘城县| 紫阳县| 苍梧县| 通江县| 衡东县| 西乌珠穆沁旗| 龙胜| 郑州市| 泸州市| 临湘市| 郑州市| 桦甸市| 司法| 中江县|