点击上方蓝色字体,关注我们

大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧。本期内容主要由智亿同学与政委联合推出。

前面几章大家学习了如何利用Python处理与清洗数据,如何探索性数据分析,以及如何利用统计与机器学习方法进行建模。但是,很明显我们忽视了一个最原始的问题:数据从何而来。没有数据,这就好比,你学了十八般武艺,可是没有让你施展的地方一样难受。大家不要忘记,提出问题,采集数据,然后才是你的十八般武艺的施展。本章将会讲解Python的爬虫模块,目的是让你学习的Python技术有用武之地。

爬虫,可能同学们都有所“耳闻”,但是对爬虫是什么还不甚了解。

爬虫,全称“网络蜘蛛”。爬虫能干什么呢?一言以蔽之,替代人工采集数据。比如,某吃货想挑选出西安全城的火锅店评分最高的前10家,怎么办呢?首先,得寻找一家在线点评网站,如百度糯米(网站截图如下所示)。

图7-1 百度糯米网站截图

每页25条数据,一共有8页,共计176条数据。

最原始的办法是,勤劳的鼠标左键 + ctrl+c 到excel中,再按评分排序。在数据量少、字段少的情况下,这么做的弊端可能并不明显。但是,现在如果需要店名、评分、人均、地址、优惠活动、营业时间、买家评论等等,恐怕再勤劳的同学也会勇敢的说“不”。

这时候爬虫就有了用武之地——自动化采集网页数据,存储成结构化的数据便于后续分析。数据采集,往往是数据科学实践的第一步——毕竟,巧妇难为无米之炊嘛!

从本章开始,让我们一起来揭开爬虫“神秘的面纱”。学习完本章后,希望同学们能在遇到这类机械性的体力劳动面前,勇敢的说“不”!

注意,本书定位是“入门+实战”,旨在让读者能够快速熟悉、快速上手。因此,只讲解最核心的知识点和函数使用,即使不了解背后原理,应对日常的数据采集也绰绰有余。对原理感兴趣的同学,请自行学习相关文档。

7.1 初级篇—单页面静态爬虫

本小节将学会:

●  了解网络请求的基本原理;

●  学习如何使用requests对网站发起请求;

●  了解网页的基本构成;

●  学习如何使用BeautifulSoup解析网页;

●  学习如何将解析结果存入文件;

学完以上,我们就能掌握最简单的爬虫。

在开始之前,请学习或下载:

●  Chrome浏览器

●  HTML的基础知识

http://www.w3school.com.cn/html/html_jianjie.asp

●  HTTP的基础知识

https://www.w3cschool.cn/http/u9ktefmo.html

仅需明白:

1.网页的元素都是由DOM树进行定位的。

2.网页的元素标记是用<>尖括号表示的,不同的标签有不同的效果。

3.HTTP的基本方法GET的工作原理。

建议先掌握以上知识再继续学习后续教程会更加顺畅。

本章运行环境为:Python3.5.2,requests2.19.1,bs4 4.6.0

7.1.1 入门 —— 一级页面采集第一步 寻找数据源

在现实情况下,只有充分了解数据分析的对象(如西安的火锅店为分析对象)才能开始寻找数据源。寻找数据源的过程不是一蹴而就的,不是仅从数据丰富度考虑数据源,往往需要对比分析,如爬取难度、爬取时间等,综合考虑后进行选取。

针对西安火锅团购数据,结合餐饮O2O平台的具体情况,有很多个备选平台:美团、大众点评、饿了么、口碑、百度糯米。

表7-1 各个平台的数据优劣势对比

从数据角度考虑,美团和大众点评的数据最为丰富,数据采集最有价值;然而,由于反爬虫机制严密,所需知识点已经超过本书作为“入门读物”的定位,所以并不适合初学者;口碑和饿了么由于没有网页端,爬取也较为困难;百度糯米的页面以静态为主,虽然数据丰富度不够,但比较适合初学者。

综合以上考虑,本书以百度糯米作为数据源进行爬取。

第二步 分析网站请求流程

确定了数据源后,第二步是分析网站的请求流程。

所有的互联网应用,用户首先感知到或者能接触到的一定是URL,即网址。只有通过网址才能发起对资源的请求,即网址的作用是替用户定位资源。因此,请求流程的分析一定是围绕分析URL的构成而展开的。

首先,进入百度糯米的西安页面(URL1) https://xa.nuomi.com/

图7-2 百度糯米西安首页

点击“火锅”分类,进入火锅的列表页。可以看到,页面的URL (URL2) 变成了https://xa.nuomi.com/364。数字“364”,暂且称为火锅的分类ID号。

图7-3 百度糯米列表页

这时候,推荐使用Chrome浏览器(其他浏览器也可,但调试界面可能并没有Chrome清楚直观),在页面空白处点击鼠标右键(或ctrl+shift+I),点击Inpect,调起Chrome 开发者工具。

图7-4 审查网页元素

点击弹出面板左上角的“鼠标”按钮(选中后可定位HTML的元素位置)。选中商家信息的列表,我们也找到了每一个商家信息所对应的HTML代码。

图7-5 找到对应网页元素

接下来,我们通过编写第一个爬虫脚本采集这些数据。

第三步 解析网站代码

通过第二步的分析,聪明的你就已经大致明白爬取思路是:1. 先爬取分类ID号(火锅分类是364),用于构造列表页请求的URL;2.再解析每一个分类下的商家列表信息。

●  爬取分类ID号

表7-2 需要用到的API

例7-2

import requests

from bs4 import BeautifulSoup

url = 'https://xa.nuomi.com/364'

# 1. 向上述url发起HTTP请求

html = requests.get(url=url)

# 2. 转换解析网页的编码方式

html.encoding = html.apparent_encoding

# 3. 将请求的html解析成DOM树

soup = BeautifulSoup(html.text, 'lxml')

# 4. 寻找元素所在位置,并提取

shop_list = soup.select('#j-goods-area > div.shop-infoo-list > ul > li')

shop_dict = {}

for shop in shop_list:

    name = shop.select('a:nth-of-type(2) > h3')[0].get_text()

    score = shop.find('span', {"class": 'shop-infoo-list-color-gold'})

    if score is None:

       continue

    else:

       score = score.text

    shop_dict[name] = score

# 5. 打印结果

print(shop_dict)

运行结果如下图7-6。

图7-6 采集结果

注意:步骤2中,网页声明的编码方式可能与网页真实的编码不一致,需要进行显式转换。有时这么做仍然会失败,具体会在本章末尾介绍方法。

步骤2中,获取的html变量包含诸多属性,常见的有

表7-3 常见属性

步骤3中,'lxml'是常用的解析方式,足以满足常见的网站解析,这里不再赘述。

步骤4中,解析的css\xpath路径可通过Chrome开发者工具直接粘贴复制,如下图。

图7-7 网页开发工具使用

表7-4 BeautifulSoup的常用方法包括

解析元素位置后,得到的仍然是html代码,我们需要进一步将其转化成需要的数据。

表7-5

但是要注意:

1.如果标签是多个重复的格式(如、

),需要将从Chrome浏览器中复制出来的值中,包含nth-child的部分改成nth-of-type(这是CSS的区别,只需记住就可以了)。

2.经常会出现解析的css\xpath路径解析结果为空的情况,这需要不断调整解析的路径。如果调整路径还不成功,当跳过这部分数据量不大的情况下,可考虑直接跳过为空的部分(我们并不应该企图把所有数据一条不落的爬下来,而应该对比调整爬虫的时间和损失的数据量对比,综合各种因素进行选择)。

第四步 存储页面和数据

一般来说,要先爬取完页面,存成本地文件,再解析,这样防止出错又要重新爬。在上面代码中添加一段存储的代码,以及把解析结果存成pandas保存起来。

例7-3 存储页面和数据

import requests

from bs4 import BeautifulSoup

url = 'https://xa.nuomi.com/364'

# 1. 向上述url发起HTTP请求

html = requests.get(url=url)

# 2. 转换解析网页的编码方式

html.encoding = html.apparent_encoding

# 3. 存储静态页面

if html.status_code == 200:

    with open('364.html', 'w+', encoding='utf8') as f:

        f.write(html.text)

else:

    print('状态码非200,请求出错')

# 4. 读取静态页面

with open('364.html', 'r', encoding='utf8') as f: 

    content = f.read()

# 5. 将请求的html解析成DOM树

soup = BeautifulSoup(html.text, 'lxml')

# 6. 寻找元素所在位置,并提取

shop_list = soup.select('#j-goods-area > div.shop-infoo-list > ul > li')

shop_dict = {}

for shop in shop_list:

    name = shop.select('a:nth-of-type(2) > h3')[0].get_text()

    score = shop.find('span', {"class": 'shop-infoo-list-color-gold'})

    if score is None:

       continue

    else:

       score = score.text

    shop_dict[name] = score

# 5. 打印结果

print(shop_dict)

# 6. 转变成DataFrame并存储成excel

import pandas as pd 

results = pd.DataFrame([value for value in shop_dict.values()], index=shop_dict.keys(), columns=['评分'])

results.index.name = '店名'

print(results) 

results.to_excel('364.xlsx', encoding='utf8')

最终结果如下图7-8。

图7-8 pandas读取解析结果

注意,这个例子在解析之前,先将html存成本地文件,再读取,这样可以很大程度上避免在爬取时网络请求出错,而导致程序中断,此时所有数据都得重新爬取,得不偿失。

最后,将解析的结果转变成DataFrame结构存储成excel(后面章节还会讲述存储到数据库中的方法)。

7.1.2 进阶 —— 二级页面采集

然而,这只是一级界面,我们往往需要更加详细的信息,也就是列表页点进具体某个商家的详情页。这里,我们点击“一尊黄牛”,发现URL的变化成了https://www.nuomi.com/shop/10811751

图7-9 商家详情页

显然,这个URL后面这串数字代表商家的ID号,这个URL必然在列表页中可寻找。首先,回到列表页。然后,打开开发者工具查看元素。不难发现,a标签中的href属性就是需要得到的URL。那么如何提取出来呢?可使用上表提到的.get()方法。

图7-10 网页开发工具使用

例7-4

shop_dict = {}

for shop in shop_list:

    name = shop.select('a:nth-of-type(2) > h3')[0].get_text()

    href = 'http:' + shop.select('a:nth-of-type(2)')[0].get('href')

    score = shop.find('span', {"class": 'shop-infoo-list-color-gold'})

    if score is None:

        continue

    else:

        score = score.text 

    shop_dict[name] = [score, href]

最终结果展示如下图为:

图7-11 解析结果

可以看到,所有商家的URL都提取了出来。读者只需要再次构造HTTP请求,对这些URL返回的结果进行解析、存储即可,这里不再赘述。

好了今天就先讲到这里。

▼往期精彩回顾▼初步搭建数据科学工作环境

Conda的使用

Spyder入门

Jupyter入门

Markdown

简单读写数据

数据类型

数据结构

控制流

函数与模块

Numpy

pandas1

pandas2

pandas3

pandas4

绘图模块1

绘图模块2

绘图模块3

绘图模块4

统计建模1

统计建模2

统计建模3

统计建模4

机器学习模块1

机器学习模块2

文本分析1

文本分析2

下载本系列相关数据

.net里鼠标选中的text数据怎么获取_Python数据科学实践 | 爬虫1相关推荐

  1. .net里鼠标选中的text数据怎么获取_数据快速对比,这个快捷键你都不会,难怪要加班...

    私信回复关键词[学一招]~ 一次性获取Excel小技巧合集!助你成为高效职场人! 哈喽,大家好! 我是长小安同学,一名来自第 11 期秋叶 Excel 数据处理学习班的学员 ~ 今天希望通过一个小案例 ...

  2. .net里鼠标选中的text数据怎么获取_怎么利用Excel设置当天生日提醒功能

    怎么设置当天生日提醒功能?本期技巧妹与大家分享相关的处理方法. 1.利用TEXT函数 在单元格中输入公式输入公式=--TEXT(F2,"m-d"),利用EXT(F2,"m ...

  3. Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)

    目录 背景 演示 搭建Java Web环境 QTcpSocket获取服务器数据 QNetworkAccessManager获取服务器数据 背景 Qt中有2个方式可以实现HTTP协议的发送,一个是使用Q ...

  4. js 用下标获取map值_js map方法处理返回数据,获取指定数据简写方法

    map方法处理返回数据,获取指定数据简写方法 前言 后端返回数据为数组列表时,通常比较全面,包含了很多不需要的数据,可以通过 map 方法处理返回数据,筛选出想要的数据 例如 // 返回数据 res ...

  5. Python量化入门系列:获取数据-Tushare获取股票数据(1)

    做量化用到的数据一般包括二级市场各种数据.宏观经济各种数据以及一些特殊需求的网页数据,需要有通过python获取数据.常见的获取数据方式有三种: 一是通过SQL语言从数据库获取数据,适用于二级市场和宏 ...

  6. 微信小程序如何从数组里取值_微信小程序获取各种数据值跟设置数据值

    微信小程序获取各种数据值跟设置数据值. 修改设置data数组中的某个值://小程序接收后台数据若为数组时,下标最好为默认索引数组,从0开始排序 var articleId ='1'//对应数组中的索引 ...

  7. php获取post全部数据,PHP获取POST数据的几种方法汇总_PHP教程

    PHP获取POST数据的几种方法汇总 本文给大家汇总介绍了PHP获取POST数据的几种常用方法,这里分享给大家,有需要的小伙伴来参考下吧. 一.PHP获取POST数据的几种方法 方法1.最常见的方法是 ...

  8. python爬取数据的原理_python学习之python爬虫原理

    原标题:python学习之python爬虫原理 今天我们要向大家详细解说python爬虫原理,什么是python爬虫,python爬虫工作的基本流程是什么等内容,希望对这正在进行python爬虫学习的 ...

  9. python便捷数据怎么获取_Python数据分析入门——从数据获取到可视化

    基本信息 作者: 沈祥壮 ISBN:9787121336539 上架时间:2018-3-22 出版日期:2018 年3月 开本:16开 页码:260 版次:1-1 [插图] 编辑推荐 了解基本的Pyt ...

最新文章

  1. 显示浏览器窗口的高度和宽度
  2. Windows 技术篇-win10总是提示“目前无法访问 SmartScreen”问题解决方法,关闭“目前无法访问 SmartScreen”电脑提示方法演示
  3. 用c语言编程矩阵乘法,c语言矩阵相乘
  4. 渴望订阅– RxJava常见问题解答
  5. html排序图标,css实现排序升降图标
  6. linux禁止开机启动服务器,如何关闭SELinux并设置开机不启动
  7. 微信小程序wx.showToast
  8. DesignPattern_Java:Adapter Pattern
  9. idea messages中文乱码_2019.2版本IDEA控制台中文乱码尝试了很多方法都不行
  10. 如何鉴定光缆质量好坏?
  11. 【论文阅读】GPT系列论文详解
  12. python进行批量图片文字识别
  13. 事件起泡 Event bubbling
  14. PS CS4 序列号永久使用
  15. 华为鸿蒙ota升级,华为鸿蒙系统官方,华为鸿蒙系统官方升级名单预约 v2.0 - 浏览器家园...
  16. cisco路由器各接口模块代表的含义是什么
  17. 【Tableau 图表大全21】之箱型图(盒须图)
  18. SAP MM MARD 表里的Storage Bin 字段
  19. 中国居民收入调查数据库CHIPS
  20. VMware虚拟机(ubuntu)使用过程中的一些问题及解决方法

热门文章

  1. 函数传参涉及到副本的创建与拷贝问题分析
  2. JAVA-初步认识-第十一章-object类-equals方法覆盖
  3. 拾人牙慧篇之———QQ微信的第三方登录实现
  4. PCL—低层次视觉—点云分割(基于凹凸性)
  5. Console-算法-一个偶数总能表示为两个素数之和
  6. Android include 标签
  7. 为什么不提供离线Blog管理工具呢?
  8. memset函数详细说明
  9. 静态分析C语言生成函数调用关系的利器——cflow
  10. 程序员的自我修养--链接、装载与库笔记:Windows下的动态链接