GitHub上3k+star的python爬蟲庫你了解嗎?詳解MechanicalSoup爬蟲庫

  • 2020 年 2 月 21 日
  • 筆記

說在前面:

今日次條推文是JS逆向加密連載內容,希望在JS逆向加密技術路上更牛逼。

第三條推文是推薦一個零資金投入的副業,幫助大家在當下特殊情況搞一點收入.

第四條是上周推文送書中獎資訊公布,最近打卡比較多的朋友留意哈,大概率中獎了。

開始正文:

提起python爬蟲,大家想起的是requests還是bf4或者是scrapy?但是有一款爬蟲庫在GitHub上已經拿了3k+的小星星,那就是MechanicalSoup

本文將從以下幾個維度講解這個爬蟲包:

  • MechanicalSoup有什麼特點
  • MechanicalSoup適合在哪些場景用
  • 程式碼詳解MechanicalSoup的工作流程

MechanicalSoup介紹

MechanicalSoup不僅僅像一般的爬蟲包一樣可以從網站上爬取數據,而且可以通過簡單的命令來自動化實現與網站交互的python庫。它的底層使用的是BeautifulSoup(也就是bs4)和requests庫,因此如果各位讀者熟悉以上兩個庫,那麼使用起來會更加的順手。

因此,如果在開發過程中需要不斷的與網站進行交互,比如點擊按鈕或者是填寫表單,那麼MechanicalSoup將會派上很大的用場。接下來,讓我們直接用程式碼展示這個神奇的爬蟲包是怎樣工作的。

MechanicalSoup安裝

#直接安裝pip install mechanicalsoup#從GitHub上下載並安裝開發版本pip install git+https://github.com/MechanicalSoup/MechanicalSoup

程式碼詳解MechanicalSoup

我們將分兩個案例詳解是怎樣通過MechanicalSoup實現網頁內容獲取和網站交互,首先看第一個爬取虎撲熱帖

我們先打開虎撲社區首頁,可以看到有幾個帖子是紅色標題,現在想把這幾個帖子的標題爬下來並保存。首先創建一個瀏覽器實例:

import mechanicalsoup  browser = mechanicalsoup.StatefulBrowser()

現在我么在瀏覽器的實例中打開虎撲bbs的網站,提示200表示OK訪問成功

browser.open('https://bbs.hupu.com/')<Response [200]>

我們的瀏覽器實例現在位於虎撲bbs主頁。現在,我們需要獲取該頁面上存在的文章列表。這部分有點棘手,因為我們需要唯一地標識包含文章列表的標籤的屬性。但是,藉助Chrome之類的瀏覽器可以輕鬆完成此操作:

我們通過檢查元素髮現發現它位於ul標籤內,而這個ul標籤在一個clss為list的div裡面,然後進一步檢查發現熱帖的clss="red",這樣我們就可以利用類似bs4的方法找到我們需要的文章標題。

result = browser.get_current_page().find('div', class_="list")  result= list(result.find('ul'))  bbs_list =[]for i in range(len(result)):      if result[i] != 'n':          bbs_list.append(result[i])  bbs_top = []for i in bbs_list:      bbs_top.append(i.find('span',class_="red"))  bbs_top

看下結果,已經成功將帶有標籤的標題保存,接下來只要用.text就可以取出標題。

[<span class="red">唱的讓人心碎,珍妮弗-哈德森賽前獻唱,For Kobe and Gigi</span>,   <span class="red">[字幕]魔術師致敬科比斯特恩:斯特恩是我救命恩人,科比這樣的球員永遠不會再有</span>,   <span class="red">[流言板]Mambas Forever!如果1月27日能夠重來,也許......</span>,   <span class="red">今天比賽不管誰贏,mamba never out</span>,   None,   None,   None,   None,   None,   None]

再看下一個例子, mechanicalsoup是怎樣與網站進行交互。這次我們選擇一個更簡單的例子,使用mechanicalsoup來進行百度搜索

和之前的操作一樣,我們先在瀏覽器創建實例並打開百度首頁。

import mechanicalsoup  browser = mechanicalsoup.StatefulBrowser()browser.open('https://www.baidu.com/')<Response [200]>

看到響應成功之後,我們再來提取一下需要提交的表單

browser.select_form()  browser.get_current_form().print_summary()<input name="bdorz_come" type="hidden" value="1"/><input name="ie" type="hidden" value="utf-8"/><input name="f" type="hidden" value="8"/><input name="rsv_bp" type="hidden" value="1"/><input name="rsv_idx" type="hidden" value="1"/><input name="tn" type="hidden" value="baidu"/><input autocomplete="off" autofocus="autofocus" class="s_ipt" id="kw" maxlength="255" name="wd" value=""/><input autofocus="" class="bg s_btn" id="su" type="submit" value="百度一下"/>

可以看到需要填充的表單就是倒數第二行的內容,於是我們可以按照以下方法填充

browser["wd"] = '早起python'

然後可以用下面的命令打開一個與原始網頁內容相同的本地網頁,並在表格中填充我們提供的值。

browser.launch_browser()

可以看到,搜索框內已經填好了需要搜索的內容,接下來只需要讓我們創建出來的瀏覽器幫我們點擊一下就行,執行:

browser.submit_selected()<Response [200]>

返回200代表相應成功,一次模擬點擊就實現了。接下來通過browser.get_current_page()就可以查看到返回的頁面內容了!

結束語

上面兩個例子雖然簡單,但是這就是mechanicalsoup的基本工作套路:先創建一個瀏覽器實例,然後通過這個瀏覽器去幫你執行你想要的相關操作,甚至還可以在提交之前打開一個本地的可視化頁面預覽你即將提交的表單內容!還等什麼,抓緊去試試吧!

【完】