查看原文
其他

福布斯系列之补充数据收集 | Python数据分析项目实战

LEMON Python数据之道 2022-04-24

用Python进行数据分析项目实战之福布斯系列文章,目前已发布的相关文章如下:

  1. 福布斯系列之数据分析思路篇

  2. 福布斯系列之数据采集

  3. 福布斯系列之数据完整性检查 | Python数据分析项目实战

  4. Pandas数据处理实战:福布斯全球上市企业排行榜数据整理

在上篇文章:《福布斯系列之数据完整性检查 | Python数据分析项目实战》,提到2013年的企业数量只有1991家,少于2000家。数据可能存在缺失与不完整。

于是,继续来寻找其他可用的数据源。

1 使用爬虫获取数据

通过网站搜索,发现Economy Watch网站有相关数据,且数据结构比较规范,质量较好,于是进行数据爬取。

网站地址如下:

  • Economy Watch:Forbes Global 2000: China's Largest Companies

  • http://www.economywatch.com/companies/forbes-list/china.html

先打开网站,来查看数据情况,在这个页面上,我们关心的内容主要有两个部分。

  1. 某个国家的数据列表,即数据表格。

  2. 获得所有国家的信息列表的网页链接,方便后续从这些网页中爬取相关国家的数据。

这两部分在网站上对应的情况如下图所示:

本次数据爬取大体分为几步:

  1. 起始页面内容的爬取

  2. 起始页面上其他国家的网站链接的采集

  3. 其他国家的网页数据的download与企业列表数据信息采集

  4. 将采集的数据保存

涉及到的python库主要包括requests、BeautifulSoup以及csv。

下面来描述下数据采集的步骤。

先引入相关python库:

  1. # _*_ coding: utf-8 _*_

  2. '''

  3. # Code based on Python 3.x

  4. # Author: "LEMON"

  5. # 微信公众号ID:PyDataRoad

  6. '''

  7. import requests

  8. from bs4 import BeautifulSoup

  9. import csv

模块:页面Download

网站页面download页面是一个通用的模块,在所有国家的数据获取时都要用到。代码如下:

  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

模块:企业表格信息

在分析完网页结构之后,首先我们来获取起始页面上的信息,分别包括国家的企业信息数据和其他国家的网页链接信息。

可以分为两个模块来实现这些信息的获取。

国家的企业列表表格上的信息获取的模块代码如下:

  1. def get_content_first_page(html, country='China'):

  2.    '''

  3.    获取China的公司列表,且包含表头

  4.    '''

  5.    soup = BeautifulSoup(html, 'lxml')

  6.    body = soup.body

  7.    label_div = body.find('div', {'class': 'content post'})

  8.    tables = label_div.find_all('table')

  9.    # tables一共有2个,第一个才是我们想要的数据

  10.    trs = tables[0].find_all('tr')

  11.    # 获取标题行信息

  12.    row_title = [td.text for td in trs[0].find_all('td')]

  13.    row_title.insert(2, 'Country')

  14.    data_list = []

  15.    data_list.append(row_title)

  16.    for i, tr in enumerate(trs):

  17.        if i == 0:

  18.            continue

  19.        tds = tr.find_all('td')

  20.        # 获取公司排名及列表

  21.        row = [ item.text.strip() for item in tds]

  22.        row.insert(2, country)

  23.        data_list.append(row)

  24.    return data_list

模块:其他国家的网页链接

从起始页面上获取其他国家的网页链接信息的模块如下:

  1. def get_country_info(html):

  2.    '''

  3.    获取除China外其他国家的网页链接及国家名称

  4.    '''

  5.    soup = BeautifulSoup(html, 'lxml')

  6.    body = soup.body

  7.    label_div = body.find('div', {'class': 'content post'})

  8.    tables = label_div.find_all('table')

  9.    label_a = tables[1].find_all('a')

  10.    country_names = [item.text for item in label_a]

  11.    page_urls = [ item.get('href') for item in label_a]

  12.    country_info = list(zip(country_names, page_urls))

  13.    return country_info

模块:其他国家的企业表格信息

对于其他国家而言,只需要在其对应的页面上获取企业列表信息即可,代码内容跟起始页面上的企业信息获取代码基本是一样的。

有一点差异,就是不需要再获取表格的标题信息了。

代码就不作赘述了。

模块:信息保存

由于信息量不大,且结构相对比较简单,保存到csv文件即可。

  1. def save_data_to_csv_file(data, file_name):

  2.    '''

  3.    保存数据到csv文件中

  4.    '''

  5.    with open(file_name, 'a', errors='ignore', newline='') as f:

  6.        f_csv = csv.writer(f)

  7.        f_csv.writerows(data)

编写网页爬取主函数文件

在各个模块编写好后,就可以在主函数里进行调用,从而爬取数据。如下:

  1. def get_forbes_global_year_2013():

  2.    url = 'http://www.economywatch.com/companies/forbes-list/china.html'

  3.    html = download(url)

  4.    # print(html)

  5.    data_first_page = get_content_first_page(html)

  6.    # print(data_first_page)

  7.    print('saving data ...', 'China')

  8.    save_data_to_csv_file(data_first_page, 'forbes_economywatch_2013.csv')

  9.    country_info = get_country_info(html)

  10.    # print(country_info)

  11.    for item in country_info:

  12.        country_name = item[0]

  13.        country_url = item[1]

  14.        if country_name == 'China':

  15.            continue

  16.        html = download(country_url)

  17.        data_other_country = get_content_other_country(html, country_name)

  18.        # print(data_other_country)

  19.        print('saving data ...', country_name)

  20.        save_data_to_csv_file(data_other_country, 'forbes_economywatch_2013.csv')

  21. if __name__ == '__main__':

  22.    # get data from Forbes Global 2000 in Year 2013

  23.    get_forbes_global_year_2013()

将数据爬取下来后,查看数据是否完整,通过pandas查看,发现Economy Watch上,2013年的企业数量只有 1984家,数据也不完整。

需要继续查找其他可靠的数据。

2 其他数据源收集

后来,在网站找到一个excel文件,发现其企业数量是2000家,初步认为数据是完整的。

在后续分析过程中,将会使用这个excel文件的企业数据信息。

所以说,数据收集的途径很多,关键是数据的质量要好,数据要完整,尽量少的出现异常情况。

至此,福布斯系列文章已经发布了多篇文章,接下来要进入数据清洗的深水区,欢迎大家持续关注~~

该转发的转发,该点赞的点赞,都不要吝啬,哈~~

推荐阅读:


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存