小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

用Python進行Web爬取數據

 老三的休閑書屋 2020-12-05

介紹

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

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

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

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

用Python進行Web爬取數據

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

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

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

目錄

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

3個流行的工具和庫,用于Python中的Web爬蟲

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

BeautifulSoup

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

Scrapy

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

Selenium

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

Web爬網的組件

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

用Python進行Web爬取數據

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

用Python進行Web爬取數據

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

  • https://www./robots.txt
用Python進行Web爬取數據

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

第1步:Crawl(抓?。?/h2>

Web抓取的第一步是導航到目標網站并下載網頁的源代碼。我們將使用請求庫來執(zhí)行此操作。http.client和urlib2是另外兩個用于發(fā)出請求和下載源代碼的庫。

  • http.client:https://docs./3/library/http.client.html#module-http.client
  • urlib2:https://docs./2/library/urllib2.html

下載了網頁的源代碼后,我們需要過濾所需的內容:

'''Web Scraping - Beautiful Soup'''# importing required librariesimport requestsfrom bs4 import BeautifulSoupimport pandas as pd# target URL to scrapurl = 'https://www./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庫?,F在,如果你已經注意到我們的目標網頁,則與大多數網頁一樣,特定酒店的詳細信息也位于不同的卡片上。

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

用Python進行Web爬取數據

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

# 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)
用Python進行Web爬取數據

我們從網頁的完整源代碼中過濾出了卡數據,此處的每張卡都包含有關單獨酒店的信息。僅選擇酒店名稱,執(zhí)行“Inspect Element”步驟,并對房間價格執(zhí)行相同操作:

用Python進行Web爬取數據

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

標簽中提取。這是因為每張卡和房價只有一個 < 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)
用Python進行Web爬取數據

步驟3:Store(儲存數據)

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

接下來,讓我們繼續(xù)將此列表轉換為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)
用Python進行Web爬取數據

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

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

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

使用Web瀏覽器的控制臺

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

用Python進行Web爬取數據
  • 一直向下滾動,以便將所有用戶名都加載到瀏覽器內存中的后臺
  • 右鍵單擊瀏覽器窗口,然后單擊“檢查元素”
  • 在控制臺窗口中,鍵入以下命令:
urls = $$(‘a’); for (url in urls) console.log ( urls[url].href);
用Python進行Web爬取數據

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

用Python進行Web爬取數據
  • 接下來,將此列表保存在兩個不同的時間戳中,一個簡單的Python程序將使你知道兩者之間的區(qū)別。我們將能夠知道取消了我們的帳戶的用戶名!
  • 我們可以使用多種方法來簡化此任務。主要思想是,只需一行代碼,我們就可以一次性獲得所有URL。

使用Chrome擴展程序電子郵件提取器

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

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

用Python進行Web爬取數據

BeautifulSoup和正則表達式

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

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

  • https://id./auth/login/?next=https://www./blog/2019/10/web-scraping-hands-on-introduction-python

在Python中爬取圖片

在本節(jié)中,我們將從同一個Goibibibo網頁抓取所有圖片。第一步是導航到目標網站并下載源代碼。接下來,我們將使用 < img > 標簽查找所有圖像:

'''Web Scraping - Scrap Images'''# importing required librariesimport requestsfrom bs4 import BeautifulSoup# target URLurl = 'https://www./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)
用Python進行Web爬取數據

從所有圖像標簽中,僅選擇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)
用Python進行Web爬取數據

現在我們有了圖像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
用Python進行Web爬取數據

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

在頁面加載時抓取數據

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

  • https:///app/271590/reviews/?browsefilter=toprated&snr=1_5_100010_

我們需要向下滾動以在網頁上加載更多內容。這是網站后端開發(fā)人員使用的一種稱為“延遲加載”的優(yōu)化技術。

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

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

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

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

用Python進行Web爬取數據

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

用Python進行Web爬取數據

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

尾注

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

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

  • https://courses./courses/introduction-to-web-scraping

如前所述,還有其他一些庫可用于執(zhí)行Web抓取。我很想聽聽你更喜歡的庫的想法(即使你使用R語言!),以及你對該主題的經驗。在下面的評論部分中告訴我,我們將與你聯(lián)系!

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多