用Python進行Web爬取數據

2021-01-08 人工智慧遇見磐創

介紹

我們擁有的數據太少,無法建立機器學習模型。我們需要更多數據!

如果這句話聽起來很熟悉,那麼你並不孤單!希望獲得更多數據來訓練我們的機器學習模型是一個一直困擾人們的問題。我們無法在數據科學項目中獲得可以直接使用的Excel或.csv文件,對嗎?

那麼,如何應對數據匱乏的問題呢?

實現此目的最有效,最簡單的方法之一就是通過網頁抓取。我個人發現網絡抓取是一種非常有用的技術,可以從多個網站收集數據。如今,某些網站還為你可能希望使用的許多不同類型的數據提供API,例如Tweets或LinkedIn帖子。

但是有時你可能需要從不提供特定API的網站收集數據。這就是web抓取能力派上用場的地方。作為數據科學家,你可以編寫一個簡單的Python腳本並提取所需的數據。

因此,在本文中,我們將學習Web抓取的不同組件,然後直接研究Python,以了解如何使用流行且高效的BeautifulSoup庫執行Web抓取。

請注意,網頁抓取要遵守許多準則和規則。並非每個網站都允許用戶抓取內容,因此存在一定的法律限制。在嘗試執行此操作之前,請務必確保已閱讀網站的網站條款和條件。

目錄

3個流行的工具和庫,用於Python中的Web爬蟲Web爬網的組件 Crawl Parse and Transform Store從網頁中爬取URL和電子郵件ID爬取圖片在頁面加載時抓取數據3個流行的工具和庫,用於Python中的Web爬蟲

你將在Python中遇到多個用於Web抓取的庫和框架。以下是三種高效完成任務的熱門工具:

BeautifulSoup

BeautifulSoup是Python中一個了不起的解析庫,可用於從HTML和XML文檔進行Web抓取。BeautifulSoup會自動檢測編碼並優雅地處理HTML文檔,即使帶有特殊字符也是如此。我們可以瀏覽已解析的文檔並找到所需的內容,這使得從網頁中提取數據變得快捷而輕鬆。在本文中,我們將詳細學習如何使用Beautiful Soup構建web ScraperScrapy

Scrapy是用於大規模Web抓取的Python框架。它為你提供了從網站中高效提取數據,根據需要進行處理並以你喜歡的結構和格式存儲數據所需的所有工具。你可以在這裡閱讀更多有關Scrapy的信息。 https://www.analyticsvidhya.com/blog/2017/07/web-scraping-in-python-using-scrapySelenium

Selenium是另一個使瀏覽器自動化的流行工具。它主要用於行業中的測試,但也非常方便進行網頁抓取。看看這篇很棒的文章,以了解更多有關使用Selenium進行Web抓取的工作方式的信息。 https://www.analyticsvidhya.com/blog/2019/05/scraping-classifying-youtube-video-data-python-seleniumWeb爬網的組件

這是構成網頁抓取的三個主要組成部分的出色說明:

讓我們詳細了解這些組件。我們將通過goibibo網站抓取酒店的詳細信息,例如酒店名稱和每間客房的價格,以實現此目的:

注意:請始終遵循目標網站的robots.txt文件,該文件也稱為漫遊器排除協議。這可以告訴網絡漫遊器不要抓取哪些頁面。

https://www.goibibo.com/robots.txt

因此,我們被允許從目標URL中抓取數據。我們很高興去寫我們的網絡機器人的腳本。讓我們開始!

第1步:Crawl(抓取)

Web抓取的第一步是導航到目標網站並下載網頁的原始碼。我們將使用請求庫來執行此操作。http.client和urlib2是另外兩個用於發出請求和下載原始碼的庫。

http.client:https://docs.python.org/3/library/http.client.html#module-http.clienturlib2:https://docs.python.org/2/library/urllib2.html下載了網頁的原始碼後,我們需要過濾所需的內容:

"""Web Scraping - Beautiful Soup"""# importing required librariesimport requestsfrom bs4 import BeautifulSoupimport pandas as pd# target URL to scrapurl = "https://www.goibibo.com/hotels/hotels-in-shimla-ct/"# headersheaders = { 'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" }# send request to download the dataresponse = requests.request("GET", url, headers=headers)# parse the downloaded datadata = BeautifulSoup(response.text, 'html.parser')print(data)步驟2:Parse and Transform(解析和轉換)

Web抓取的下一步是將這些數據解析為HTML解析器,為此,我們將使用BeautifulSoup庫。現在,如果你已經注意到我們的目標網頁,則與大多數網頁一樣,特定酒店的詳細信息也位於不同的卡片上。

因此,下一步將是從完整的原始碼中過濾卡片數據。接下來,我們將選擇該卡片,然後單擊「Inspect Element」選項以獲取該特定卡的原始碼。你將獲得如下內容:

所有卡的類名都相同,我們可以通過傳遞標籤名稱和屬性(如標籤)來獲得這些卡的列表,其名稱如下所示:

# find all the sections with specifiedd class namecards_data = data.find_all('div', attrs={'class', 'width100 fl htlListSeo hotel-tile-srp-container hotel-tile-srp-container-template new-htl-design-tile-main-block'})# total number of cardsprint('Total Number of Cards Found : ', len(cards_data))# source code of hotel cardsfor card in cards_data: print(card)

我們從網頁的完整原始碼中過濾出了卡數據,此處的每張卡都包含有關單獨酒店的信息。僅選擇酒店名稱,執行「Inspect Element」步驟,並對房間價格執行相同操作:

現在,對於每張卡,我們必須找到上面的酒店名稱,這些名稱只能從

標籤中提取。這是因為每張卡和房價只有一個 < p > 標籤和 < class > 標籤和類名:

# extract the hotel name and price per roomfor card in cards_data: # get the hotel name hotel_name = card.find('p') # get the room price room_price = card.find('li', attrs={'class': 'htl-tile-discount-prc'}) print(hotel_name.text, room_price.text)

步驟3:Store(儲存數據)

最後一步是將提取的數據存儲在CSV文件中。在這裡,對於每張卡,我們將提取酒店名稱和價格並將其存儲在Python字典中。然後,我們最終將其添加到列表中。

接下來,讓我們繼續將此列錶轉換為Pandas數據框,因為它允許我們將數據框轉換為CSV或JSON文件:

# create a list to store the datascraped_data = []for card in cards_data: # initialize the dictionary card_details = {} # get the hotel name hotel_name = card.find('p') # get the room price room_price = card.find('li', attrs={'class': 'htl-tile-discount-prc'}) # add data to the dictionary card_details['hotel_name'] = hotel_name.text card_details['room_price'] = room_price.text # append the scraped data to the list scraped_data.append(card_details)# create a data frame from the list of dictionariesdataFrame = pd.DataFrame.from_dict(scraped_data)# save the scraped data as CSV filedataFrame.to_csv('hotels_data.csv', index=False)

恭喜!我們已經成功創建了一個基本的網頁抓取工具。我希望你嘗試這些步驟,並嘗試獲取更多數據,例如酒店的等級和地址。現在,讓我們看看如何執行一些常見任務,例如在頁面加載時抓取URL,電子郵件ID,圖像和抓取數據。

從網頁中抓取URL和電子郵件ID

我們嘗試使用網絡抓取功能抓取的兩個最常見的功能是網站URL和電子郵件ID。我敢肯定你曾經參與過需要大量提取電子郵件ID的項目或挑戰。因此,讓我們看看如何在Python中抓取這些內容。

使用Web瀏覽器的控制臺

假設我們要跟蹤我們的Instagram關注者,並想知道取消關注我們帳戶的人的用戶名。首先,登錄到你的Instagram帳戶,然後單擊關注者以查看列表:

一直向下滾動,以便將所有用戶名都加載到瀏覽器內存中的後臺右鍵單擊瀏覽器窗口,然後單擊「檢查元素」在控制臺窗口中,鍵入以下命令:urls = $$(『a』); for (url in urls) console.log ( urls[url].href);

僅需一行代碼,我們就可以找到該特定頁面上存在的所有URL:

接下來,將此列表保存在兩個不同的時間戳中,一個簡單的Python程序將使你知道兩者之間的區別。我們將能夠知道取消了我們的帳戶的用戶名!我們可以使用多種方法來簡化此任務。主要思想是,只需一行代碼,我們就可以一次性獲得所有URL。使用Chrome擴展程序電子郵件提取器

電子郵件提取器是一個Chrome插件,可捕獲我們當前正在瀏覽的頁面上顯示的電子郵件ID

它甚至允許我們下載CSV或文本文件中的電子郵件ID列表:

BeautifulSoup和正則表達式

僅當我們只想從一頁抓取數據時,以上解決方案才有效。但是,如果我們希望對多個網頁執行相同的步驟怎麼辦?

有許多網站可以通過收費為我們做到這一點。但這裡有個好消息——我們還可以使用Python編寫自己的Web爬蟲!讓我們在下面的實時編碼窗口中查看操作方法。

https://id.analyticsvidhya.com/auth/login/?next=https://www.analyticsvidhya.com/blog/2019/10/web-scraping-hands-on-introduction-python在Python中爬取圖片

在本節中,我們將從同一個Goibibibo網頁抓取所有圖片。第一步是導航到目標網站並下載原始碼。接下來,我們將使用 < img > 標籤查找所有圖像:

"""Web Scraping - Scrap Images"""# importing required librariesimport requestsfrom bs4 import BeautifulSoup# target URLurl = "https://www.goibibo.com/hotels/hotels-in-shimla-ct/"headers = { 'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" }response = requests.request("GET", url, headers=headers)data = BeautifulSoup(response.text, 'html.parser')# find all with the image tagimages = data.find_all('img', src=True)print('Number of Images: ', len(images))for image in images: print(image)

從所有圖像標籤中,僅選擇src部分。另外,請注意,酒店圖片以jpg格式提供。因此,我們將僅選擇那些:

# select src tagimage_src = [x['src'] for x in images]# select only jp format imagesimage_src = [x for x in image_src if x.endswith('.jpg')]for image in image_src: print(image)

現在我們有了圖像URL的列表,我們要做的就是請求圖像內容並將其寫入文件中。確保打開文件「 wb」(寫二進位文件)形式

image_count = 1for image in image_src: with open('image_'+str(image_count)+'.jpg', 'wb') as f: res = requests.get(image) f.write(res.content) image_count = image_count+1

你還可以按頁碼更新初始頁面URL,並反覆請求它們以收集大量數據。

在頁面加載時抓取數據

讓我們看一下Steam社區Grant Theft Auto V Reviews的網頁。你會注意到網頁的完整內容不會一口氣加載。

https://steamcommunity.com/app/271590/reviews/?browsefilter=toprated&snr=1_5_100010_我們需要向下滾動以在網頁上加載更多內容。這是網站後端開發人員使用的一種稱為「延遲加載」的優化技術。

但是對我們來說,問題是,當我們嘗試從該頁面抓取數據時,我們只會得到該頁面的有限內容:

一些網站還創建了「加載更多」按鈕,而不是無休止的滾動想法。僅當你單擊該按鈕時,它將加載更多內容。內容有限的問題仍然存在。因此,讓我們看看如何抓取這些網頁。

導航到目標URL並打開「檢查元素網絡」窗口。接下來,點擊重新加載按鈕,它將為你記錄網絡,如圖像加載,API請求,POST請求等的順序。

清除當前記錄並向下滾動。你會注意到,向下滾動時,該網頁正在發送更多數據的請求:

進一步滾動,你將看到網站發出請求的方式。查看以下URL——僅某些參數值正在更改,你可以通過簡單的Python代碼輕鬆生成這些URL:

你需要按照相同的步驟來抓取和存儲數據,方法是將請求一頁一頁地發送到每個頁面。

尾注

這是使用功能強大的BeautifulSoup庫對Python中的網絡抓取進行的簡單且對初學者友好的介紹。老實說,當我正在尋找一個新項目或需要一個現有項目的信息時,我發現網絡抓取非常有用。

注意:如果你想以更結構化的形式學習本教程,我們有一個免費課程,我們將教授網絡抓取BeatifulSoup。你可以在此處查看—— 使用Python進行Web爬網簡介。

https://courses.analyticsvidhya.com/courses/introduction-to-web-scraping如前所述,還有其他一些庫可用於執行Web抓取。我很想聽聽你更喜歡的庫的想法(即使你使用R語言!),以及你對該主題的經驗。在下面的評論部分中告訴我,我們將與你聯繫!

相關焦點

  • 用Python進行Web爬取數據
    我個人發現網絡抓取是一種非常有用的技術,可以從多個網站收集數據。如今,某些網站還為你可能希望使用的許多不同類型的數據提供API,例如Tweets或LinkedIn帖子。目錄3個流行的工具和庫,用於Python中的Web爬蟲Web爬網的組件 Crawl Parse and Transform Store從網頁中爬取URL和電子郵件ID爬取圖片在頁面加載時抓取數據
  • python爬取數據存入資料庫
    昨天本來寫了一篇關於python爬取的文章,結果沒通過,正好今天一起吧。用python同時實現爬取,和存入資料庫,算是複習一下前面操作資料庫的知識。1、準備工作既然是爬取,那自然要連接到爬取的頁面,所以需要requests庫。
  • Python爬蟲教程 Python爬取股票數據過程詳解
    這篇文章主要介紹了基於Python爬取股票數據過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下基本環境配置python 3.6一切的一切都在圖裡找到數據了
  • 用python爬取天氣並且語言播報
    一、 預備知識此案例實現功能:利用網絡爬蟲,爬取某地的天氣,並列印和語音播報 。我們寫的爬蟲一般會默認告訴伺服器,自己發送一個Python爬取請求,而很多的網站都會設置反爬蟲的機制,不允許被爬蟲訪問的。
  • 爬取拉勾網數據並進行數據可視化
    ,待爬取的python工程師職位信息如下:,所以我們在爬取的過程中會加上頭信息,頭信息也是我們通過分析網頁獲取到的,通過網頁分析我們知道該請求的頭信息,以及請求的信息和請求的方式是POST請求,這樣我們就可以該url請求拿到我們想的數據做進一步處理
  • 用python分析上海二手房數據,用幾十行代碼爬取大規模數據!
    add': add.get_text(), 'area': area.get_text(), 'price': price.get_text(), 'danjia': danjia.get_text(), 'author': author.get_text(), 'tag': list(tag.stripped_strings) } print(data)3、調用spider_1函數爬取指定網頁
  • 微軟Excel和Python都能爬取網頁信息,你該怎麼選?
    最近體驗了一下Excel(PowerBI Desktop)爬取網頁信息的能力,基於這些體驗也寫了幾個帖子,對Excel(PowerBI Desktop)爬取網頁的能力基本滿意。在Excel中,抓取網頁的操作路徑是:數據-新建查詢-自web。
  • 簡單一文教你如何用python爬蟲爬取扇貝單詞
    那麼就嘗試爬取一下這個網頁!一、網頁分析我們打開此網站之後,通過以往爬取網頁的經驗,會發現此網頁特別容易爬取。大概查看了網頁,我們只需爬取單詞和含義即可小編是一名python開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。想要這些資料的可以關注小編,並在後臺私信小編:「01」即可領取。
  • 使用requests爬取拉勾網python職位數據
    Requests簡介 Requests是一款目前非常流行的http請求庫,使用python編寫,能非常方便的對網頁Requests進行爬取。官網裡介紹說:Requests is an elegant and simple HTTP library for Python, built for human beings.
  • Python爬取分析拉勾網職位數據
    數據中蘊藏著大量的價值等待挖掘,這是當前大家都承認的事實。然而對於我們個人,怎樣利用這一點給自己創造價值呢?擋在這面前的第一點,就是得有數據。對個人來說,爬蟲是獲取數據的非常遍歷的方式,得到數據之後,我們可以進行一些數據分析、統計,然後用於指導我們的學習、工作、副業的方向。
  • 數據分析硬核技能:用 Python 爬取網頁
    編譯:歐剃作為數據科學家的第一個任務,就是做網頁爬取。那時候,我對使用代碼從網站上獲取數據這項技術完全一無所知,它偏偏又是最有邏輯性並且最容易獲得的數據來源。在幾次嘗試之後,網頁爬取對我來說就幾乎是種本能行為了。如今,它更成為了我幾乎每天都要用到的少數幾個技術之一。在今天的文章中,我將會用幾個簡單的例子,向大家展示如何爬取一個網站——比如從 Fast Track 上獲取 2018 年 100 強企業的信息。用腳本將獲取信息的過程自動化,不但能節省手動整理的時間,還能將所有企業數據整理在一個結構化的文件裡,方便進一步分析查詢。
  • python爬蟲系列教程,用python爬取全國範圍內的KFC店地址
    下面羽憶教程教你會python爬取全國範圍內的KFC店地址,這是一篇python爬蟲系列的教程,簡單又能讓人填飽肚子。python爬蟲介紹python發展至今,python爬蟲已經成為了一種職業,因為其可以幫助企業快速得到網絡上的最新信息,但是為什麼很多寫python爬蟲的程式設計師會面臨牢獄之災呢?
  • 實戰Python爬取拉勾網職位數據
    今天寫的這篇文章是關於python爬蟲簡單的一個使用,選取的爬取對象是著名的招聘網站——拉鉤網,由於和大家的職業息息相關,所以爬取拉鉤的數據進行分析,對於職業規劃和求職時的信息提供有很大的幫助。完成的效果爬取數據只是第一步,怎樣使用和分析數據也是一大重點,當然這不是本次博客的目的,由於本次只是一個上手的爬蟲程序,所以我們的最終目的只是爬取到拉鉤網的職位信息,然後保存到Mysql資料庫中。
  • 用Python爬取B站、騰訊視頻、愛奇藝和芒果TV視頻彈幕
    開發工程師,這裡有我自己整理的一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。海量的彈幕數據不僅可以繪製此類詞雲圖,還可以調用百度AI進行情感分析。那麼,我們該如何獲取彈幕數據呢?本文運用Python爬取B站視頻、騰訊視頻、芒果TV和愛奇藝視頻等彈幕,讓你輕鬆獲取主流視頻網站彈幕數據。
  • 大佬用Python爬取豆瓣電影——Top250,驚呆啦
    前言:網際網路行業在迅速發展,尤其是程式語言「Python」,在各大行業都居於重要位置,有了它人們的辦公效率大大提高,下面看看它的威力有多大用Python爬取豆瓣電影——top250,連最近最火的《我和我的家鄉
  • 租房子,光看數據怎麼夠,Python爬取某站租房圖片
    這段時間開始學習python爬蟲,今天周末無聊寫了一段代碼爬取上海租房圖片,其實很簡短就是利用爬蟲的第三方庫Requests與BeautifulSoup。python 版本:python3.6 ,IDE :pycharm。
  • 2020年度火熱開發實戰:python爬蟲爬取美女圖片
    岸圖網站裡有大量的高清圖片素材和壁紙,並且可以免費下載,讀者也可以根據自己需要爬取其他類型圖片,方法是類似的,本文通過python爬蟲批量下載網站裡的高清美女圖片,熟悉python寫爬蟲的基本方法:發送請求、獲取響應、解析並提取數據、保存到本地。
  • Python - python爬取新聞專題及常見問題 - CSDN
    最近,在數據挖掘課,要交課設了,打算做一個通過機器學習進行新聞分類,首先要有大量的文本(新聞),去做訓練,並通過爬蟲爬取大量的新聞一,思路如下:0.首先確定獲取數據的網站1.通過BeautifulSoup來切取連結2.
  • 財經熱詞:Python 爬取金十數據首頁,並生成詞雲
    背景用 Python 的 requests 模塊爬取金十數據首頁中間部分的資訊信息> 進行模塊安裝。爬取數據併入庫功能1.創建一個 MySQL',charset="utf8")cur = conn.cursor()##循環爬取並插入數據:結束條件是爬不到數據為止totalCount = 0Data=requests.get(url,queryParam,headers=header).json()['data']length = len(Data)while(length>0): for i
  • Excel與Python爬取數據,兩者PK,誰優誰劣?
    小夥伴們大家好~Excel和python作為當前兩款比較火的數據分析處理工具,兩者之間有很多共性也有很大的區別。今天一起來看下在抓取網頁數據這塊,兩者有什麼異同點。上圖中是中國證券監督管理委員會中滬市IPO公司的相關信息,我們需要提取其中的表格數據,分別利用Excel與python。ExcelExcel提供兩種獲取網頁數據的方法,第一種是 數據—自網站功能,第二種是Power Query。