【編者按】本文作者為 Blog Bowl 聯(lián)合創(chuàng)始人 Shaumik Daityari,主要介紹 Web 抓取技術(shù)的基本實(shí)現(xiàn)原理和方法,。文章系國內(nèi) ITOM 管理平臺(tái) OneAPM 編譯呈現(xiàn),,以下為正文。 隨著電子商務(wù)的蓬勃發(fā)展,筆者近年越來越著迷于比價(jià)應(yīng)用,。我在網(wǎng)絡(luò)上(甚至線下)的每次購買,,都是在各大電商網(wǎng)站深入調(diào)研后的結(jié)果。 筆者常用的比價(jià)應(yīng)用包括:RedLaser, ShopSavvy 以及 BuyHatke,。這些應(yīng)用有效提高了價(jià)格透明度,,進(jìn)而為消費(fèi)者節(jié)省了可觀的時(shí)間。 但是,,你是否想過,,這些應(yīng)用如何得到那些重要數(shù)據(jù)?通常,,它們會(huì)借助 Web 抓取技術(shù)來完成該任務(wù),。 Web 抓取的定義 Web 抓取是抽取網(wǎng)絡(luò)數(shù)據(jù)的過程。只要借助合適的工具,,任何你能看到的數(shù)據(jù)都可以進(jìn)行抽取,。在本文中,我們將重點(diǎn)介紹自動(dòng)化抽取過程的程序,,幫助你在較短時(shí)間內(nèi)收集大量數(shù)據(jù),。除了筆者前文提到的用例,抓取技術(shù)的用途還包括:SEO 追蹤,、工作追蹤,、新聞分析以及筆者的最愛——社交媒體的情感分析! 一點(diǎn)提醒 在開啟 Web 抓取的探險(xiǎn)之前,,請確保自己了解相關(guān)的法律問題,。許多網(wǎng)站在其服務(wù)條款中明確禁止對其內(nèi)容進(jìn)行抓取。例如,,Medium 網(wǎng)站就寫道:“遵照網(wǎng)站 robots.txt 文件中的規(guī)定進(jìn)行的爬取操作(Crawling)是可接受的,,但是我們禁止抓取(Scraping)操作?!睂Σ辉试S抓取的網(wǎng)站進(jìn)行抓取可能會(huì)使你進(jìn)入他們的黑名單,!與任何工具一樣,,Web 抓取也可能用于復(fù)制網(wǎng)站內(nèi)容之類的不良目的。此外,,由 Web 抓取引起的法律訴訟也不在少數(shù),。 設(shè)置代碼 在充分了解小心行事的必要之后,讓我們開始學(xué)習(xí) Web 抓取,。其實(shí),,Web 抓取可以通過任何編程語言實(shí)現(xiàn),在不久之前,,我們使用 Node 實(shí)現(xiàn)過,。在本文中,考慮到其簡潔性與豐富的包支持,,我們將使用Python 實(shí)現(xiàn)抓取程序,。 Web 抓取的基本過程 當(dāng)你打開網(wǎng)絡(luò)中的某個(gè)站點(diǎn)時(shí),就會(huì)下載其 HTML 代碼,,由你的 web 瀏覽器對其進(jìn)行分析與展示,。該 HTML 代碼包含了你所看到的所有信息。因此,,通過分析 HTML 代碼就能得到所需信息(比如價(jià)格),。你可以使用正則表達(dá)式在數(shù)據(jù)海洋中搜索你需要的信息,也可以使用函數(shù)庫來解釋 HTML,,同樣也能得到需要數(shù)據(jù),。 在 Python 中,我們將使用一個(gè)名為靚湯(Beautiful Soup)的模塊對 HTML 數(shù)據(jù)進(jìn)行分析,。你可以借助 pip 之類的安裝程序安裝之,,運(yùn)行如下代碼即可: pip install beautifulsoup4 或者,你也可以根據(jù)源碼進(jìn)行構(gòu)建,。在該模塊的文檔說明頁,,可以看到詳細(xì)的安裝步驟。 安裝完成之后,,我們大致會(huì)遵循以下步驟實(shí)現(xiàn) web 抓?。?/p>
作為演示,我們將使用筆者的博客 前兩個(gè)步驟相對簡單,,可以這樣完成: from urllib import urlopen#Sending the http requestwebpage = urlopen('http://my_website.com/').read() 接下來,,將響應(yīng)傳給之前安裝的模塊: from bs4 import BeautifulSoup#making the soup! yummy ;)soup = BeautifulSoup(webpage, "html5lib") 請注意,,此處我們選擇了 解析 HTML 在將 HTML 傳給 BeautifulSoup 之后,,我們可以嘗試一些指令。譬如,,檢查 HTML 標(biāo)記代碼是否正確,,可以驗(yàn)證該頁面的標(biāo)題(在 Python 解釋器中): >>> soup.title<title>Transcendental Tech Talk</title>>>> soup.title.text u'Transcendental Tech Talk' >>> 接下來,開始抽取頁面中的特定元素,。譬如,,我想抽取博客中文章標(biāo)題的列表。為此,,我需要分析 HTML 的結(jié)構(gòu),,這一點(diǎn)可以借助 Chrome 檢查器完成。其他瀏覽器也提供了類似的工具,。 http://dada./2015/09/i-got-published.html http://dada./2014/12/how-to-use-requestput-or-requestdelete.html http://dada./2014/12/zico-isl-and-atk.html...>>> BeautifulSoup 內(nèi)置了許多方法,,可以幫助你玩轉(zhuǎn) HTML。其中一些方法列舉如下: >>> titles[0].contents [u'\n', <a href="http://dada./2015/09/kolkata-bergerxp-indiblogger-meet.html">Kolkata #BergerXP IndiBlogger meet, Marketing Insights, and some Blogging Tips</a>, u'\n']>>> 請注意,,你也可以使用 >>> titles[0].parent<div class="post hentry uncustomized-post-template">\n<a name="6501973351448547458"></a>\n<h3 class="post-title entry-title">\n<a href="http://dada./2015/09/kolkata-bergerxp-indiblogger-meet.html">Kolkata #BergerXP IndiBlogger ... >>> 你也可以使用正則表達(dá)式搜索 CSS 類,對此,,本文檔有詳細(xì)的介紹,。 使用 Mechanize 模擬登錄 目前為止,我們做的只是下載一個(gè)頁面進(jìn)而分析其內(nèi)容,。然而,web 開發(fā)者可能屏蔽了非瀏覽器發(fā)出的請求,,或者有些網(wǎng)站內(nèi)容只能在登錄之后讀取,。那么,我們該如何處理這些情況呢,? 對于第一種情況,,我們需要在向頁面發(fā)送請求時(shí)模擬一個(gè)瀏覽器。每個(gè) HTTP 請求都包含一些相關(guān)的數(shù)據(jù)頭(header),其中包含了訪客瀏覽器,、操作系統(tǒng)以及屏幕大小之類的信息,。我們可以改變這些數(shù)據(jù)頭,偽裝為瀏覽器發(fā)送請求,。 至于第二種情況,,為了訪問帶有訪客限制的內(nèi)容,,我們需要登錄該網(wǎng)站,,使用 cookie 保持會(huì)話。下面,,讓我們來看看在偽裝成瀏覽器的同時(shí),,如何完成這一點(diǎn),。 我們將借助 我們會(huì)通過 Blog Bowl 這個(gè)頁面進(jìn)行登錄,,并訪問通知頁面,。下面的代碼通過行內(nèi)注釋進(jìn)行了解釋: import mechanize import cookielib from urllib import urlopen from bs4 import BeautifulSoup# Cookie Jarcj = cookielib.LWPCookieJar() browser = mechanize.Browser() browser.set_cookiejar(cj) browser.set_handle_robots(False) browser.set_handle_redirect(True)# Solving issue #1 by emulating a browser by adding HTTP headersbrowser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]# Open Login Pagebrowser.open("http:///login/")# Select Login form (1st form of the page)browser.select_form(nr = 0)# Alternate syntax - browser.select_form(name = "form_name")# The first <input> tag of the form is a CSRF token# Setting the 2nd and 3rd tags to email and passwordbrowser.form.set_value("[email protected]", nr=1) browser.form.set_value("password", nr=2)# Logging inresponse = browser.submit()# Opening new page after loginsoup = BeautifulSoup(browser.open('http:///notifications/').read(), "html5lib") 通知頁面的結(jié)構(gòu) # Print notificationsprint soup.find(class_ = "search_results").text 本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。 |