1. 程式人生 > >筆記:《Python網路爬蟲》

筆記:《Python網路爬蟲》

 引自:《手把手教你寫網路爬蟲

頁面資料提取

簡單的text文字提取

通過 F12, Ctrl+Shift+C 快捷鍵從網頁中直接抓取資料

程式碼如下:

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://jr.jd.com")
html_content = html.read()
html.close()  # 關閉url

# 利用bs4解析html文字
bsoup = BeautifulSoup(html_content, "
html.parser") # 解析全部class="nav-item-primary"的<a>標籤 bs_elem_set = bsoup.find_all("a", "nav-item-primary") # <class 'bs4.element.ResultSet'> for elem_tag in bs_elem_set: # print(type(elem_tag)) # <class 'bs4.element.Tag'> print("Debug::title_elem -->> ", elem_tag.get_text())

測試結果:

動態網頁的資料提取

案例:我們想從網易歌單 https://music.163.com/#/discover/playlist 中查詢播放次數超過500萬的全部歌單,查詢關鍵字

但事實上,通過 <span class="nb">29135</span> 我們什麼也沒有提取到……

從網頁原始碼中我們可以知道,該網頁通過javascript動態更新資料,我們得到的 nb=29135 資料行在 urlopen() 時尚未被js程式碼更新……

用Python 解決這個問題只有兩種途徑:

  • 直接從 JavaScript 程式碼裡採集內容;
  • 或者用 Python 的第三方庫執行 JavaScript,直接採集你在瀏覽器裡看到的頁面。

通過 Selenium 執行Js指令碼,模擬瀏覽器載入動態網頁。程式碼如下:

from selenium import webdriver

browser = webdriver.PhantomJS()  # deprecated... replace by webdriver.Chrome() or Firefox()
browser.get("https://music.163.com/#/discover/playlist")

browser.switch_to.frame("contentFrame")
list_elems = browser.find_element_by_id("m-pl-container")\
                    .find_elements_by_tag_name("li")

for elem in list_elems:
    # print(type(elem))  # <class 'selenium.webdriver.remote.webelement.WebElement'>
    str_nb = elem.find_element_by_class_name("nb").text
    print(str_nb)  # I don't care the name, but just print the <nb>

browser.close()

首先需要 pip3 install selenium 模組;載入動態網頁用的是 Headless 的 PhantomJS 瀏覽器,需要單獨安裝:choco install PhantomJS。

ps:最新版本的 selenium 棄用了 PhantomJS,呃...不過忽略那個報警,我們這裡還是可以繼續執行的。

PhantomJS