摘要:許多網站在其服務條款中明確禁止對其內容進行抓取。此外,由抓取引起的法律訴訟也不在少數。在本文中,考慮到其簡潔性與豐富的包支持,我們將使用實現抓取程序。在中,我們將使用一個名為靚湯的模塊對數據進行分析。
【編者按】本文作者為 Blog Bowl 聯合創始人 Shaumik Daityari,主要介紹 Web 抓取技術的基本實現原理和方法。文章系國內 ITOM 管理平臺 OneAPM 編譯呈現,以下為正文。
隨著電子商務的蓬勃發展,筆者近年越來越著迷于比價應用。我在網絡上(甚至線下)的每次購買,都是在各大電商網站深入調研后的結果。
筆者常用的比價應用包括:RedLaser, ShopSavvy 以及 BuyHatke。這些應用有效提高了價格透明度,進而為消費者節省了可觀的時間。
但是,你是否想過,這些應用如何得到那些重要數據?通常,它們會借助 Web 抓取技術來完成該任務。
Web 抓取的定義Web 抓取是抽取網絡數據的過程。只要借助合適的工具,任何你能看到的數據都可以進行抽取。在本文中,我們將重點介紹自動化抽取過程的程序,幫助你在較短時間內收集大量數據。除了筆者前文提到的用例,抓取技術的用途還包括:SEO 追蹤、工作追蹤、新聞分析以及筆者的最愛——社交媒體的情感分析!
一點提醒在開啟 Web 抓取的探險之前,請確保自己了解相關的法律問題。許多網站在其服務條款中明確禁止對其內容進行抓取。例如,Medium 網站就寫道:“遵照網站 robots.txt 文件中的規定進行的爬取操作(Crawling)是可接受的,但是我們禁止抓取(Scraping)操作。”對不允許抓取的網站進行抓取可能會使你進入他們的黑名單!與任何工具一樣,Web 抓取也可能用于復制網站內容之類的不良目的。此外,由 Web 抓取引起的法律訴訟也不在少數。
設置代碼在充分了解小心行事的必要之后,讓我們開始學習 Web 抓取。其實,Web 抓取可以通過任何編程語言實現,在不久之前,我們使用 Node 實現過。在本文中,考慮到其簡潔性與豐富的包支持,我們將使用 Python 實現抓取程序。
Web 抓取的基本過程當你打開網絡中的某個站點時,就會下載其 HTML 代碼,由你的 web 瀏覽器對其進行分析與展示。該 HTML 代碼包含了你所看到的所有信息。因此,通過分析 HTML 代碼就能得到所需信息(比如價格)。你可以使用正則表達式在數據海洋中搜索你需要的信息,也可以使用函數庫來解釋 HTML,同樣也能得到需要數據。
在 Python 中,我們將使用一個名為靚湯(Beautiful Soup)的模塊對 HTML 數據進行分析。你可以借助 pip 之類的安裝程序安裝之,運行如下代碼即可:
pip install beautifulsoup4
或者,你也可以根據源碼進行構建。在該模塊的文檔說明頁,可以看到詳細的安裝步驟。
安裝完成之后,我們大致會遵循以下步驟實現 web 抓取:
向 URL 發送請求
接收響應
分析響應以尋找所需數據
作為演示,我們將使用筆者的博客 http://dada.theblogbowl.in/. 作為目標 URL。
前兩個步驟相對簡單,可以這樣完成:
from urllib import urlopen#Sending the http requestwebpage = urlopen("http://my_website.com/").read()
接下來,將響應傳給之前安裝的模塊:
from bs4 import BeautifulSoup#making the soup! yummy ;)soup = BeautifulSoup(webpage, "html5lib")
請注意,此處我們選擇了 html5lib 作為解析器。根據 BeautifulSoup 的文檔,你也可以為其選擇不同的解析器。
解析 HTML在將 HTML 傳給 BeautifulSoup 之后,我們可以嘗試一些指令。譬如,檢查 HTML 標記代碼是否正確,可以驗證該頁面的標題(在 Python 解釋器中):
>>> soup.titleTranscendental Tech Talk >>> soup.title.text u"Transcendental Tech Talk" >>>
接下來,開始抽取頁面中的特定元素。譬如,我想抽取博客中文章標題的列表。為此,我需要分析 HTML 的結構,這一點可以借助 Chrome 檢查器完成。其他瀏覽器也提供了類似的工具。
使用 Chrome 檢查器檢查某個頁面的 HTML 結構
如你所見,所有文章標題都帶有 h3 標簽與兩個類屬性:post-title 與 entry-title 類。因此,用 post-title 類搜索所有 h3 元素就能得到該頁的文章標題列表。在此例中,我們使用 BeautifulSoup 提供的 find_all 函數,并通過 class_ 參數確定所需的類:
>>> titles = soup.find_all("h3", class_ = "post-title") #Getting all titles>>> titles[0].textu" Kolkata #BergerXP IndiBlogger meet, Marketing Insights, and some Blogging Tips ">>>
只通過 post-title 類進行條目搜索應該可以得到相同的結果:
>>> titles = soup.find_all(class_ = "post-title") #Getting all items with class post-title>>> titles[0].textu" Kolkata #BergerXP IndiBlogger meet, Marketing Insights, and some Blogging Tips ">>>
如果你想進一步了解條目所指的鏈接,可以運行下面的代碼:
>>> for title in titles:... # Each title is in the form ofPost Title
... print title.find("a").get("href")...http://dada.theblogbowl.in/2015/09/kolkata-bergerxp-indiblogger-meet.html http://dada.theblogbowl.in/2015/09/i-got-published.html http://dada.theblogbowl.in/2014/12/how-to-use-requestput-or-requestdelete.html http://dada.theblogbowl.in/2014/12/zico-isl-and-atk.html...>>>
BeautifulSoup 內置了許多方法,可以幫助你玩轉 HTML。其中一些方法列舉如下:
>>> titles[0].contents [u" ", Kolkata #BergerXP IndiBlogger meet, Marketing Insights, and some Blogging Tips, u" "]>>>
請注意,你也可以使用 children 屬性,不過它有點像生成器:
>>> titles[0].parentKolkata #BergerXP IndiBlogger ... >>>
你也可以使用正則表達式搜索 CSS 類,對此,本文檔有詳細的介紹。
使用 Mechanize 模擬登錄目前為止,我們做的只是下載一個頁面進而分析其內容。然而,web 開發者可能屏蔽了非瀏覽器發出的請求,或者有些網站內容只能在登錄之后讀取。那么,我們該如何處理這些情況呢?
對于第一種情況,我們需要在向頁面發送請求時模擬一個瀏覽器。每個 HTTP 請求都包含一些相關的數據頭(header),其中包含了訪客瀏覽器、操作系統以及屏幕大小之類的信息。我們可以改變這些數據頭,偽裝為瀏覽器發送請求。
至于第二種情況,為了訪問帶有訪客限制的內容,我們需要登錄該網站,使用 cookie 保持會話。下面,讓我們來看看在偽裝成瀏覽器的同時,如何完成這一點。
我們將借助 cookielib 模塊使用 cookie 管理會話。此外,我們還將用到 mechanize,后者可以使用 pip 之類的安裝程序進行安裝。
我們會通過 Blog Bowl 這個頁面進行登錄,并訪問通知頁面。下面的代碼通過行內注釋進行了解釋:
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://theblogbowl.in/login/")# Select Login form (1st form of the page)browser.select_form(nr = 0)# Alternate syntax - browser.select_form(name = "form_name")# The first tag of the form is a CSRF token# Setting the 2nd and 3rd tags to email and passwordbrowser.form.set_value("email@example.com", nr=1) browser.form.set_value("password", nr=2)# Logging inresponse = browser.submit()# Opening new page after loginsoup = BeautifulSoup(browser.open("http://theblogbowl.in/notifications/").read(), "html5lib")
通知頁面的結構# Print notificationsprint soup.find(class_ = "search_results").text結語
登錄進通知頁面后的結果許多開發者會告訴你:你在網絡上看到的任何信息都可以被抓取。通過這篇文章,你學會了如何輕松抽取登錄后才能看到的內容。此外,如果你的 IP 遭到了屏蔽,你可以掩蓋自己的 IP 地址(或選用其他地址)。同時,為了看起來像是人類在訪問,你應該在請求之間保留一定的時間間隔。
隨著人們對數據的需求不斷增長,web 抓取(不論原因好壞)技術在未來的應用只會更加廣泛。也因此,理解其原理是相當重要的,不管你是為了有效利用該技術,還是為了免受其坑害。
OneAPM 能幫您查看 Python 應用程序的方方面面,不僅能夠監控終端的用戶體驗,還能監控服務器性能,同時還支持追蹤數據庫、第三方 API 和 Web 服務器的各種問題。想閱讀更多技術文章,請訪問 OneAPM 官方技術博客。
本文轉自 OneAPM 官方博客
原文地址:https://www.sitepoint.com/web-scraping-for-beginners/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37985.html
摘要:上一篇文章手把手教你如何用構建技術文章聚合平臺一介紹了如何使用搭建的運行環境,并且將與集成,對掘金進行技術文章的抓取,最后可以查看抓取結果。本篇文章將繼續講解如何利用編寫一個精簡的聚合平臺,將抓取好的文章內容展示出來。 上一篇文章《手把手教你如何用Crawlab構建技術文章聚合平臺(一)》介紹了如何使用搭建Crawlab的運行環境,并且將Puppeteer與Crawlab集成,對掘金、...
摘要:比如分鐘破譯朋友圈測試小游戲文章里用的方法但有些根本就沒有提供網頁端,比如今年火得不行的抖音。所以常用的方式就是通過在電腦上裝一些抓包軟件,將手機上的網絡請求全部顯示出來。總結下,重點是的抓取,關鍵是配置代理證書,難點是對請求的分析。 爬蟲的案例我們已講得太多。不過幾乎都是 網頁爬蟲 。即使有些手機才能訪問的網站,我們也可以通過 Chrome 開發者工具 的 手機模擬 功能來訪問,以便...
摘要:在這之前,還是有必要對一些概念超輕量級反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標配系統。 爬蟲修煉之道——從網頁中提取結構化數據并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個爬取多頁面的網絡爬蟲主要講解了如何使用python編寫一個可以下載多頁面的爬蟲,如何將相對URL轉為絕對URL,如何限速,...
摘要:前言開發爬蟲是一件有趣的事情。的可配置爬蟲是基于的,因此天生是支持并發的。遵守協議這個默認是開啟的。的可配置爬蟲降低了爬蟲的開發時間,增加了爬蟲開發效率,完善了工程化水平,將爬蟲工程師從日常的繁瑣配置工作中解放出來。 前言 開發爬蟲是一件有趣的事情。寫一個程序,對感興趣的目標網站發起HTTP請求,獲取HTML,解析HTML,提取數據,將數據保存到數據庫或者存為CSV、JSON等格式,再...
摘要:前言開發爬蟲是一件有趣的事情。的可配置爬蟲是基于的,因此天生是支持并發的。的可配置爬蟲降低了爬蟲的開發時間,增加了爬蟲開發效率,完善了工程化水平,將爬蟲工程師從日常的繁瑣配置工作中解放出來。前言 開發爬蟲是一件有趣的事情。寫一個程序,對感興趣的目標網站發起HTTP請求,獲取HTML,解析HTML,提取數據,將數據保存到數據庫或者存為CSV、JSON等格式,再用自己熟悉的語言例如Python對...
閱讀 2386·2021-09-22 16:01
閱讀 3153·2021-09-22 15:41
閱讀 1171·2021-08-30 09:48
閱讀 489·2019-08-30 15:52
閱讀 3323·2019-08-30 13:57
閱讀 1713·2019-08-30 13:55
閱讀 3648·2019-08-30 11:25
閱讀 757·2019-08-29 17:25