傳世手游新開服網(wǎng)站網(wǎng)站首頁不收錄
一、說明
????????本周我不得不為客戶抓取一個(gè)網(wǎng)站。我意識到我做得如此自然和迅速,分享它會很有用,這樣你也可以掌握這門藝術(shù)。【免責(zé)聲明:本文展示了我的抓取做法,如果您有更多相關(guān)做法請?jiān)谠u論中分享】
二、計(jì)劃策略
2.1 策劃
- 確定您的目標(biāo):一個(gè)簡單的 html 網(wǎng)站
- 在 Python 中設(shè)計(jì)抓取方案
- ?跑起代碼,讓魔術(shù)運(yùn)轉(zhuǎn)
您需要多少時(shí)間來抓取網(wǎng)站?從業(yè)者需要~10分鐘為一個(gè)簡單的html網(wǎng)站準(zhǔn)備Python腳本。
2.2 第一部分:找到你的目標(biāo)(一個(gè)網(wǎng)站)
????????就我而言,我需要從 SWIFT 代碼(或法國 BIC 代碼)中收集銀行名稱。該網(wǎng)站?http://bank-code.net/country/FRANCE-%28FR%29.html?有一個(gè)4000+ SWIFT代碼的列表以及相關(guān)的銀行名稱。問題是它們每頁僅顯示 15 個(gè)結(jié)果。瀏覽所有頁面并一次復(fù)制粘貼 15 個(gè)結(jié)果不是一種選擇。刮擦在這項(xiàng)任務(wù)中派上了用場。
????????首先,使用Chrome“檢查”選項(xiàng)來確定您需要獲取的html部分。將鼠標(biāo)移動到檢查窗口中的不同項(xiàng)目上(右側(cè)),然后跟蹤代碼突出顯示的網(wǎng)站部分(左側(cè))。選擇項(xiàng)目后,在檢查窗口中,使用“復(fù)制/復(fù)制元素”并將 html 代碼粘貼到 python 編碼工具中。
右側(cè)是谷歌瀏覽器的“檢查窗口”,您在使用右鍵單擊/檢查時(shí)獲得
????????就我而言,具有 15 個(gè) SWIFT 代碼的所需項(xiàng)目是一個(gè)“表”
<table class="table table-hover table-bordered" id="tableID" style="margin-bottom: 10px;">
</table>
2.3 第二部分:在 Python 中設(shè)計(jì)抓取方案
a)scrape第一頁
import requests
url = "http://bank-code.net/country/FRANCE-%28FR%29/"
page = requests.get(url)
就是這樣,3行代碼和Python已經(jīng)收到了網(wǎng)頁。現(xiàn)在,您需要正確解析html并檢索所需的項(xiàng)目。?
記住所需的 html :
<table class="table table-hover table-bordered" id="tableID" style="margin-bottom: 10px;">
</table>
它是一個(gè)“table”元素,id為“tableID”。它有一個(gè)id屬性的事實(shí)很好,因?yàn)檫@個(gè)網(wǎng)頁上沒有其他html元素可以有這個(gè)id。這意味著如果我在 html 中查找此 id,除了所需的元素之外,我找不到任何其他內(nèi)容。它節(jié)省了時(shí)間。
讓我們在 Python 中正確地做到這一點(diǎn)
import bs4
soup = bs4.BeautifulSoup(page.content, 'lxml')
table = soup.find(name='table', attrs={'id':'tableID'})
所以現(xiàn)在我們得到了所需的 html 元素。但是我們?nèi)匀恍枰@取 html 中的 SWIFT 代碼,然后將其存儲在 Python 中。我選擇把它存放在熊貓里。數(shù)據(jù)幀對象,但只有一個(gè)列表列表也可以解決。
為此,請返回Chrome檢查窗口,分析html樹的結(jié)構(gòu),并注意您必須轉(zhuǎn)到哪個(gè)元素。就我而言,所需的數(shù)據(jù)位于“tbody”元素中。每個(gè)銀行及其SWIFT代碼都包含在一個(gè)“tr”元素中,每個(gè)“tr”元素有多個(gè)“td”元素?!皌d”元素包含我正在尋找的數(shù)據(jù)。
html 樹可以描述如下:table, tbody, tr, td
我在一行中做到了,如下所示:
result = pd.DataFrame([[td.text for td in row.findAll('td')] for row in table.tbody.findAll('tr')])
b) 準(zhǔn)備自動化
????????現(xiàn)在我們已經(jīng)抓取了第一個(gè)網(wǎng)頁,我們需要考慮如何抓取我們尚未看到的新網(wǎng)頁。我這樣做的方法是復(fù)制人類行為:存儲一頁的結(jié)果,然后轉(zhuǎn)到下一頁。現(xiàn)在讓我們專注于下一個(gè)網(wǎng)頁。
????????在頁面底部,有一個(gè)菜單,允許您進(jìn)入 swift 代碼表的特定頁面。讓我們檢查檢查器窗口中的“下一頁”按鈕。
????????
“>”符號將引導(dǎo)我們進(jìn)入下一頁
這給出了以下 html 元素:
<a href="//bank-code.net/country/FRANCE-%28FR%29/15" data-ci-pagination-page="2" rel="next">></a>
現(xiàn)在在 Python 中獲取 url 很簡單:
"http:" + soup.find('a', attrs={'rel':'next'}).get('href')
我們快到了。
到目前為止,我們已經(jīng):
- 開發(fā)了一頁表格的抓取 - 確定了下一頁
的 url 鏈接
我們只需要做一個(gè)循環(huán),然后運(yùn)行代碼。我建議遵循以下兩種最佳實(shí)踐:
1. 登陸新網(wǎng)頁時(shí)打印出來:知道您的代碼處于流程的哪個(gè)階段(抓取代碼可以運(yùn)行數(shù)小時(shí))
2.定期保存結(jié)果:避免在出現(xiàn)錯(cuò)誤時(shí)丟失所有抓取的內(nèi)容
只要我不知道何時(shí)停止抓取,我就會使用慣用的“while True:”語法循環(huán)。我在每一步打印出計(jì)數(shù)器值。而且我也在每一步將結(jié)果保存在csv文件中。這實(shí)際上可能會浪費(fèi)時(shí)間,例如,更好的方法是每 10 或 20 步存儲一次數(shù)據(jù)。但我追求快速實(shí)施。
三、完整代碼
代碼是這樣的:
import os, bs4, requests
import pandas as pdPATH = os.path.join("C:\\","Users","xxx","Documents","py") # you need to change to your local path
res = pd.DataFrame()
url = "http://bank-code.net/country/FRANCE-%28FR%29/"
counter = 0def table_to_df(table): return pd.DataFrame([[td.text for td in row.findAll('td')] for row in table.tbody.findAll('tr')])def next_page(soup): return "http:" + soup.find('a', attrs={'rel':'next'}).get('href')while True:print(counter)page = requests.get(url)soup = bs4.BeautifulSoup(page.content, 'lxml')table = soup.find(name='table', attrs={'id':'tableID'})res = res.append(table_to_df(table))res.to_csv(os.path.join(os.path.join(PATH,"table.csv")), index=None, sep=';', encoding='iso-8859–1')url = next_page(soup)counter += 1
完整的代碼(只有26行)可以在這里找到:https://github.com/FelixChop/MediumArticles/blob/master/Scraping_SWIFT_codes_Bank_names.py