开始一个数据分析项目,首先须要作的就是get到原始数据,得到原始数据的方法有多种途径。好比:html
本次福布斯系列数据分析项目实战,数据采集方面,主要数据来源于使用爬虫进行数据采集,同时也辅助其余数据进行对比。python
本文主要是介绍使用爬虫进行数据采集的思路和步骤。c++
本次采集的福布斯全球上市企业2000强排行榜数据,涉及年份从2007年到2017年,跨越10多年。微信
本次采集的目标网站,是多个网页,但多个网页的分布结构都有所不一样,虽然思路和步骤都差很少,但须要分开来编写,分别采集。markdown
数据采集大致分为几步:app
涉及到的python库包括,requests、BeautifulSoup以及csv。 下面以采集某年的数据为案例,来描述下数据采集的步骤。函数
import requests
from bs4 import BeautifulSoup
import csv
主要是基于 requests,代码以下:网站
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
这个模块会在主网页数据下载,以及各个分页面数据下载时使用,是一个比较通用的模块。ui
主网页的页面结构,主要分为两个部分,一类是包含其余页面数据的网页连接,一类是主网页上的公司数据列表,以表格形式在网页上显示。lua
用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)。
本期推荐阅读: