站數據采集在網絡世界中具有舉足輕重的地位,它可助我們高效收集各類互聯網信息。身為資深網絡新聞從業者,我有機會親身實踐該技術,現將心得與各位共享。
1.確定抓取目標
實施網站抓取前需明晰目標,包括抓取網站、所需信息類型及量級等要素。據我經驗,事先精密規劃有助于任務流暢執行。
2.選擇合適的工具
在網站抓取環節,擇優選取合適的工具至關重要。眾多優秀的抓取工具如Python內置的BeautifulSoup及Scrapy等任君挑選。結合自身需求與技能層級選擇適當的工具,并熟稔其操作要領。
3.分析頁面結構
在進行抓取操作前,需要深入剖析目標網站的頁面構造。此過程需閱讀查閱HTML編碼,掌握頁面設計布局以及各元素構成。如此,我們方可精準擬定提取規則并提升工作效果。
4.編寫抓取代碼
在獲取特定目標網站頁面構造及數據抓取需求后,我將編寫兼顧清晰度與完善性的代碼模組。此類代碼主要包含請求訪問頁面,解析HTML,以及提取所需要素在內的多項處理步驟。在生成抓取代碼時,必須兼顧其效率性與可擴展性的優勢,以備將來可能出現的優化或升級需求。
5.處理反爬機制
在網絡爬蟲過程中,我們頻繁遭遇諸多反爬措施,如訪問頻率封頂和人工驗證碼測試。為妥善應對此類挑戰,我們需掌握各類反爬策略,以及如何編寫對應代碼進行化解。
6.數據清洗和存儲
采集所得數據往往需經過凈化處理與保存。在本職工作上,我會運用Python的pandas庫對數據進行清理與規整,之后存入數據庫或Excel文檔以便充分利用與良好管理。
7.定期更新和優化
隨網絡環境的演變,抓取代碼須常加改進以適應頁面布局的改變,應對新型反爬策略等挑戰。只有具備細致洞察力與持續學習習慣,方能在行業競爭中穩操勝券。
8.遵守法律和道德規范
嚴謹遵守關于網絡探勘的法規與道德,嚴格尊崇robots.txt文檔及網站訪問權限規定,以合法合規且符合道義的途徑進行網站信息采集,方能維護品牌聲譽。
9.學習交流,共同進步
身為資深網絡記者,我深明學無止境及互動交流之價值所在。與同業、專家及愛好者攜手共進,我們定能桎梏大開,技藝日新月異。因此,我誠懇地呼吁各位踴躍投身各類學術研討與互動交流會中,共創輝煌。
通過上述九個主題的深入闡述,相信您對網站數據采集已經有了更為增進的領悟。作為一位專注的網絡新聞從業者,我將會持續地提升自己的技能與知識,以期能夠更好地為廣大讀者帶來寶貴且實用的資訊。期待能與諸位共同進步,共創互聯網繁榮時代的美好前景!
者:Kerry Parker
翻譯:田曉寧
校對:丁楠雅
本文約2900字,建議閱讀10分鐘。
本教程以在Fast Track上收集百強公司的數據為例,教你抓取網頁信息。
作為一名數據科學家,我在工作中所做的第一件事就是網絡數據采集。使用代碼從網站收集數據,當時對我來說是一個完全陌生的概念,但它是最合理、最容易獲取的數據來源之一。經過幾次嘗試,網絡抓取已經成為我的第二天性,也是我幾乎每天使用的技能之一。
在本教程中,我將介紹一個簡單的例子,說明如何抓取一個網站,我將從Fast Track上收集2018年百強公司的數據:
Fast Track:http://www.fasttrack.co.uk/
使用網絡爬蟲將此過程自動化,避免了手工收集數據,節省了時間,還可以讓所有數據都放在一個結構化文件中。
用Python實現一個簡單的網絡爬蟲的快速示例,您可以在GitHub上找到本教程中所介紹的完整代碼。
GitHub鏈接:https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py
以下是本文使用Python進行網頁抓取的簡短教程概述:
準備開始
在開始使用任何Python應用程序之前,要問的第一個問題是:我需要哪些庫?
對于web抓取,有一些不同的庫需要考慮,包括:
在本例中我們使用Beautiful Soup。你可以使用Python包管理器 pip 安裝Beautiful Soup:
pip install BeautifulSoup4
安裝好這些庫之后,讓我們開始吧!
檢查網頁
要知道在Python代碼中需要定位哪些元素,首先需要檢查網頁。
要從Tech Track Top 100 companies收集數據,可以通過右鍵單擊感興趣的元素來檢查頁面,然后選擇檢查。這將打開HTML代碼,我們可以在其中看到每個字段包含在其中的元素。
Tech Track Top 100 companies鏈接:http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/
右鍵單擊感興趣的元素并選擇“Inspect”,顯示html元素。
由于數據存儲在一個表中,因此只需幾行代碼就可以直接獲取數據。如果您想練習抓取網站,這是一個很好的例子,也是一個好的開始,但請記住,它并不總是那么簡單!
所有100個結果都包含在<tr> 元素的行中,并且這些在一頁上都可見。情況并非總是如此,當結果跨越多個頁面時,您可能需要更改網頁上顯示的結果數量,或者遍歷所有頁面以收集所有信息。
League Table網頁上顯示了包含100個結果的表。檢查頁面時,很容易在html中看到一個模式。結果包含在表格中的行中:
<table class="tableSorter">
重復的行<tr> 將通過在Python中使用循環來查找數據并寫入文件來保持我們的代碼最小化!
附注:可以做的另一項檢查是網站上是否發出了HTTP GET請求,該請求可能已經將結果作為結構化響應(如JSON或XML格式)返回。您可以在檢查工具的網絡選項卡中進行檢查,通常在XHR選項卡中進行檢查。刷新頁面后,它將在加載時顯示請求,如果響應包含格式化結構,則使用REST客戶端(如Insomnia)返回輸出通常更容易。
刷新網頁后,頁面檢查工具的網絡選項卡
使用Beautiful Soup解析網頁html
現在您已經查看了html的結構并熟悉了將要抓取的內容,是時候開始使用Python了!
第一步是導入將用于網絡爬蟲的庫。我們已經討論過上面的BeautifulSoup,它有助于我們處理html。我們導入的下一個庫是urllib,它連接到網頁。最后,我們將輸出寫入csv,因此我們還需要導入csv 庫。作為替代方案,可以在此處使用json庫。
# import librariesfrom bs4 import BeautifulSoupimport urllib.requestimport csv
下一步是定義您正在抓取的網址。如上一節所述,此網頁在一個頁面上顯示所有結果,因此此處給出了地址欄中的完整url:
# specify the urlurlpage='http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/'
然后我們建立與網頁的連接,我們可以使用BeautifulSoup解析html,將對象存儲在變量'soup'中:
# query the website and return the html to the variable 'page'page=urllib.request.urlopen(urlpage)# parse the html using beautiful soup and store in variable 'soup'soup=BeautifulSoup(page, 'html.parser')
我們可以在這個階段打印soup變量,它應該返回我們請求網頁的完整解析的html。
print(soup)
如果存在錯誤或變量為空,則請求可能不成功。可以使用urllib.error模塊在此時實現錯誤處理。
搜索html元素
由于所有結果都包含在表中,我們可以使用find 方法搜索表的soup對象。然后我們可以使用find_all 方法查找表中的每一行。
如果我們打印行數,我們應該得到101的結果,100行加上標題。
# find results within tabletable=soup.find('table', attrs={'class': 'tableSorter'})results=table.find_all('tr')print('Number of results', len(results))
因此,我們可以對結果進行循環以收集數據。
打印soup對象的前兩行,我們可以看到每行的結構是:
<tr><th>Rank</th><th>Company</th><th class="">Location</th><th>Year end</th><th class="" style="text-align:right;">Annual sales rise over 3 years</th><th class="" style="text-align:right;">Latest sales £000s</th><th class="" style="text-align:right;">Staff</th><th class="">Comment</th><!-- <th>FYE</th>--></tr><tr><td>1</td><td><a ><span>Wonderbly</span></a>Personalised children's books</td><td>East London</td><td>Apr-17</td><td style="text-align:right;">294.27%</td><td style="text-align:right;">*25,860</td><td style="text-align:right;">80</td><td>Has sold nearly 3m customisable children’s books in 200 countries</td><!-- <td>Apr-17</td>--></tr>
表格中有8欄:Rank,Company,Location,Year End,Annual Sales Rise,Latest Sales, Staff and Comments,所有這些都是我們可以保存的感興趣的數據。
網頁的所有行的結構都是一致的(對于所有網站來說可能并非總是如此!)。因此,我們可以再次使用find_all 方法將每一列分配給一個變量,那么我們可以通過搜索<td> 元素來寫入csv或JSON。
循環遍歷元素并保存變量
在Python中,將結果附加到一個列表中是很有用的,然后將數據寫到一個文件中。我們應該在循環之前聲明列表并設置csv的頭文件,如下所示:
# create and write headers to a list rows=[]rows.append(['Rank', 'Company Name', 'Webpage', 'Description', 'Location', 'Year end', 'Annual sales rise over 3 years', 'Sales £000s', 'Staff', 'Comments'])print(rows)
這將打印出我們添加到包含標題的列表的第一行。
你可能會注意到表格中有一些額外的字段Webpage和Description不是列名,但是如果你仔細看看我們打印上面的soup變量時的html,那么第二行不僅僅包含公司名稱。我們可以使用一些進一步的提取來獲取這些額外信息。
下一步是循環結果,處理數據并附加到可以寫入csv的rows。
在循環中查找結果:
# loop over resultsfor result in results: # find all columns per result data=result.find_all('td') # check that columns have data if len(data)==0: continue
由于表中的第一行僅包含標題,因此我們可以跳過此結果,如上所示。它也不包含任何<td>元素,因此在搜索元素時,不會返回任何內容。然后,我們可以通過要求數據的長度為非零來檢查是否只處理包含數據的結果。
然后我們可以開始處理數據并保存到變量中。
# write columns to variables rank=data[0].getText() company=data[1].getText() location=data[2].getText() yearend=data[3].getText() salesrise=data[4].getText() sales=data[5].getText() staff=data[6].getText() comments=data[7].getText()
以上只是從每個列獲取文本并保存到變量。但是,其中一些數據需要進一步清理以刪除不需要的字符或提取更多信息。
數據清理
如果我們打印出變量company,該文本不僅包含公司名稱,還包含描述。我們然后打印sales,它包含不需要的字符,如腳注符號,最好刪除。
print('Company is', company) # Company is WonderblyPersonalised children's books print('Sales', sales) # Sales *25,860
我們希望將company 分為公司名稱和描述,我們可以用幾行代碼實現。再看一下html,對于這個列,有一個 <span> 元素只包含公司名稱。此列中還有一個鏈接指向網站上的另一個頁面,其中包含有關該公司的更多詳細信息。我們將在稍后使用它!
<td><a ><span>Wonderbly</span></a>Personalised children's books</td>
要將company 分成兩個字段,我們可以使用find方法保存<span>元素,然后使用strip 或replace 從company 變量中刪除公司名稱,這樣它只留下描述。
要從sales中刪除不需要的字符,我們可以再次使用strip和replace 方法!
# extract description from the name companyname=data[1].find('span', attrs={'class':'company-name'}).getText() description=company.replace(companyname, '') # remove unwanted characters sales=sales.strip('*').strip('?').replace(',','')
我們要保存的最后一個變量是公司網站。如上所述,第二列包含指向另一個頁面的鏈接,該頁面具有每個公司的概述。 每個公司頁面都有自己的表格,大部分時間都包含公司網站。
檢查公司頁面上的url元素
要從每個表中抓取url并將其保存為變量,我們需要使用與上面相同的步驟:
查看一些公司頁面,如上面的屏幕截圖所示,網址位于表格的最后一行,因此我們可以在最后一行內搜索<a>元素。
# go to link and extract company website url=data[1].find('a').get('href') page=urllib.request.urlopen(url) # parse the html soup=BeautifulSoup(page, 'html.parser') # find the last result in the table and get the link try: tableRow=soup.find('table').find_all('tr')[-1] webpage=tableRow.find('a').get('href') except: webpage=None
也有可能出現公司網站未顯示的情況,因此我們可以使用try except條件,以防萬一找不到網址。
一旦我們將所有數據保存到變量中,我們可以在循環中將每個結果添加到列表rows。
# write each result to rows rows.append([rank, company, webpage, description, location, yearend, salesrise, sales, staff, comments])print(rows)
然后可以試著在循環外打印變量,在將其寫入文件之前檢查它是否符合您的預期!
寫入輸出文件
如果想保存此數據以進行分析,可以用Python從我們列表中非常簡單地實現。
# Create csv and write rows to output filewith open('techtrack100.csv','w', newline='') as f_output: csv_output=csv.writer(f_output) csv_output.writerows(rows)
運行Python腳本時,將生成包含100行結果的輸出文件,您可以更詳細地查看這些結果!
尾語
這是我的第一個教程,如果您有任何問題或意見或者不清楚的地方,請告訴我!
原文標題:
Data Science Skills: Web scraping using python
原文鏈接:
https://towardsdatascience.com/data-science-skills-web-scraping-using-python-d1a85ef607ed
譯者簡介
田曉寧,質量管理專家,國際認證精益六西格瑪黑帶,19年從業經驗;軟件工程專家,擁有CMMI ATM證書,曾主導公司通過CMMI 5級評估;精通ISO9000和ISO27000體系,長期擔任公司質量和信息安全主任審核員,每年審核超過50個項目或部門;擁有PMP證書,擔任公司項目管理內訓師,具有項目管理和系統開發實戰經驗。
— 完 —
關注清華-青島數據科學研究院官方微信公眾平臺“THU數據派”及姊妹號“數據派THU”獲取更多講座福利及優質內容。
文深入探討如何運用PHP高效獲取網頁HTML元素信息。
運用文件讀取函數,獲取網頁數據。
利用PHP腳本的強大功能,網頁數據的采集中極為便捷,各類網頁元素亦可轉化為字符形式線上展現。
2.使用正則表達式匹配目標元素
面對諸多網頁需求,巧妙運用正則表達式可以精準且迅速搜尋并提取所需的HTML元素。核心技術在于結合正則表達式與網頁數據,以實現精確篩選及獲取這些元素的目的。
3.使用DOMDocument類解析網頁
借助 DOMDocument 類,PHP 為我們提供了深入分析和處理網頁的途徑。該類功能強大且易用,尤其以其精準讀取 HTML 文檔樹及其靈活操作的表現,在準確獲取所需元素方面具有顯著優勢。
4.使用Simple HTML DOM庫
對于正則表達式和DOMDocument類的初學者而言,可能會遭遇困難。為提升工作效率,可嘗試借助于諸如Simple HTML DOM這類第三方工具。該工具能準確挖掘所需HTML元素,大幅縮減項目開發時間。
5.使用XPath查詢語言
憑借其卓越性能,XPath在應對XML及HTML文檔元素抽取任務中表現非凡,為我們提供了對HTML元素的精準與靈動操縱。
6.使用cURL庫發送HTTP請求
借助PHP中cURL庫的功能優勢,我們能夠精確滿足各種網絡頁面內容獲取和模擬仿真的需求,從而突出頁面關鍵信息的精度提取。
7.處理JavaScript生成的內容
針對個性化需求,運用JavaScript也可實現網站內容的動態生產。為高效達成此目的,我們能依賴于PHP所提供的兩種無頭瀏覽器工具包——Selenium以及PhantomJS。
8.處理AJAX請求返回的數據
為了實現在網頁間的數據交互和溝通,尤其是借助AJAX技術模擬網絡傳輸和數據獲取過程的各項操作,我們會充分利用PHP中獨有的CURL模塊和眾多第三方廠商開發的高效能庫,它們將會成為你處理海量信息的強大后盾。
9.使用API接口獲取數據
若目標網站具備API訪問許可,那么僅需根據接口文檔所指定的請求參數,便可自動獲取并拆分JSON或者XML格式的回饋數據,進而達到信息交換的目標。
10.注意事項和其他方法
在獲取網頁中的HTML元素時,需要注意以下幾點:
-確保目標網頁存在且可訪問;
-遵守目標網站的使用規則和法律法規;
-防止對目標網站造成過大的訪問壓力;
-根據具體需求選擇合適的方法和工具。
運用此策略,能精準提取所需HTML組件,為構建多樣化應用及特性提供強大后盾。盼望本文能對您在PHP開發過程中網頁元素搜尋有所裨益。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。