福布斯系列之补充数据收集 | Python数据分析项目实战
用Python进行数据分析项目实战之福布斯系列文章,目前已发布的相关文章如下:
福布斯系列之数据分析思路篇
福布斯系列之数据采集
福布斯系列之数据完整性检查 | Python数据分析项目实战
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
先打开网站,来查看数据情况,在这个页面上,我们关心的内容主要有两个部分。
某个国家的数据列表,即数据表格。
获得所有国家的信息列表的网页链接,方便后续从这些网页中爬取相关国家的数据。
这两部分在网站上对应的情况如下图所示:
本次数据爬取大体分为几步:
起始页面内容的爬取
起始页面上其他国家的网站链接的采集
其他国家的网页数据的download与企业列表数据信息采集
将采集的数据保存
涉及到的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年上半年过去了,你读了多少本书?
更多相关文章
- 福布斯系列之数据完整性检查 | Python数据分析项目实战
- 福布斯系列之数据清洗(1) | Python数据分析项目实战
- 想做疫情分析却没有数据?看这篇就够了
- LeetCode数据库篇|181超过经理收入的员工
- 实战|Python数据分析可视化并打包
- LeetCode数据库篇|175组合两个表
- 一道Leetcode数据库题的三种解法|文末送书
- 你在的城市撒币了吗?Python爬取全国各城市消费券发放数据并分析
- 玩转数据处理120题重制说明与下载