开始一个数据分析项目,首先需要做的就是 get 到原始数据,获得原始数据的方法有多种途径。比如:
本次福布斯系列数据分析项目实战,数据采集方面,主要数据来源于使用爬虫进行数据采集,同时也辅助其他数据进行对比。
本文主要是介绍使用爬虫进行数据采集的思路和步骤。
本次采集的福布斯全球上市企业 2000 强排行榜数据,涉及年份从 2007 年到 2017 年,跨越 10 多年。
本次采集的目标网站,是多个网页,但多个网页的分布结构都有所不同,虽然思路和步骤都差不多,但需要分开来编写,分别采集。
数据采集大体分为几步:
涉及到的 python 库包括,requests、BeautifulSoup 以及 csv。 下面以采集某年的数据为案例,来描述下数据采集的步骤。
- import requests from bs4 import BeautifulSoup import csv
主要是基于 requests,代码如下:
这个模块会在主网页数据下载,以及各个分页面数据下载时使用,是一个比较通用的模块。
主网页的页面结构,主要分为两个部分,一类是包含其他页面数据的网页链接,一类是主网页上的公司数据列表,以表格形式在网页上显示。
用 BeautifulSoup 可以把这些数据解析出来。 代码模块如下:
- def get_content_first_page(html, year) : '''
- 获取排名在1-100的公司列表,且包含表头
- '''soup = BeautifulSoup(html, 'lxml') body = soup.body body_content = body.find('div', {
- 'id': 'bodyContent'
- }) tables = body_content.find_all('table', {
- 'class': 'XXXXtable'
- })
- #tables一共有3个,最后一个才是我们想要的trs = tables[ - 1].find_all('tr')
- #获取表头名称#trs[1],
- 这里跟其他年份不一样row_title = [item.text.strip() for item in trs[1].find_all('th')] row_title.insert(0, '年份')
- rank_list = [] rank_list.append(row_title) for i,
- tr in enumerate(trs) : if i == 0 or i == 1 : continue tds = tr.find_all('td')
- #获取公司排名及列表row = [item.text.strip() for item in tds] row.insert(0, year) rank_list.append(row) return rank_list
- def get_page_urls(html) : '''
- 获取排名在101-2000的公司的网页链接
- '''soup = BeautifulSoup(html, 'lxml') body = soup.body body_content = body.find('div', {
- 'id': 'bodyContent'
- }) label_div = body_content.find('div', {
- 'align': 'center'
- }) label_a = label_div.find('p').find('b').find_all('a')
- page_urls = ['basic_url' + item.get('href') for item in label_a]
- return page_urls
步骤也是 网页页面下载 和表格类数据爬取。 代码内容跟主网页页面类似,只是细节上有些差异,这里就不作赘述了。
采集的数据,最后保存到 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_2007(year = 2007) :
- url = 'url'html = download(url)#print(html)
- data_first_page = get_content_first_page(html, year)#print(data_first_page) save_data_to_csv_file(data_first_page, 'forbes_' + str(year) + '.csv')
- page_urls = get_page_urls(html)#print(page_urls)
- for url in page_urls: html = download(url) data_other_page = get_content_other_page(html, year)#print(data_other_page) print('saving data ...', url) save_data_to_csv_file(data_other_page, 'forbes_' + str(year) + '.csv')
- if __name__ == '__main__':
- #get data from Forbes Global 2000 in Year 2009 get_forbes_global_year_2007()
本文只介绍了数据采集的思路与各个模块,并没有提供目标网页的链接, 一方面由于原始网页的数据信息比较杂乱,采集的时候需要写多个采集程序,另外一方面,由于我们的重点在于后续的数据分析部分,希望不要着重于数据爬取。
在后续的分析过程中,我们会来查看数据的结构、数据完整性及相关信息,欢迎关注微信公众号(ID:PyDataRoad)。
本期推荐阅读:
来源: http://www.cnblogs.com/lemonbit/p/7220319.html