1 数据采集概述

开始一个数据分析项目,首先需要做的就是get到原始数据,获得原始数据的方法有多种途径。比如:

  1. 获取数据集(dataset)文件
  2. 使用爬虫采集数据
  3. 直接获得excel、csv及其他数据文件
  4. 其他途径…

本次福布斯系列数据分析项目实战,数据采集方面,主要数据来源于使用爬虫进行数据采集,同时也辅助其他数据进行对比。

本文主要是介绍使用爬虫进行数据采集的思路和步骤。

本次采集的福布斯全球上市企业2000强排行榜数据,涉及年份从2007年到2017年,跨越10多年。

本次采集的目标网站,是多个网页,但多个网页的分布结构都有所不同,虽然思路和步骤都差不多,但需要分开来编写,分别采集。

2 数据采集步骤

数据采集大体分为几步:

  1. 目标主网页内容的Download
  2. 主网页上数据的采集
  3. 主网页上其他分发页面网站链接的采集
  4. 各分发网页数据的download与采集
  5. 将采集的数据保存

涉及到的python库包括,requests、BeautifulSoup以及csv。 下面以采集某年的数据为案例,来描述下数据采集的步骤。

import requests
from bs4 import BeautifulSoup
import csv

2.1 数据Download模块

主要是基于 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

这个模块会在主网页数据下载,以及各个分页面数据下载时使用,是一个比较通用的模块。

2.2 主网页上数据的采集

主网页的页面结构,主要分为两个部分,一类是包含其他页面数据的网页链接,一类是主网页上的公司数据列表,以表格形式在网页上显示。

用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

2.3 各个分发页面上的数据采集

步骤也是 网页页面下载 和表格类数据爬取。 代码内容跟主网页页面类似,只是细节上有些差异,这里就不作赘述了。

2.4 数据存储

采集的数据,最后保存到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)

2.5 数据采集主函数

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()

3 总结

本文只介绍了数据采集的思路与各个模块,并没有提供目标网页的链接, 一方面由于原始网页的数据信息比较杂乱,采集的时候需要写多个采集程序,另外一方面,由于我们的重点在于后续的数据分析部分,希望不要着重于数据爬取。

在后续的分析过程中,我们会来查看数据的结构、数据完整性及相关信息,欢迎关注微信公众号(ID:PyDataRoad)。

本期推荐阅读:

Python项目实战:福布斯系列之数据采集的更多相关文章

  1. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  2. Jenkins部署Python项目实战

    一.背景 我们工作中常用Jenkins部署Java代码,因其灵活的插件特性,例如jdk,maven,ant等使得java项目编译后上线部署一气呵成,同样对于脚本语言类型如Python上线部署,利用Je ...

  3. 4.Python项目实战

    这里会每个周更新一个Python的大练习,作为 实战项目... elk

  4. Python项目实战

    编程只有不断练习才能掌握其精髓,多练练网上的习题和项目,才能掌握python的精髓. Python的模块和包是出了名的多,因此你不必自己从底层开始写起,只需要看懂模块和包的使用文档就可以了,因此掌握一 ...

  5. 【Python项目实战】Pandas:让你像写SQL一样做数据分析(一)

    1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...

  6. python项目实战-小游戏1

    项目规则: 1.玩家和敌人分别从现有的角色中选择3个角色 2.随机生成目前的血量,和攻击量 3.游戏规则:当玩家向敌人发起攻击,敌人当前的血量=之前的血量-玩家的血量,同理 4.3局两胜 5.自定义玩 ...

  7. python 项目实战之备份文件夹并且压缩文件夹及下面的文件

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/11/12 14:21 # @Author : zoulixiang # @S ...

  8. python 项目实战之Django 邮件发送

    发送邮件¶ 虽然 Python 借助 smtplib 模块简化了发送邮件的流程,但是 Django 在其基础上提供了更简化的支持.这些封装意在加快邮件发送,方便在开发时测试发送邮件,在不支持 SMTP ...

  9. python 项目实战之logging日志打印

    官网介绍:https://docs.python.org/2/library/logging.html 一. 基础使用 1.1 logging使用场景 日志是什么?这个不用多解释.百分之九十的程序都需 ...

随机推荐

  1. 数据库MySQL纯净卸载

    有些人在安装MySQL后,卸载后再次安装时,一直安装不上去,到最后不得不重装系统来安装MySQL.这里教大家如何将MySQL卸载干净,不影响下次安装. 卸载过程 1.停止mysql服务 2.进行卸载 ...

  2. 史上最完整Hadoop2.x完全分布式安装部署-小白也能学会

    一.环境要求: 1.        虚拟机安装并设置网络: 2.        修改主机地址映射: 3.        必备软件:Jdk.Development Tools   Development ...

  3. Android Apk的反编译和加密

    这几天在上海出差,忙里偷闲学习了一下Apk的反编译工具的基本使用.下面就简单介绍一下如何将我们从网上下载的Apk文件进行反编译得到我们想要获得的资源文件和源码. Android的应用程序APK文件说到 ...

  4. 【数据库】Mean web开发 02-Windows下Mongodb安装配置及常用客户端管理工具

    简介 Mean是JavaScript的全栈开发框架.更多介绍 用MongoDB实现持久数据的存储是Mean Web全栈开发中的一部分. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非 ...

  5. 百度导航试用 vs 高德导航

    听说百度导航免费了,下载试用了一下: HUD模式不错,但是需要一个手机支架或挂钩.尤其是HUD景象模式,夜间把手机平放,通过前挡风玻璃反射看.这个功能有点乔布斯的感觉了. 不过路径规划还差一点,和凯立 ...

  6. HTML+CSS·经常使用的设计方法

    HTML+CSS·经常使用的设计方法: ======================================================= margin[外] = = padding[内] ...

  7. docker- 构建 oracle2c-r2(12.2.0.1) 的镜像

    需求 由于公司要数据库需要使用新的oracle版本(12c-r2 ->12.2.0.1),需要从之前的oracle11g迁移到12c.所以,我们今天就先来介绍一下如何构建oracle12c的镜像 ...

  8. Bash启动选项

    Bash选项可以用来控制它的行为,有两种选项:单字符选项和多字符选项,多字符选项必须出现在单字符选项以前.1)单字符选项:由一个减号和一个字符组成2)多字符选项:由两个减号和多个字符组成 常用选项:- ...

  9. 用Emacs收发邮件

    使用Emacs,将尽可能多的工作放到Emacs中来完成,这样可以提高工作效率. 1.安装必要的LISP插件和程序 $sudo apt-get install stunnel4 $sudo apt-ge ...

  10. 教你轻轻松松入门PHP

    入门PHP不用愁,跟我来学一学. 1.我们想学习PHP,首先就要了解PHP,那PHP是什么呢? PHP("PHP: Hypertext Preprocessor",超文本预处理器的 ...