福布斯系列之數據採集 | Python數據分析項目實戰

1 數據採集概述

開始一個數據分析項目,首先需要做的就是get到原始數據,獲得原始數據的方法有多種途徑。比如:

  1. 獲取數據集(dataset)文件
  2. 使用爬蟲採集數據
  3. 直接獲得excel、csv及其他數據文件
  4. 其他途徑...

本次福布斯系列數據分析項目實戰,數據採集方面,主要數據來源於使用爬蟲進行數據採集,同時也輔助其他數據進行對比。

本文主要是介紹使用爬蟲進行數據採集的思路和步驟。

本次採集的福布斯全球上市企業2000強排行榜數據,涉及年份從2007年到2017年,跨越10多年。

本次採集的目標網站,是多個網頁,但多個網頁的分布結構都有所不同,雖然思路和步驟都差不多,但需要分開來編寫,分別採集。

2 數據採集步驟

數據採集大體分為幾步:

  1. 目標主網頁內容的Download
  2. 主網頁上數據的採集
  3. 主網頁上其他分發頁面網站鏈接的採集
  4. 各分髮網頁數據的download與採集
  5. 將採集的數據保存

涉及到的python庫包括,requests、BeautifulSoup以及csv。 下面以採集某年的數據為案例,來描述下數據採集的步驟。

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import csv

2.1 數據Download模塊

主要是基於 requests,代碼如下:

  1. def download(url):
  2. headers = {User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36}
  3. response = requests.get(url,headers=headers)
  4. # print(response.status_code)
  5. return response.text

這個模塊會在主網頁數據下載,以及各個分頁面數據下載時使用,是一個比較通用的模塊。

2.2 主網頁上數據的採集

主網頁的頁面結構,主要分為兩個部分,一類是包含其他頁面數據的網頁鏈接,一類是主網頁上的公司數據列表,以表格形式在網頁上顯示。

用BeautifulSoup可以把這些數據解析出來。 代碼模塊如下:

  • 解析主網頁上的公司數據列表信息
  1. def get_content_first_page(html, year):
  2. 獲取排名在1-100的公司列表,且包含表頭
  3. soup = BeautifulSoup(html, lxml)
  4. body = soup.body
  5. body_content = body.find(div, {id: bodyContent})
  6. tables = body_content.find_all(table, {class: XXXXtable})
  7. # tables一共有3個,最後一個才是我們想要的
  8. trs = tables[-1].find_all(tr)
  9. # 獲取表頭名稱
  10. # trs[1], 這裡跟其他年份不一樣
  11. row_title = [item.text.strip() for item in trs[1].find_all(th)]
  12. row_title.insert(0, 年份)
  13. rank_list = []
  14. rank_list.append(row_title)
  15. for i, tr in enumerate(trs):
  16. if i == 0 or i == 1:
  17. continue
  18. tds = tr.find_all(td)
  19. # 獲取公司排名及列表
  20. row = [ item.text.strip() for item in tds]
  21. row.insert(0, year)
  22. rank_list.append(row)
  23. return rank_list
  • 解析主網頁上其他頁面的網頁鏈接
  1. def get_page_urls(html):
  2. 獲取排名在101-2000的公司的網頁鏈接
  3. soup = BeautifulSoup(html, lxml)
  4. body = soup.body
  5. body_content = body.find(div, {id: bodyContent})
  6. label_div = body_content.find(div, {align:center})
  7. label_a = label_div.find(p).find(b).find_all(a)
  8. page_urls = [basic_url + item.get(href) for item in label_a]
  9. return page_urls

2.3 各個分發頁面上的數據採集

步驟也是 網頁頁面下載 和表格類數據爬取。 代碼內容跟主網頁頁面類似,只是細節上有些差異,這裡就不作贅述了。

2.4 數據存儲

採集的數據,最後保存到csv文件中。模塊代碼如下:

  1. def save_data_to_csv_file(data, file_name):
  2. 保存數據到csv文件中
  3. with open(file_name, a, errors=ignore, newline=) as f:
  4. f_csv = csv.writer(f)
  5. f_csv.writerows(data)

2.5 數據採集主函數

  1. def get_forbes_global_year_2007(year=2007):
  2. url = url
  3. html = download(url)
  4. # print(html)
  5. data_first_page = get_content_first_page(html, year)
  6. # print(data_first_page)
  7. save_data_to_csv_file(data_first_page, forbes_+str(year)+.csv)
  8. page_urls = get_page_urls(html)
  9. # print(page_urls)
  10. for url in page_urls:
  11. html = download(url)
  12. data_other_page = get_content_other_page(html, year)
  13. # print(data_other_page)
  14. print(saving data ..., url)
  15. save_data_to_csv_file(data_other_page, forbes_+str(year)+.csv)
  16. if __name__ == __main__:
  17. # get data from Forbes Global 2000 in Year 2009
  18. get_forbes_global_year_2007()

3 總結

本文只介紹了數據採集的思路與各個模塊,並沒有提供目標網頁的鏈接, 一方面由於原始網頁的數據信息比較雜亂,採集的時候需要寫多個採集程序,另外一方面,由於我們的重點在於後續的數據分析部分,希望不要著重於數據爬取。

在後續的分析過程中,我們會來查看數據的結構、數據完整性及相關信息,歡迎繼續關注。

如果您喜歡我的文章,歡迎關注我的微信公眾號「Python數據之道」(ID:PyDataRoad)。

推薦閱讀:

你猜簡書有多少名簽約作者?
Python筆記 · 基於72萬知乎用戶信息的數據可視化
Python爬蟲實戰之使用Scrapy爬起點網的完本小說
第四章:動態網頁抓取 (解析真實地址 + selenium)

TAG:Python | python爬虫 | 数据分析 |