BeautifulSoup requests 爬蟲初體驗

BeautifulSoup requests 爬蟲初體驗


說爬蟲不得不提python

常用的Python爬蟲庫(摘自知乎hunt zhan)

  • Beautiful Soup。名氣大,整合了一些常用爬蟲需求。缺點:不能加載JS。
  • Scrapy??雌饋砗軓姶蟮呐老x框架,可以滿足簡單的頁面爬?。ū热缈梢悦鞔_獲知url pattern的情況)。用這個框架可以輕松爬下來如亞馬遜商品信息之類的數(shù)據(jù)。但是對于稍微復(fù)雜一點的頁面,如weibo的頁面信息,這個框架就滿足不了需求了。
  • mechanize。優(yōu)點:可以加載JS。缺點:文檔嚴重缺失。不過通過官方的example以及人肉嘗試的方法,還是勉強能用的。
  • selenium。這是一個調(diào)用瀏覽器的driver,通過這個庫你可以直接調(diào)用瀏覽器完成某些操作,比如輸入驗證碼。
  • cola。一個分布式爬蟲框架。項目整體設(shè)計有點糟,模塊間耦合度較高,不過值得借鑒。

Beautiful Soup 網(wǎng)頁解析還是非常簡單粗暴的(配合requests)基本的爬取沒有任何問題

在這個數(shù)據(jù)稱王的時代,沒有數(shù)據(jù)對于內(nèi)容性產(chǎn)品而言無疑是半條腿走路。(雖說這樣做有些不要臉,但是沒有辦法,一些公開無版權(quán)的內(nèi)容信息誘惑力太大,如果人工摘取工作量太復(fù)雜)

廢話少說,劈柴

1.安裝庫
pip install beautifulsoup4
pip install requests
  • 安裝解析器
pip install lxml
解析器 使用方法 優(yōu)勢 劣勢
Python標(biāo)準庫 BeautifulSoup(markup, "html.parser") Python的內(nèi)置標(biāo)準庫執(zhí)行速度適中文檔容錯能力強 Python 2.7.3 or 3.2.2)前 的版本中文檔容錯能力差
lxml HTML 解析器 BeautifulSoup(markup, "lxml") 速度快文檔容錯能力強 需要安裝C語言庫
lxml XML 解析器 BeautifulSoup(markup, ["lxml-xml"])``BeautifulSoup(markup, "xml") 速度快唯一支持XML的解析器 需要安裝C語言庫
html5lib BeautifulSoup(markup, "html5lib") 最好的容錯性以瀏覽器的方式解析文檔生成HTML5格式的文檔 速度慢不依賴外部擴展
2.具體步驟
st=>start: 使用requests請求到網(wǎng)頁html
op1=>operation: 使用beautifulsoup4加載這個html
op2=>operation: 解析搜索網(wǎng)頁可用元素
op3=>operation: 取出元素的內(nèi)容
op4=>operation: 處理數(shù)據(jù)
e=>end: 存庫

st->op1->op2->op3->op4->e
3.常用操作
# 加載網(wǎng)頁對象,使用lxml解析庫
soup = BeautifulSoup(html, 'lxml')

# 獲取class為more的標(biāo)簽
bp = soup.find_all(attrs={"class": 'more'})

# 獲取<main></main>標(biāo)簽
bp = soup.main

# 查找所有p標(biāo)簽
p = soup.find_all('p')

# 使用正則匹配(含有data-number屬性并且值為數(shù)字的)
soup.find_all(attrs={"data-number": re.compile("^[0-9]*$")})

# 獲取main標(biāo)簽下的所有子標(biāo)簽
as = soup.main.descendants

# 遍歷子標(biāo)簽
for child in as:
    # 判斷子標(biāo)簽是否為tag(因為只有tag才能繼續(xù)查找,NavigableString只是一個字符串)
    if isinstance(child, Tag):
        # 如果標(biāo)簽是span標(biāo)簽并且含有id屬性且id屬性的值為counter且內(nèi)容不為空
        if child.name == 'span' and 'id' in child.attrs and child['id'] == 'counter' and child.string:
            # 取出該標(biāo)簽下一個兄弟標(biāo)簽的第一個子標(biāo)簽的內(nèi)容
            # .contents 和 .children
            # tag的 .contents 屬性可以將tag的子節(jié)點以列表的方式輸出:
            child.next_sibling.contents[0].string
            
# 獲取所有子標(biāo)簽的內(nèi)容并過濾空內(nèi)容
for string in soup.main.stripped_strings:
    print(string)

# 父標(biāo)簽
child.parent
# .next_sibling 和 .previous_sibling 分別是下一個兄弟標(biāo)簽和上一個兄弟標(biāo)簽

# 如果要去屬性值可以直接使用
child['src']

熟悉以上操作就可以很方便的爬取html純數(shù)據(jù)網(wǎng)頁,你值得擁有!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容