福布斯系列之数据采集 | Python数据分析项目实战

这里写图片描述

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 总结

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

在后续的分析过程中,我们会来查看数据的结构、数据完整性及相关信息,欢迎继续关注。

如果您喜欢我的文章,欢迎关注我的微信公众号“Python数据之道”(ID:PyDataRoad)。

展开阅读全文

150讲轻松搞定Python网络爬虫

05-16
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。   从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值