Python 網頁抓取教程:循序漸進

圖片

**循序漸進 **

抓取網頁入門其實挺簡單的。在之前的文章中我們介紹了怎麼用 C# 和 JAVA 兩種方法來抓取網頁,這一期給大家介紹一種更容易,也是使用最廣泛的一種抓取方法,那就是 Python。

說起 Python,大家應該並不陌生,它是目前入門最簡單的一種方法了,因爲它是**一種面向對象的語言。**Python 的類和對象比任何其他語言都更容易使用。此外,Python **存在許多庫,**因而在 Python 中構建用於網頁抓取的工具輕而易舉。

在這篇 Python 網絡抓取教程中,我們將分步驟講解如何利用 python 來抓取目標數據。首先需要從頁面源獲取基於文本的數據,然後將其存儲到文件中並根據設置的參數對輸出進行排序。使用 Python 進行網頁抓取時還有一些更高級功能的選項,這些將在最後概述,並提供一些使用上的建議。按照教程下面概述的步驟進行操作,您將能知道如何進行網頁抓取。

Python 網頁抓取教程**適用於所有操作系統。**不同系統安裝 Python 或開發環境時會略有不同,其它部分均無不同。

** 我們所說的網頁抓取是什麼?**

網絡抓取是收集公共數據的自動化過程。爬蟲會在幾秒鐘內自動從目標網站中提取大量公共數據。

**#****構建網絡爬蟲:Python 準備工作 **

在整個網絡抓取教程中,將使用 Python3.4 以上版本,您可以在下面頁面下載:

https://www.python.org/downloads/

準確的說,我們使用了 **3.8.3,**但任何 3.4 + 版本都應該可以正常運行我們下面用到的代碼。

對於 Windows 系統,安裝 Python 時確保選中 **“PATH 安裝”。**PATH 安裝將可執行項添加到默認的 Windows 命令提示符可執行項搜索中。然後 Windows 將識別諸如 “pip”“python” 之類的命令,而無需用戶將其指向可執行文件的目錄(例如 C:/tools/python/.../python.exe)。如果您已經安裝了 Python 但沒有勾選複選框,只需重新運行安裝並選擇修改。在第二頁上選擇 “添加到環境變量” 即可。

瞭解 Python 庫

圖片

由於可用的許多有用的庫,

使用 Python 進行網頁抓取很容易。

Python 的一大優勢在於**可供選擇的庫很多。**這些網頁抓取用到的庫現在已經用於數以萬計的 Python 項目——僅在 PyPI 上,現在就有超過 300,000 個項目。您可以選擇多種類型的 Python 網頁抓取庫:

●Requests

●Beautiful Soup

●lxml

●Selenium

01

#Requests 庫

網頁抓取首先向網站服務器發送 HTTP 請求(例如 POSTGET ),該請求會返回一個包含所需數據的響應。但是,標準 Python HTTP 庫難以使用,爲了提高效率,需要大量代碼行,這進一步加劇了已經存在的問題。

與其他 HTTP 庫不同,Requests 庫通過減少代碼行簡化了發出此類請求的過程,使代碼更易於理解和調試,而不會影響其有效性。使用 pip 命令就可以從終端內安裝該庫:

pip install requests

Requests 庫提供了發送 HTTPGETPOST 請求的簡單方法。例如,發送 HTTP Get 請求的函數被恰當地命名爲 get():

import requests

response = requests.get("https://oxylabs.io/”)

print(response.text)

如果需要發佈表單,可以使用 post() 方法輕鬆完成。表單數據可以作爲字典發送,如下所示:

form_data = {'key1': 'value1', 'key2': 'value2'}

response = requests.post("https://oxylabs.io/", data=form_data)

print(response.text)

請求庫還會使那些需要進行身份驗證的代理變得非常容易使用。

proxies={'http': 'http://user:password@proxy.oxylabs.io'}

response = requests.get('http://httpbin.org/ip', proxies=proxies)

print(response.text)

但是這個庫有一個侷限性,它不解析提取的 HTML 數據,也就是說它不能將數據轉換成更易讀的格式進行分析。此外,它不能用於抓取純 JavaScript 編寫的網站。

02

#Beautiful Soup

Beautiful Soup 是一個 Python 庫,它與解析器一起從 HTML 中提取數據,甚至可以將無效標記轉換爲解析樹。但是,該庫**僅用於解析,不能以 HTML 文檔 / 文件的形式從網絡服務器請求數據。它主要與 Python Requests 庫一起使用。需要注意的是,Beautiful Soup 可以輕鬆查詢和導航 HTML,**但仍需要解析器。以下示例演示了 html.parser 模塊的使用,該模塊是 Python 標準庫的一部分。

** #Part 1–使用 Requests 獲取 HTML **

import requests

url='https://oxylabs.io/blog'

response = requests.get(url)

** #Part 2–查找元素 **

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, 'html.parser')

print(soup.title)

標題裏的元素會輸出如下:

由於其導航、搜索和修改解析樹方法均很簡單,Beautiful Soup 即使對於初學者也是十分不錯的一個庫,並且通常可以節省開發人員數小時的工作時間。例如,要輸出此頁面中的所有博客標題,就可以使用 findAll()。在此頁面上,會找到所有 h2 大小,且類屬性爲 blog-card__content-title 的博客標題。該信息可以配合 findAll 方法使用,如下所示:

blog_titles = soup.findAll('h2', attrs={"class":"blog-card__content-title"})

for title in blog_titles:print(title.text)

Output:

Prints all blog tiles on the page

BeautifulSoup 還可以輕鬆使用 CSS selectors。如果開發人員知道 CSS selector,則無需學習 find()find_all() 方法。以下是相同的示例,但使用的是 CSS selectors:

blog_titles = soup.select('h2.blog-card__content-title')

for title in blog_titles:

print(title.text)

雖然能解析有問題的 HTML 是該庫的主要功能之一,但它還提供了許多其它功能,包括**檢測頁面編碼,更進一步提高從 HTML 文件中提取數據的準確性。 **

更重要的是,它可以**輕鬆配置,**只需幾行代碼,即可提取任何自定義的公開可用數據或識別特定的數據類型。我們的 Beautiful Soup 教程

(https://oxylabs.io/blog/beautiful-soup-parsing-tutorial)包含有關此配置和其他配置的更多信息,以及該庫的工作原理。

03

#lxml

lxml 是一個解析庫。它是一個快速、強大且易於使用的庫,適用於 HTMLXML 文件。此外,lxml 是**大量提取數據的理想選擇。**然而,與 Beautiful Soup 不同的是,這個庫針對設計的不好的 HTML 可能會出現解析不了的情況。

可以使用以下 pip 命令從終端安裝 lxml 庫:

pip install lxml

這個庫包含一個 html 模塊來處理 HTML。但是,lxml 庫首先需要 HTML 字符串。可以使用上一節中討論的 Requests 庫檢索此 HTML 字符串。一旦 HTML 可用,就可以使用下面的 fromstring 方法構建樹:

After response = requests.get()

from lxml import html

tree = html.fromstring(response.text)

現在可以使用 XPath 查詢此樹。繼續上一節中討論的示例,要獲取博客的標題,XPath 將如下所示:

//h2[@class="blog-card__content-title"]/text()

可以將此 XPath 提供給 tree.xpath() 函數。這將返回與此 XPath 匹配的所有元素。注意 XPath 中的 text() 函數。該函數會提取 h2 元素內的文本。

blog_titles = tree.xpath('//h2[@class="blog-card__content-title"]/text()')

for title in blog_titles:

print(title)

假設您希望學習使用這個庫並將其集成到您的網絡抓取工作中,或者只是在您現有的專業知識基礎上學習更多知識。您可以參見更詳細的 lxml 教程:

https://oxylabs.io/blog/lxml-tutorial

04

#Selenium

如上所述,一些網站是使用 JavaScript 編寫的,JavaScript 是一種允許開發者動態填充字段和菜單的語言。這給只能從靜態網頁中提取數據的 Python 庫帶來了問題。事實上,當涉及到 JavaScript 時,Requests 庫將無法使用。這個時候就是 Selenium 網絡抓取的用武之地。

這個 Python 網絡庫是一個開源的瀏覽器自動化工具(網絡驅動),它允許您自動執行諸如登錄社交媒體平臺之類的過程。Selenium 廣泛用於**在應用程序上測試案例或測試腳本。**它在網頁抓取方面的優勢源於它能夠像任何瀏覽器一樣通過運行 JavaScript 來呈現網頁——標準的網絡爬蟲無法運行這種編程語言。目前 Selenium 已被開發人員廣泛使用。

Selenium 需要三個組件:

●瀏覽器–支持的瀏覽器有 Chrome、Edge、Firefox 和 Safari。

●瀏覽器驅動程序 - 請參閱此頁面

https://pypi.org/project/selenium/ 以獲取驅動程序的鏈接。

Selenium 安裝包。

可以從終端安裝 selenium 包:

pip install selenium

安裝後,可以導入瀏覽器的相應類。導入後,必須創建**類的對象。**注意,這將需要可執行驅動程序的路徑。Chrome 瀏覽器示例如下:

from selenium.webdriver import Chrome

driver = Chrome(executable_path='/path/to/driver')

現在可以使用該 get() 方法在瀏覽器中加載任何頁面。

driver.get('https://oxylabs.io/blog')

Selenium 允許使用 CSS SelectorsXPath 來提取元素。以下示例使用 CSS Selectors 輸出所有博客標題:

blog_titles = driver.get_elements_by_css_selector('h2.blog-card__content-title')

for title in blog_tiles:

print(title.text)

driver.quit() # closing the browser

通過運行 JavaScript,Selenium 可以處理動態顯示的任何內容,然後可用內置方法甚至 Beautiful Soup 對網頁內容進行解析。此外,它還可以模仿用戶的行爲。

在網絡抓取中使用 Selenium 的唯一缺點是**它會減慢過程,因爲它必須先爲每個頁面執行 JavaScript 代碼,然後才能對其進行解析。因此,它不適合大規模的數據提取。**但是,如果您希望小規模提取數據或者不在乎數據提取速度,那麼 Selenium 是一個不錯的選擇。

** 支持網頁抓取的 Python 庫比較**

圖片

對於這次的 Python 網頁抓取教程,我們將使用三個重要的庫——**BeautifulSoup v4、Pandas 和 Selenium。*請提前安裝好這些庫。如果您收到 “NameError:name is not defined”,則可能存在沒安裝成功的庫。

**#****網絡驅動程序和瀏覽器 **

每個網絡爬蟲都會使用瀏覽器,因爲它需要連接到目標 URL。出於測試目的,我們強烈建議使用常規瀏覽器(或不是無頭瀏覽器),尤其是對於新手。查看編寫的代碼如何與應用程序交互可以進行**簡單的故障排除和調試,**也有助於更好地理解整個過程。

無頭瀏覽器可以在後面再使用,因爲它們對於複雜的任務更有效。在本次網頁抓取教程中,我們將使用 Chrome 瀏覽器,其實整個過程用 Firefox 瀏覽器也幾乎相同。

首先,使用您喜歡的搜索引擎查找 “Chrome(或 Firefox)的網絡驅動”。記下您瀏覽器的當前版本。下載與您的瀏覽器版本匹配的網絡驅動程序。

如果適用,請選擇所需的軟件包,下載並解壓縮。將驅動程序的可執行文件複製到任何易於訪問的目錄即可。操作是否正確,後面運行程序的時候就知道了。

爲我們的 Python 網絡爬蟲

尋找良好的編碼環境

在我們進入本次網頁抓取教程的編程部分之前,需要採取最後一步:使用良好的編碼環境。有很多選擇,從簡單的文本編輯器(只需創建 *.py 文件並直接寫下代碼就足夠了),到功能齊全的 IDE(集成開發環境)。

如果您已經安裝了 **Visual Studio Code,**選擇這個 IDE 將是最簡單的選擇。否則,我強烈建議新手使用 PyCharm(https://www.jetbrains.com/pycharm/),

因爲它幾乎沒有入門門檻,並且有直觀的用戶界面。後面我們將使用 PyCharm 用於網頁抓取教程。

在 PyCharm 中,右鍵單擊項目區域並 “新建 ->Python 文件”。給它取個好聽的名字!

Part 1

導入和使用庫

是時候使用我們之前安裝的所有包了:

import pandas as pd

from bs4 import BeautifulSoup

from selenium import webdriver

PyCharm 可能會以灰色顯示這些導入,因爲它會自動標記未使用的庫。不要接受 PyCharm 刪除未使用的庫的建議。

首先,定義我們的瀏覽器。根據我們在 “網絡驅動和瀏覽器” 中選擇的網絡驅動,我們應該輸入:

driver = webdriver.Chrome(executable_path='c:\path\to\windows\webdriver\executable.exe')

OR

driver = webdriver.Firefox(executable_path='/nix/path/to/webdriver/executable')

Part 2

選擇一個網址

圖片

Python 網頁抓取需要查看網站的來源

在執行我們第一次測試運行之前,選擇一個 URL。由於本次網頁抓取教程旨在創建一個基本應用程序,我們強烈建議您選擇一個簡單的目標 URL:

●避開隱藏在 Javascript 元素中的數據。這些數據有時需要通過執行特定操作來觸發才能顯示。從 Javascript 元素中抓取數據需要更復雜的 Python 使用方法及邏輯。

●避開抓取圖像。圖像可以直接用 Selenium 下載。

●在進行任何抓取活動之前,請確保您正在抓取的是**公共數據,**並且絕不會侵犯第三方權利。另外,不要忘記查看 robots.txt 文件獲得指導。

選擇您要訪問的登錄頁面並將 URL 輸入到 driver.get('URL') 參數中。Selenium 要求提供連接協議。因此,始終需要將 “http://” 或“https://” 附加到 URL 上。

driver.get('https://your.url/here?yes=brilliant')

嘗試通過單擊左下角的綠色箭頭或右鍵單擊編碼環境並選擇 “運行” 來進行測試運行。

圖片

點擊紅色指針指到的地方

如果您收到一條錯誤消息,指出文件丟失,請仔細檢查驅動程序 “webdriver.*” 中提供的路徑是否與可執行網絡驅動的位置匹配。如果您收到版本不匹配的消息,請重新下載正確的可執行網絡驅動。

Part 3

定義對象和構建列表

Python 允許編碼人員在不指定確切類型的情況下設計對象。可以通過簡單地鍵入其標題並分配一個值來創建對象。

Object is “results”, brackets make the object an empty list.

We will be storing our data here.

results = []

Python 中的列表是有序的、可變的並且允許複製列表中的成員。當然您也可以使用其他集合,例如集合或字典。但列表是最容易使用的。下面我們先來添加一些對象。

Add the page source to the variable content.

content = driver.page_source

Load the contents of the page, its source, into BeautifulSoup

class, which analyzes the HTML as a nested data structure and allows to select

its elements by using various selectors.

soup = BeautifulSoup(content)

我們回顧一下之前已經寫好的代碼:

import pandas as pd

from bs4 import BeautifulSoup

from selenium import webdriver

driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')

driver.get('https://your.url/here?yes=brilliant')

results = []

content = driver.page_source

soup = BeautifulSoup(content)

重新運行應用程序,不應顯示任何錯誤。如果出現任何問題,前面的章節中概述了一些可能的故障排除選項。

Part 4

使用 Python 網頁抓取工具****提取數據

這部分有趣而又困難——從 HTML 文件中提取數據。由於幾乎在所有網頁下,我們都會從頁面的不同部分中提取需要的部分,並且我們希望將其存儲到列表中,因此我們需要處理每個小的部分,然後將其添加到列表中:

Loop over all elements returned by the findAll call. It has the filter attrs given

to it in order to limit the data returned to those elements with a given class only.

for element in soup.findAll(attrs={'class': 'list-item'}):

...

“soup.findAll” 可以接受各種參數。出於本教程的目的,我們僅使用 “attrs”(屬性)參數。它允許我們通過設置一個語句 “如果屬性等於 X 爲真,則……” 來縮小搜索範圍。很容易就能找到和使用尋找的類,我們下面將會用到該參數。

在繼續之前,讓我們在真實的瀏覽器中訪問所選的 URL。然後使用 CTRL+U(Chrome) 打開頁面源代碼或右鍵單擊並選擇 “查看頁面源代碼”。找到嵌套數據的“最近” 類。另一種選擇是按 F12 打開開發者工具來選擇 Element Picker。例如,它可以嵌套爲:

This is a Title

我們的屬性 “class” 就是 **“title”。**如果您選擇了一個簡單的目標,在大多數情況下,數據將以與上述示例類似的方式嵌套。獲取複雜的目標數據可能需要更多嘗試。讓我們回到編碼並添加我們在源代碼中找到的類:

Change ‘list-item’ to ‘title’.

for element in soup.findAll(attrs={'class': 'title'}):

  ...    

我們的循環現在將遍歷頁面源中具有 “title” 類的所有對象。我們會處理每一個對象:

name = element.find('a')

讓我們看看我們的循環是如何遍歷 HTML 的:

This is a Title

我們的第一個語句(在循環本身中)查找所有匹配標籤的元素,其 “class” 屬性包含 **“title”。**然後我們在該類中執行另一個搜索。我們的第二次搜索查找文檔中的所有標籤(被包括在內,而像這樣的部分匹配則不被包括在內)。最後,對象被分配給變量 “name”。

然後,我們可以將對象名稱分配給我們之前創建的列表數組 **“results”,**但這樣做會將整個標籤及其內部的文本合併到一個元素中。在大多數情況下,我們只需要文本本身而不需要任何額外的標籤。

Add the object of “name” to the list “results”.

.text extracts the text in the element, omitting the HTML tags.

results.append(name.text)

我們的循環將遍歷整個頁面源,找到上面列出的所有出現的類,然後將嵌套數據附加到我們的列表中:

import pandas as pd

from bs4 import BeautifulSoup

from selenium import webdriver

driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')

driver.get('https://your.url/here?yes=brilliant')

results = []

content = driver.page_source

soup = BeautifulSoup(content)

for element in soup.findAll(attrs={'class': 'title'}):

name = element.find('a')

results.append(name.text)

請注意,循環後的兩個語句是縮進的。循環需要縮進來表示嵌套。任何一致的縮進都將被視爲合法。沒有縮進的循環將輸出 “IndentationError” 報錯,並用 “箭頭” 指出違規語句。

Part 5

導出數據

圖片

Python 網頁抓取需要不斷仔細地檢查代碼

即使在運行我們的程序時沒有出現語法或運行時的錯誤,仍然可能存在語義錯誤。您需要檢查我們獲得的數據是不是分配給指定對象並正確移動到數組的。

檢查您獲取的數據是否正確收集的最簡單方法之一是使用 **“print”。**由於數組有許多不同的值,因此通常使用一個簡單的循環將每個條目分行進行輸出:

for x in results:

   print(x)    

在這一點上,“print” 和 “for” 是配合使用的。我們只是爲了快速測試和調試目的進行循環。直接輸出結果也是完全可行的:

print(results)

到目前爲止,我們的代碼應該是這樣的:

driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')

driver.get('https://your.url/here?yes=brilliant')

results = []

content = driver.page_source

soup = BeautifulSoup(content)

for a in soup.findAll(attrs={'class': 'class'}):

name = a.find('a')

if name not in results:

    results.append(name.text)

for x in results:

print(x)

現在運行我們的程序應該不會報錯,調試窗口中也應該會顯示獲取的數據。雖然 “print” 非常適合用於測試目的,但它對於解析和分析數據並不是很有用。

您可能已經注意到,到目前爲止,“import pandas” 仍然是灰色的。我們最終還是會充分利用庫。建議現在刪除 “print” 循環,因爲接下來我們要做的事情與此類似,並且會將數據移動到 csv 文件。

df = pd.DataFrame({'Names': results})

df.to_csv('names.csv', index=False, encoding='utf-8')

我們的兩個新語句依賴於 pandas 庫。我們的第一個語句創建了一個變量 “df” 並將其對象轉換爲二維數據表。“Names” 是我們列的名稱,而 “results” 是我們要輸出的列表。注意,pandas 可以創建多個列,我們只是沒有足夠的列表來使用這些參數(目前)。

我們的第二個語句將變量 “df” 的數據移動到特定的文件類型(在本例中爲 “csv”)。我們的第一個參數爲我們即將創建的文件分配一個名稱和一個擴展名。添加擴展名是必要的,否則 “pandas” 將輸出一個沒有擴展名的文件,並且必須手動更改。“索引” 可用於爲列分配特定的起始編號。“編碼” 用於以特定格式保存數據。一般情況下使用 UTF-8 就足夠了。

import pandas as pd

from bs4 import BeautifulSoup

from selenium import webdriver

driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')

driver.get('https://your.url/here?yes=brilliant')

results = []

content = driver.page_source

soup = BeautifulSoup(content)

for a in soup.findAll(attrs={'class': 'class'}):

name = a.find('a')

if name not in results:

    results.append(name.text)

df = pd.DataFrame({'Names': results})

df.to_csv('names.csv', index=False, encoding='utf-8')

現在所有導入的庫應該都不是灰色的了,並且運行我們的應用程序可以將 “names.csv” 輸出到我們的項目目錄中。注意,“Guesed At Parser” 警告仍然存在。我們可以通過安裝第三方解析器來刪除它,但對於本 Python 網頁抓取教程而言,默認的 HTML 選項就可以了。

Part 6

更多清單

圖片

Python 網頁抓取通常需要很多數據點

許多網頁抓取操作需要獲取多組數據。例如,僅提取電子商務網站上列出項目的標題幾乎沒用。爲了收集有意義的信息並從中得出結論,至少需要兩個數據點。

出於本教程的目的不同,我們將嘗試一些稍微不同的代碼。由於從同一個類中獲取數據只是意味着一個額外的列表,我們應該嘗試從不同的類中提取數據,但同時保持我們表的結構。

顯然,我們需要另一個列表來存儲我們的數據。

import pandas as pd

from bs4 import BeautifulSoup

from selenium import webdriver

driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')

driver.get('https://your.url/here?yes=brilliant')

results = []

other_results = []

for b in soup.findAll(attrs={'class': 'otherclass'}):

Assume that data is nested in ‘span’.

name2 = b.find('span')

other_results.append(name.text)

由於我們將從 HTML 的不同部分提取額外的數據點,因此我們需要一個額外的循環。如果需要,我們還可以添加另一個 “if” 條件來控制重複條目:

最後,我們需要改變我們的數據表的形成方式:

df = pd.DataFrame({'Names': results, 'Categories': other_results})

到目前爲止,我們代碼的最新迭代應該是這樣的:

import pandas as pd

from bs4 import BeautifulSoup

from selenium import webdriver

driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')

driver.get('https://your.url/here?yes=brilliant')

results = []

other_results = []

content = driver.page_source

for a in soup.findAll(attrs={'class': 'class'}):

name = a.find('a')

if name not in results:

    results.append(name.text)

for b in soup.findAll(attrs={'class': 'otherclass'}):

name2 = b.find('span')

other_results.append(name.text)

df = pd.DataFrame({'Names': results, 'Categories': other_results})

df.to_csv('names.csv', index=False, encoding='utf-8')

現在可以試試看,如果一切順利,運行此代碼不會輸出任何錯誤。在某些情況下,“pandas” 會輸出 “ValueError:arrays must all be the same length” 報錯消息。簡單來說,“results”“other_results” 列表的長度不相等,因此 pandas 無法創建二維表。

有多種方法可以解決該錯誤消息。從用 “空” 值填充最短列表到創建字典,再到創建兩個系列並列出它們。我們選擇第三種做法:

series1 = pd.Series(results, name = 'Names')

series2 = pd.Series(other_results, name = 'Categories')

df = pd.DataFrame({'Names': series1, 'Categories': series2})

df.to_csv('names.csv', index=False, encoding='utf-8')

請注意,數據不會匹配,因爲列表長度不均勻,但如果需要兩個數據點,創建兩個系列是最簡單的解決方法。我們的最終代碼應該是這樣的:

import pandas as pd

from bs4 import BeautifulSoup

from selenium import webdriver

driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')

driver.get('https://your.url/here?yes=brilliant')

results = []

other_results = []

content = driver.page_source

soup = BeautifulSoup(content)

for a in soup.findAll(attrs={'class': 'class'}):

name = a.find('a')

if name not in results:

    results.append(name.text)

for b in soup.findAll(attrs={'class': 'otherclass'}):

name2 = b.find('span')

other_results.append(name.text)

series1 = pd.Series(results, name = 'Names')

series2 = pd.Series(other_results, name = 'Categories')

df = pd.DataFrame({'Names': series1, 'Categories': series2})

df.to_csv('names.csv', index=False, encoding='utf-8')

運行它會創建一個名爲 “names”csv 文件,其中包含兩列數據。

Part 7

使用 Python 進行網絡抓取

我們的第一個網絡抓取工具現在應該可以正常運行了。整個過程很基礎,也很簡單,所以執行一些重要的數據採集時需要編譯更完善的代碼。在進行更復雜的項目前,我強烈建議您嘗試一些附加功能:

●通過創建可生成偶數長度列表的循環來創建匹配的數據提取。

●一次性抓取多個 **URL。**有很多方法可以實現這樣的功能。最簡單的選擇之一是簡單地重複上面的代碼並且每次更改 URL。但是那樣很費時間,也會很枯燥。可以構建一個循環和一組要訪問的 URL。

●另一種選擇是創建多個數組來存儲不同的數據集並將其輸出到具有不同行的一個文件中。一次抓取幾種不同類型的信息是電子商務數據獲取的重要組成部分。

●一旦運行了令人滿意的網絡爬蟲,您就不再需要在用瀏覽器查看,而是直接執行操作。獲取 Chrome 或 Firefox 瀏覽器的無頭版本,並使用它們來減少加載時間。

●創建**爬取模式。**想一想普通用戶如何瀏覽互聯網並嘗試模擬他們的操作。當然這裏會需要新的庫。使用 “import time”“from random import randint” 來創建頁面之間的等待時間。添加 “scrollto()” 或使用特定的按鍵輸入在瀏覽器中移動。在創建抓取模式時,很難列出所有可能的選項。

●創建**監控流程。**某些網站上的數據可能對時間(甚至用戶)敏感。嘗試創建一個持久的循環,以設定的時間間隔重新檢查某些 URL 並抓取數據。確保您獲取的數據始終是最新的。

●使用 Python Requests 庫

(https://oxylabs.io/blog/python-requests)。Requests 是網絡抓取工具包中的重要組成部分,因爲它允許優化發送到服務器的 HTTP 請求。

●最後,將代理集成到您的網絡爬蟲中。使用特定位置的請求源允許您獲取可能無法訪問的數據。

—— 總結 ——

看完我們的教程,您就可以自己寫一些代碼了。用 Python 構建網絡爬蟲、獲取數據並從大量信息中得出結論其實是一個複雜但有趣的過程。

如果您想了解有關代理或高級數據採集工具如何工作的更多信息,或特定網絡抓取案例,例如:

網絡抓取職位發佈信息

https://oxylabs.io/blog/web-scraping-job-postings

或構建黃頁抓取工具

https://oxylabs.io/blog/building-your-own-yellow-pages-scraper

的更多信息,請留意我們的微信,知乎和其它社交平臺。

我們準備了不少優質的文章:

關於如何在抓取時避免封鎖的更詳細指南

https://oxylabs.io/blog/how-to-crawl-a-website-without-getting-blocked、

網絡抓取是否合法

https://oxylabs.io/blog/is-web-scraping-legal、

什麼是代理的深入討論

https://oxylabs.io/blog/what-is-proxy 等等!

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/eHD4pg8feTxHEGDZnIaZXA