在上次的爬蟲中,抓取的數(shù)據(jù)主要用到的是第三方的Beautifulsoup庫,然后對每一個具體的數(shù)據(jù)在網(wǎng)頁中的selecter來找到它,每一個類別便有一個select方法。對網(wǎng)頁有過接觸的都知道很多有用的數(shù)據(jù)都放在一個共同的父節(jié)點上,只是其子節(jié)點不同。在上次爬蟲中,每一類數(shù)據(jù)都要從其父類(包括其父節(jié)點的父節(jié)點)上往下尋找ROI數(shù)據(jù)所在的子節(jié)點,這樣就會使爬蟲很臃腫,因為很多數(shù)據(jù)有相同的父節(jié)點,每次都要重復(fù)的找到這個父節(jié)點。這樣的爬蟲效率很低。
因此,筆者在上次的基礎(chǔ)上,改進了一下爬取的策略,筆者以實例來描述。
如圖,筆者此次爬取的是百度音樂的頁面,所爬取的類容是上面榜單下的所有內(nèi)容(歌曲名,歌手,排名)。如果按照上次的爬蟲的方法便要寫上三個select方法,分別抓取歌曲名,歌手,排名,但筆者觀察得知這三項數(shù)據(jù)皆放在一個li標簽內(nèi),如圖:
這樣我們是不是直接抓取ul標簽,再分析其中的數(shù)據(jù)便可得到全部數(shù)據(jù)了?答案是,當(dāng)然可以。
但Beaufulsoup不能直接提供這樣的方法,但Python無所不能,python里面自帶的re模塊是我見過最迷人的模塊之一。它能在字符串中找到我們讓我們roi的區(qū)域,上述的li標簽中包含了我們需要的歌曲名,歌手,排名數(shù)據(jù),我們只需要在li標簽中通過re.findall()方法,便可找到我們需要的數(shù)據(jù)。這樣就能夠大大提升我們爬蟲的效率。
我們先來直接分析代碼:
def parse_one_page(html):
soup = BeautifulSoup(html, 'lxml')
data = soup.select('div.ranklist-wrapper.clearfix div.bd ul.song-list li')
pattern1 = re.compile(r'
上面的代碼是我分析網(wǎng)頁數(shù)據(jù)的全部代碼,這里不得不說python語言的魅力,數(shù)十行代碼便能完成java100行的任務(wù),C/C++1000行的任務(wù)。上述函數(shù)中,筆者首先通過Beautifulsoup得到該網(wǎng)頁的源代碼,再通過select()方法得到所有l(wèi)i標簽中的數(shù)據(jù)。
到這里,這個爬蟲便要進入到最重要的環(huán)節(jié)了,相信很多不懂re模塊的童靴們有點慌張,在這里筆者真的是強烈推薦對python有興趣的童靴們一定要學(xué)習(xí)這個非常重要的一環(huán)。首先,我們知道re的方法大多只針對string型數(shù)據(jù),因此我們調(diào)用str()方法將每個list中的數(shù)據(jù)(即item)轉(zhuǎn)換為string型。然后便是定義re的pattern了,這是個稍顯復(fù)雜的東西,其中主要用到re.compile()函數(shù)得到要在string中配對的pattern,這里筆者便不累述了,感興趣的童靴可以去網(wǎng)上查閱一下資料。
上述代碼中,筆者寫了兩個pattern,因為百度音樂的網(wǎng)頁里,li標簽有兩個結(jié)構(gòu),當(dāng)用一個pattern在li中找不到數(shù)據(jù)時,便使用另一個pattern。關(guān)于re.findadd()方法,它會返回一個list,里面裝著tuple,但其實我們知道我們找到的數(shù)據(jù)就是list[0],再將每個數(shù)據(jù)添加到另一個List中,讓函數(shù)返回。
相信很多看到這里的小伙伴已經(jīng)云里霧里,無奈筆者對re板塊也知道的不多,對python感興趣的同學(xué)可以查閱相關(guān)資料再來看一下代碼,相信能夠如魚得水。
完整的代碼如下:
import requests
from bs4 import BeautifulSoup
import re
def get_one_page(url):
wb_data = requests.get(url)
wb_data.encoding = wb_data.apparent_encoding
if wb_data.status_code == 200:
return wb_data.text
else:
return None
def parse_one_page(html):
soup = BeautifulSoup(html, 'lxml')
data = soup.select('div.ranklist-wrapper.clearfix div.bd ul.song-list li')
pattern1 = re.compile(r'
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

