.net里鼠标选中的text数据怎么获取_Python数据科学实践 | 爬虫1
点击上方蓝色字体,关注我们
大家好,基于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.如果标签是多个重复的格式(如、
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相关推荐
- .net里鼠标选中的text数据怎么获取_数据快速对比,这个快捷键你都不会,难怪要加班...
私信回复关键词[学一招]~ 一次性获取Excel小技巧合集!助你成为高效职场人! 哈喽,大家好! 我是长小安同学,一名来自第 11 期秋叶 Excel 数据处理学习班的学员 ~ 今天希望通过一个小案例 ...
- .net里鼠标选中的text数据怎么获取_怎么利用Excel设置当天生日提醒功能
怎么设置当天生日提醒功能?本期技巧妹与大家分享相关的处理方法. 1.利用TEXT函数 在单元格中输入公式输入公式=--TEXT(F2,"m-d"),利用EXT(F2,"m ...
- Qt|Http笔记-两种方式发送http协议数据,获取服务器数据(GET方法)
目录 背景 演示 搭建Java Web环境 QTcpSocket获取服务器数据 QNetworkAccessManager获取服务器数据 背景 Qt中有2个方式可以实现HTTP协议的发送,一个是使用Q ...
- js 用下标获取map值_js map方法处理返回数据,获取指定数据简写方法
map方法处理返回数据,获取指定数据简写方法 前言 后端返回数据为数组列表时,通常比较全面,包含了很多不需要的数据,可以通过 map 方法处理返回数据,筛选出想要的数据 例如 // 返回数据 res ...
- Python量化入门系列:获取数据-Tushare获取股票数据(1)
做量化用到的数据一般包括二级市场各种数据.宏观经济各种数据以及一些特殊需求的网页数据,需要有通过python获取数据.常见的获取数据方式有三种: 一是通过SQL语言从数据库获取数据,适用于二级市场和宏 ...
- 微信小程序如何从数组里取值_微信小程序获取各种数据值跟设置数据值
微信小程序获取各种数据值跟设置数据值. 修改设置data数组中的某个值://小程序接收后台数据若为数组时,下标最好为默认索引数组,从0开始排序 var articleId ='1'//对应数组中的索引 ...
- php获取post全部数据,PHP获取POST数据的几种方法汇总_PHP教程
PHP获取POST数据的几种方法汇总 本文给大家汇总介绍了PHP获取POST数据的几种常用方法,这里分享给大家,有需要的小伙伴来参考下吧. 一.PHP获取POST数据的几种方法 方法1.最常见的方法是 ...
- python爬取数据的原理_python学习之python爬虫原理
原标题:python学习之python爬虫原理 今天我们要向大家详细解说python爬虫原理,什么是python爬虫,python爬虫工作的基本流程是什么等内容,希望对这正在进行python爬虫学习的 ...
- python便捷数据怎么获取_Python数据分析入门——从数据获取到可视化
基本信息 作者: 沈祥壮 ISBN:9787121336539 上架时间:2018-3-22 出版日期:2018 年3月 开本:16开 页码:260 版次:1-1 [插图] 编辑推荐 了解基本的Pyt ...
最新文章
- 显示浏览器窗口的高度和宽度
- Windows 技术篇-win10总是提示“目前无法访问 SmartScreen”问题解决方法,关闭“目前无法访问 SmartScreen”电脑提示方法演示
- 用c语言编程矩阵乘法,c语言矩阵相乘
- 渴望订阅– RxJava常见问题解答
- html排序图标,css实现排序升降图标
- linux禁止开机启动服务器,如何关闭SELinux并设置开机不启动
- 微信小程序wx.showToast
- DesignPattern_Java:Adapter Pattern
- idea messages中文乱码_2019.2版本IDEA控制台中文乱码尝试了很多方法都不行
- 如何鉴定光缆质量好坏?
- 【论文阅读】GPT系列论文详解
- python进行批量图片文字识别
- 事件起泡 Event bubbling
- PS CS4 序列号永久使用
- 华为鸿蒙ota升级,华为鸿蒙系统官方,华为鸿蒙系统官方升级名单预约 v2.0 - 浏览器家园...
- cisco路由器各接口模块代表的含义是什么
- 【Tableau 图表大全21】之箱型图(盒须图)
- SAP MM MARD 表里的Storage Bin 字段
- 中国居民收入调查数据库CHIPS
- VMware虚拟机(ubuntu)使用过程中的一些问题及解决方法