天天看點

利用Python進行網頁抓取

網絡爬蟲的好處

将爬蟲過程自動化,避免了手工收集資料,節省時間,還可以讓所有資料都放在一個結構化檔案中。

網頁抓取常見python 庫

● Beautiful Soup

● Requests

● Scrapy

● Selenium

網絡爬蟲的步驟

● 連接配接到網頁

● 使用BeautifulSoup解析html

● 循環通過soup對象找到元素

● 執行一些簡單的資料清理

● 将資料寫入csv

執行個體分析–利用Beautiful Soup從Fast Track上收集2018年百強公司的資料(http://www.fasttrack.co.uk/)

利用Python進行網頁抓取

使用Beautiful Soup解析網頁html

  • step1:導入将用于網絡爬蟲的庫

    BeautifulSoup,有助于我們處理html;我們導入的下一個庫是urllib,它連接配接到網頁;最後,我們将輸出寫入csv,是以我們還需要導入csv 庫。

    #導入庫

    from bs4 import BeautifulSoup

    import urllib.request

    import csv

  • step2:定義正在抓取的網址

    位址欄中的完整url:

    urlpage = ‘http://www.fasttrack.co.uk/league-tables/tech-track-100/league-table/’

  • step3:建立與網頁的連接配接,使用BeautifulSoup解析html,将對象存儲在變量’soup’中:
  • step4:查詢網站并将HTML傳回到變量“頁面”

    page = urllib.request.urlopen(urlpage)

    #使用beautiful soup 解釋 HTML并存儲在變量’soup’中

    soup = BeautifulSoup(page, ‘html.parser’)

    列印soup變量,它應該傳回我們請求網頁的完整解析的html。

    print(soup)

搜尋html元素

  • 使用find 方法搜尋表的soup對象

    table = soup.find(‘table’, attrs={‘class’: ‘tableSorter’})

  • 然後再使用find_all 方法查找表中的每一行

    results = table.find_all(‘tr’)

    print(‘Number of results’, len(results))

循環周遊元素并儲存變量

  • 定義rows表格和列名

    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是額外的字段

  • 循環中查找結果:

    #循環結果

    for result in results:

    #找到每個結果的所有列

    data = result.find_all(‘td’)

    #檢查列是否有資料

    if len(data) == 0:

    continue

  • 處理資料并儲存到變量中。

    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 有兩個字段,用find方法儲存元素(隻含公司名稱)

    companyname = data[1].find(‘span’, attrs={‘class’:‘company-name’}).getText()

    然後使用strip 或replace 從company 變量中删除公司名稱,這樣它隻留下描述

    description = company.replace(companyname, ‘’)

    sales = sales.strip(’*’).strip(’†’).replace(’,’,’’)

從每個表中抓取url并将其儲存為變量,使用與上面相同的步驟:

● 在fast track網站上找到具有公司頁面網址的元素

● 向每個公司頁面網址送出請求

● 使用Beautifulsoup解析html

● 找到感興趣的元素

第二列包含指向另一個頁面的連結,該頁面具有每個公司的概述, 每個公司頁面都有一個表格,大部分時間都包含公司網站(網址位于表格的最後一行,是以我們可以在最後一行内搜尋)

#連接配接并摘取公司網站

url = data[1].find(‘a’).get(‘href’)

page = urllib.request.urlopen(url)

#解析HTML

soup = BeautifulSoup(page, ‘html.parser’)

#查找表中的最後結果并獲得連結

try:

tableRow = soup.find(‘table’).find_all(‘tr’)[-1]

webpage = tableRow.find(‘a’).get(‘href’)

except:

webpage = None

(有可能出現公司網站未顯示的情況,使用try except條件,以防萬一找不到網址)

利用Python進行網頁抓取

寫入輸出檔案

with open(‘techtrack100.csv’,‘w’, newline=’’) as f_output:

csv_output = csv.writer(f_output)

csv_output.writerows(rows)

參考https://github.com/kaparker/tutorials/blob/master/pythonscraper/websitescrapefasttrack.py

雲栖社群合作夥伴Kerry Parker

繼續閱讀