用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库:

# _*_ coding: utf-8 _*_'''# Code based on Python 3.x# Author: "LEMON"# 微信公众号ID:PyDataRoad'''import requestsfrom bs4 import BeautifulSoupimport csv

模块:页面Download

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

def download(url):    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'}    response = requests.get(url,headers=headers)    # print(response.status_code)    return response.text

模块:企业表格信息

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

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

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

ddef get_content_first_page(html, country='China'):    '''    获取China的公司列表,且包含表头    '''    soup = BeautifulSoup(html, 'lxml')    body = soup.body    label_div = body.find('div', {'class': 'content post'})    tables = label_div.find_all('table')    # tables一共有2个,第一个才是我们想要的数据    trs = tables[0].find_all('tr')    # 获取标题行信息    row_title = [td.text for td in trs[0].find_all('td')]    row_title.insert(2, 'Country')    data_list = []    data_list.append(row_title)    for i, tr in enumerate(trs):        if i == 0:            continue        tds = tr.find_all('td')        # 获取公司排名及列表        row = [ item.text.strip() for item in tds]        row.insert(2, country)        data_list.append(row)    return data_list

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

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

def get_country_info(html):    '''    获取除China外其他国家的网页链接及国家名称    '''    soup = BeautifulSoup(html, 'lxml')    body = soup.body    label_div = body.find('div', {'class': 'content post'})    tables = label_div.find_all('table')    label_a = tables[1].find_all('a')    country_names = [item.text for item in label_a]    page_urls = [ item.get('href') for item in label_a]    country_info = list(zip(country_names, page_urls))    return country_info

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

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

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

代码就不作赘述了。

模块:信息保存

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

def save_data_to_csv_file(data, file_name):    '''    保存数据到csv文件中    '''    with open(file_name, 'a', errors='ignore', newline='') as f:        f_csv = csv.writer(f)        f_csv.writerows(data)

编写网页爬取主函数文件

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

def get_forbes_global_year_2013():    url = 'http://www.economywatch.com/companies/forbes-list/china.html'    html = download(url)    # print(html)    data_first_page = get_content_first_page(html)    # print(data_first_page)    print('saving data ...', 'China')    save_data_to_csv_file(data_first_page, 'forbes_economywatch_2013.csv')    country_info = get_country_info(html)    # print(country_info)    for item in country_info:        country_name = item[0]        country_url = item[1]        if country_name == 'China':            continue        html = download(country_url)        data_other_country = get_content_other_country(html, country_name)        # print(data_other_country)        print('saving data ...', country_name)        save_data_to_csv_file(data_other_country, 'forbes_economywatch_2013.csv')if __name__ == '__main__':    # get data from Forbes Global 2000 in Year 2013    get_forbes_global_year_2013()

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

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

2 其他数据源收集

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

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

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

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

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

推荐阅读:

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

  • 福布斯系列之数据采集

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

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

  • python求职Top10城市,来看看是否有你所在的城市

  • Pandas: 如何将一列中的文本拆分为多行?

  • 2017年上半年过去了,你读了多少本书?



©著作权归作者所有:来自51CTO博客作者mb5fe18e7c44408的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 福布斯系列之数据完整性检查 | Python数据分析项目实战
  2. 福布斯系列之数据清洗(1) | Python数据分析项目实战
  3. 想做疫情分析却没有数据?看这篇就够了
  4. LeetCode数据库篇|181超过经理收入的员工
  5. 实战|Python数据分析可视化并打包
  6. LeetCode数据库篇|175组合两个表
  7. 一道Leetcode数据库题的三种解法|文末送书
  8. 你在的城市撒币了吗?Python爬取全国各城市消费券发放数据并分析
  9. 玩转数据处理120题重制说明与下载

随机推荐

  1. 自学Python1.5-Centos内python2识别中文
  2. Python3 函数式编程(高阶函数)
  3. 开发者实验室体验之文智自然语言处理SDK
  4. Python 3.4:试图让这个模块对这个2d数组中
  5. 在运行期间计算python中GradientBoosting
  6. 【Python】【matplotlib】面向对象方式绘
  7. 【Python深入】Python中继承object和不继
  8. 在Python中接收16位整数。
  9. [LeetCode]题解(python):002-Add Two Number
  10. [置顶] Python-uiautomator使用说