Python Beautifulsoup4 爬取網(wǎng)頁

爬取網(wǎng)頁數(shù)據(jù)簡單學(xué)習(xí)

一、安裝解析庫

#安裝requests網(wǎng)絡(luò)請求庫
pip install requests

#安裝bs4解析庫
pip install beautifulsoup4

#安裝html解析器
pip install lxml

#安裝xlutils3檬嘀、xlwt 2選1
pip install xlutils3
pip install xlwt

二倒彰、打開網(wǎng)頁疟游,獲取網(wǎng)頁內(nèi)容

#以get方式打開網(wǎng)頁呼畸,獲取html頁面內(nèi)容
htmlCon=requests.get(dataurl)
#按實際網(wǎng)頁設(shè)置編碼格式
htmlCon.encoding="UTF-8"
#bs4以lxml解析器網(wǎng)頁整體內(nèi)容
soup = BeautifulSoup(htmlCon.text, 'lxml')

三、按網(wǎng)頁實際標(biāo)簽進行解析

根據(jù)標(biāo)簽名查找

soup.a 只能查找得到第一個符合要求的節(jié)點,是一個對象颁虐,bs4自己封裝類的對象

獲取屬性

soup.a.attrs 獲取得到所有屬性和值蛮原,是一個字典
soup.a.attrs['href'] 獲取指定的屬性值
soup.a['href'] 簡寫形式

獲取文本
soup.a.string
soup.a.text
soup.a.get_text()

[注]如果標(biāo)簽里面還有標(biāo)簽,那么string獲取就是空另绩,而后兩個獲取的是純文本內(nèi)容

find_all方法

返回的是一個列表儒陨,列表里面都是節(jié)點對象

soup.find_all('a', limit=2) #提取符合要求的前兩個a
soup.find_all(['a', 'li']) #查找得到所有的a和li
soup.find_all('a', class_='xxx')#查找得到所有class是xxx的a
soup.find_all('li', class_=re.compile(r'^xiao'))#查找所有的class以xiao開頭的li標(biāo)簽
select方法
  • id選擇器 #dudu
  • 類選擇器 .xixi
  • 標(biāo)簽選擇器 div a h1

eg :
div #dudu .xixi a
空格:代表后面的節(jié)點是前面節(jié)點的子節(jié)點或者子孫節(jié)點
div > #dudu > a > .xixi

四、保存工作表

#新建工作表
workbook=xlwt.Workbook()
#工作表新建一個sheet表格
sheet=workbook.add_sheet(sheet_name,cell_overwrite_ok=True)
style=xlwt.XFStyle()#初始化樣式
sheet.write(rol,col,data)#寫入指定數(shù)據(jù)
workbook.save("xxx.xlsx")#保存

五笋籽、實踐

按類型獲取一個中醫(yī)網(wǎng)頁里的所有頁數(shù)數(shù)據(jù)

import requests
import xlwt
from bs4 import BeautifulSoup

# https://m.cnkang.com/cm/zcy/jry/
url = 'https://m.cnkang.com/'
sort = 1 #網(wǎng)頁頁數(shù)
rol=0 #默認行
types = [] # 網(wǎng)頁分類型# {"sheet. name": "解表藥", "urlPath" :"cm/zcy/jby"}
urlPath = "cm/zcy/jby/"
workbook = xlwt.Workbook() #新建一個工作薄
sheet=None
#獲取網(wǎng)頁不同type種類
def getHtmlType():
    typeCon = soup. select(' #mainNav > li')
    print (typeCon)
    for type in typeCon:
        title = type.find('a').get_text()
        path = type.find("a").get('href')
        typedata={}
        typedata["title"] = str(title)
        typedata["urlPath"] = str(path)
        # print (typedata)
        types.append(typedata)
    print(types)
    return types

#獲取頁數(shù)
def getHtmlSort():
    sortCon = soup. select(' #touch_page > option')
    sort = len(sortCon)
    return sort

#獲取網(wǎng)頁列表數(shù)據(jù)加鍵接
def getHtml():
    #循環(huán)按頁數(shù)構(gòu)造url
    for num in range(sort):
        dataurl= url+urlPath+ "List_"+str(num +1)+ '.html'
        print (dataurl)
        #以get方式打開網(wǎng)頁蹦漠,獲取html頁面內(nèi)容
        htmlCon=requests.get(dataurl)
        #按實際網(wǎng)頁設(shè)置編碼格式
        htmlCon.encoding="UTF-8"
        #bs4以lxml解析器網(wǎng)頁整體內(nèi)容
        soup = BeautifulSoup(htmlCon.text, 'lxml')
        li_list =soup.select('body > div:nth-child(6) > div >a ')
        #循環(huán)進入下一層子集
        data = {}
        dataKey = ["title","content","contentUrl", "imgUrl", "sourceUrl"]
        for li in li_list:
            title =li.find ("dt").get_text()
            content = li.find ("dd").get_text()
            contentUrl = li.get("href") 
            imgUrl = li.find("img").get( "src")
            #print(contentUrl)
            data["title"]=str(title)
            data["content"]=str(content).strip()
            data["contentUrl"]=str(url+contentUrl)
            data["imgUrl"]=str(imgUrl)
            data["sourceUrl"]=str(dataurl)
            setDataBeau(data,dataKey)

def  setDataBeau(data,dataKey):
        global rol
        rol=rol+1
        for num in range(len(data)):
            sheet.write(rol,num,data.get(dataKey[num]))


if __name__ == '__main__':
        dataurl= url+urlPath
        htmlCon=requests.get(dataurl)
        #按實際網(wǎng)頁設(shè)置編碼格式
        htmlCon.encoding="UTF-8"
        #bs4以lxml解析器網(wǎng)頁整體內(nèi)容
        soup = BeautifulSoup(htmlCon.text, 'lxml')
        types=getHtmlType()  
        for index in range(len(types)):
            type= types[ index]
            urlPath = type.get("urlPath")
            sheet_name = type.get("title")
            if sheet_name =="展開":
                break;
            sheet=workbook.add_sheet(sheet_name,cell_overwrite_ok=True)
            style=xlwt.XFStyle()#初始化樣式
            heads =['名稱','簡介','詳情','封面','來源']
            for head in range(len(heads)):
                sheet.write(0,head,heads[head])
            dataurl=url+urlPath
            print (dataurl)
            htmlCon=requests.get(dataurl)
            #按實際網(wǎng)頁設(shè)置編碼格式
            htmlCon.encoding="UTF-8"
            #bs4以lxml解析器網(wǎng)頁整體內(nèi)容
            soup = BeautifulSoup(htmlCon.text, 'lxml')
            #獲取頁數(shù)
            sort= getHtmlSort()
            getHtml()
            rol = 0
        workbook.save('ZY.xlsx')

六、進步需解決的問題

問題:因為有些分類再頁面是隱藏屬性车海,是需要通過點擊觸發(fā)js后才能查看

例圖

解決辦法:
方法1笛园、腳本中固定寫死這些隱藏的分類
方法2、通過selenium獲取網(wǎng)頁數(shù)據(jù)侍芝,再賦值給bs4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末研铆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子州叠,更是在濱河造成了極大的恐慌棵红,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咧栗,死亡現(xiàn)場離奇詭異逆甜,居然都是意外死亡,警方通過查閱死者的電腦和手機楼熄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門忆绰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浩峡,“玉大人可岂,你說我怎么就攤上這事『苍郑” “怎么了缕粹?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纸淮。 經(jīng)常有香客問我平斩,道長,這世上最難降的妖魔是什么咽块? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任绘面,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揭璃。我一直安慰自己晚凿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布瘦馍。 她就那樣靜靜地躺著歼秽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪情组。 梳的紋絲不亂的頭發(fā)上燥筷,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音院崇,去河邊找鬼肆氓。 笑死,一個胖子當(dāng)著我的面吹牛底瓣,可吹牛的內(nèi)容都是我干的做院。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼濒持,長吁一口氣:“原來是場噩夢啊……” “哼键耕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柑营,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤屈雄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后官套,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酒奶,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年奶赔,在試婚紗的時候發(fā)現(xiàn)自己被綠了惋嚎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡站刑,死狀恐怖另伍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绞旅,我是刑警寧澤摆尝,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站因悲,受9級特大地震影響堕汞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晃琳,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一讯检、第九天 我趴在偏房一處隱蔽的房頂上張望琐鲁。 院中可真熱鬧,春花似錦人灼、人聲如沸绣否。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒜撮。三九已至,卻和暖如春跪呈,著一層夾襖步出監(jiān)牢的瞬間段磨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工耗绿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苹支,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓误阻,卻偏偏與公主長得像债蜜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子究反,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容