数据采集顾名思义就是获取数据源的各类数据,它在数据分析和处理中扮演着至关重要的角色。
数据源的类型包括结构化数据、半结构化数据和非结构化数据,这些数据类型的多样性要求数据采集系统具备更高的灵活性和用户自定义能力。
由于很多数据应用都需要来自互联网的外部数据,因此,常常会用到网络爬虫,按照一定的规则,自动递抓取互联网信息的程序或者脚本。
再者,在大数据环境下,数据采集技术面临许多挑战,包括数据源种类多、数据类型复杂、数据量大且产生速度快等问题。因此,保证数据采集的可靠性和高效性,避免重复数据成为关键考量因素。
数据采集常常需要面临和克服以下问题:
针对这些问题,要么自己技术够用,要么能找到技术够硬的平台,通过技术平台解决难题或获取数据。
数据采集主要是将数据汇集在一起,为数据提炼做准备,而数据提炼是将采集的数据转化为有用信息的过程,常用到的技术有ETL。
ETL技术:主要用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)到目的端的过程。主要讲网页企业中的分散、凌乱、不统一的数据整合在一起,进行分析探索和决策。
数据提炼通常涉及以下几个关键步骤:
常用的一些ETL工具有三种:
数据探索分析可以分为数据分析和数据解释。
网络爬虫是数据获取的常用方法,和代理IP配合能保证数据采集的稳定运行。市面上有许多代理IP,选择通常有一套标准,不合格的代理可能导致爬虫频繁中断和失败等产生一系列问题,所以对于挑选可以参考以下几个方面:
刚好近期需要使用IP代理获取数据,通过不断地了解,发现亮数据有许多用户评价和反馈,好评众多,因此,博主立马进行了注册,通过测试使用后,发现IP质量特别好,工具也多,整体特别满意,有兴趣的可以试试 👉亮数据官网数据获取。
数据解锁器是一种绕过网络限制或检测,模拟真人访问解锁网站网站并抓取数据。它能完全模仿真人挖掘网页数据,拥有管理IP发送请求率、设置请求间隔、校准参照标头、识别蜜罐陷阱、模仿真人和设备等功能。
解锁器的优点有:
数据浏览器有很多,但大多都不够专业,对网络爬虫抓取数据并没有提供更多的帮助。但亮数据提供的爬虫浏览器内置网站解锁功能,集成了亮网络解锁器自动化解锁能力,并且自动管理所有网站深层解锁操作,包括:验证码解决、浏览器指纹识别、自动重试和选择标头等。
爬虫浏览器的亮点如下:
数据洞察市场是一个利用数据分析为组织提供有价值见解的领域,它能快速地收集市场相关行业的数据,通过不断地对比和定位,发现潜在问题,指定合理更有效地方案,增强在市场上的竞争力。
最常见的一些指标和策略有:
只要清楚市场,才能知道需要什么数据,站在市场角度,收集集成各大公众平台数据,优先进行分析和训练,得出更好的市场洞察力。
需求目标:以豆瓣网为例,获取豆瓣读书排行榜Top250(https://book.douban.com/top250)数据,整合梳理有效信息,制作数据可视化报告。
分析:在这里我们使用亮数据的“按需定制数据集”,根据自己的需要和使用场景定制自己的数据集。
可见,直接根据网址的提示进行操作,非常快速就能获取到自己想要的数据。
众所周知,爬虫速度过快,频繁访问都会被封IP,怎么解决这个问题呢?再去换一台设备?先不说数据是否同步,仅仅换个设备的成本就不低,这个时候就需要代理IP了,根据获得的代理IP,直接在python的使用。
1)准备工作 导入本次需要用到的基本模块,以下所有的执行都在这基础上运行。
from bs4 import BeautifulSoup # 用于解析HTML和XML文档
import requests # 爬虫库
import re # 正则库
import pandas as pd # 数据处理库
import times # 防止爬取过快
进入到豆瓣网址,点击不同的页面,可以发现网址URL有如下:
# 第一页
https://book.douban.com/top250?start=0
# 第二页
https://book.douban.com/top250?start=25
# 第三页
https://book.douban.com/top250?start=50
通过观察可以发现,URL后面参数是25的倍数变化,因此可以使用如下代码替代:
# 设置翻页
for i in range(10):
# 根据每一页的URL规律定义
url = 'https://book.douban.com/top250?start=' + str(i*25) + '&filter='
print(url)
2)获取网页源码数据
a. 在不使用任何代理情况下,直接模拟浏览器,添加请求头,发起请求。
# 定义获取源码函数
def get_html_info1(url):
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
# 发起请求,返回响应对象
response = requests.get(url, headers=headers)
# 解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# 打印查看信息
print(soup)
return soup
# 使用该函数
get_html_info1("https://book.douban.com/top250?start=0")
多次请求后出现404!!!
b. 进一步优化,在这里我从 亮数据官方网站中注册获取到的IP,我们使用它进行发起请求,获取数据。
# 定义获取源码函数
def get_html_info2(url):
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
# 根据获取到的IP,添加代理
proxies = {'http': 'http://brd-customer-hl_93341477-zone-web_unlocker2:ke6rcbba1z0z@brd.superproxy.io:22225',
'https': 'http://brd-customer-hl_93341477-zone-web_unlocker2:ke6rcbba1z0z@brd.superproxy.io:22225'}
# 发起请求,返回响应对象
response = requests.get(url, headers=headers,proxies=proxies)
# 解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')
# 打印查看信息
print(soup)
return soup
# 使用该函数
get_html_info2("https://book.douban.com/top250?start=0")
c. 继续在亮数据中探索发现,平台的亮网络解锁器和亮数据解锁器,只需要将所需要的URL放入,调整通道和地区,爬虫代码无需修改直接可复用。
#!/usr/bin/env python
print('If you get error "ImportError: No module named \'six\'" install six:\n'+\
'$ sudo pip install six');
print('To enable your free eval account and get CUSTOMER, YOURZONE and ' + \
'YOURPASS, please contact sales@brightdata.com')
import sys
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
if sys.version_info[0]==2:
import six
from six.moves.urllib import request
opener = request.build_opener(
request.ProxyHandler(
{'http': 'http://brd-customer-hl_93341477-zone-web_unlocker2:ke6rcbba1z0z@brd.superproxy.io:22225',
'https': 'http://brd-customer-hl_93341477-zone-web_unlocker2:ke6rcbba1z0z@brd.superproxy.io:22225'}))
print(opener.open('https://book.douban.com/top250?start=0').read())
if sys.version_info[0]==3:
import urllib.request
opener = urllib.request.build_opener(
urllib.request.ProxyHandler(
{'http': 'http://brd-customer-hl_93341477-zone-web_unlocker2:ke6rcbba1z0z@brd.superproxy.io:22225',
'https': 'http://brd-customer-hl_93341477-zone-web_unlocker2:ke6rcbba1z0z@brd.superproxy.io:22225'}))
print(opener.open('https://book.douban.com/top250?start=0').read())
在Pycharm中可以使用示例代码直接爬取源码,不用自己调整任何东西。爬取的源码通常还不能直接使用,需要进一步进行提炼。
可以发现b和c两部分获取数据非常稳定,未出现异常情况,代理IP
2)数据提炼
首先,打开开发者工具查看HTML源码,聚焦选中要定位的元素,可以发现书本信息集中在<div,class="indent"><table></table></div>
标签中;
其次,较为复杂的是出版相关的信息,数据有"余华 / 作家出版社 / 2012-8 / 20.00元"、“[英] 阿·柯南道尔 / 丁钟华 等 / 群众出版社 / 1981-8 / 53.00元/68.00元”、“少年儿童出版社 / 1962 / 30.00元”,存在着作者和译者两者其一或都无情况,因此,对数据进行分割时需要分情况处理。创建一个get_data函数用于提炼数据,如下:
def get_data(soup,data_list):
# 获取<div,class="indent"><table></table></div>标签中所有的图书信息
book_list = soup.find('div', class_='indent').find_all('table')
# 遍历图书列表
for book in book_list:
# 书名:根据<div,class='pl2'><a></a></div>标签提取信息
title = book.find('div', class_='pl2').find('a')['title']
# 评分:根据<span,class='rating_nums'></span>标签提取信息
rating = book.find('span', class_='rating_nums').text
# 评价人数:根据<span,class='pl'></span>标签提取信息,正则出需要的数量
comment_count = re.search(r'\d+', book.find('span', class_='pl').text).group()
# 推荐语:根据<span,class='inq'></span>标签提取信息,如果没有则赋空
quote = book.find('span', class_='inq').text if book.find('span', class_='inq') else None
# 书本出版相关信息:根据<p,class='pl'></span>标签提取信息
publisher_info = book.find('p', class_='pl').text
# 作者和译者:并不是所有的图书都有,因此需要根据实际信息分情况处理
if publisher_info.count(' / ') == 4:
author = publisher_info.split(' / ')[-5].strip()
translator = publisher_info.split(' / ')[-4].strip()
elif publisher_info.count(' / ') == 2:
author = None
translator = None
else:
author = publisher_info.split(' / ')[-4].strip()
translator = None
# 出版社:根据提取的出版信息分隔符提取
publisher = publisher_info.split(' / ')[-3].strip()
# 定价:由于定价存在多种情况,根据提取的出版信息分隔符和正则匹配信息
price = re.sub(r'(元)|(CNY\s)|(NT\$)', '', publisher_info.split(' / ')[-1].strip())
# 出版年
year = publisher_info.split(' / ')[-2].strip().split('-')[0]
# 书本链接
book_link = book.find('a')['href']
# 封面图片链接
img_link = book.find('a').find('img')['src']
# 打印查看每次获取提炼的信息
print({'书名': title, '评分': rating, '评价人数': comment_count, '推荐语': quote
, '作者': author, '译者': translator, '出版社': publisher, '出版年': year, '定价': price
, '书本链接': book_link, '封面图片链接': img_link})
# 将获取的信息合并追加
data_list.append({'书名': title, '评分': rating, '评价人数': comment_count, '推荐语': quote
, '作者': author, '译者': translator, '出版社': publisher, '出版年': year, '定价': price
, '书本链接': book_link, '封面图片链接': img_link})
return data_list
# 使用get_html_info1函数获取HTML源码
get_html_info1("https://book.douban.com/top250?start=0")
# 使用get_data函数提炼数据
get_data(soup,data_list)
执行查看打印结果如下:
3)数据导出
数据提炼完成,我们常常需要保存数据或者数据入库,方便查看和其他工具调用,因此,定义数据导出函数如下:
# 定义数据导出CSV函数
def data_to_csv(data_list):
# 创建DataFrame对象
df = pd.DataFrame(data_list)
# 保存为CSV文件
df.to_csv('douban_dushu.csv',index=False)
使用数据导出函数,并且查看数据,可以发现总共获取了11列250行数据。
数据可视化又可以称为数据解释,主要工作是对数据进行处理,将结果更直观地展现,使复杂的数据更容易理解和使用,在本节中做基本的演示。
1)准备工作
导入数据可视化用到的基本库,读取提取到的数据。
import pandas as pd
from pyecharts import options as opts
from pyecharts.options import ComponentTitleOpts
from pyecharts.charts import Bar, Line # 绘制条形图和线图
from pyecharts.charts import TreeMap # 绘制树形图
from pyecharts.components import Table # 绘制表格
df = pd.read_csv('douban_dushu.csv') # 读取提炼的数据
2)做明细表
根据提炼的数据,明细表可以帮助用户高效地查看、编辑和分析详细的数据信息,便于查看和发现问题,图书详情尽在掌握。
table = Table()
headers = df.columns.tolist() # 表列表
rows = [list(row) for row in df.values] # 数据列表
table.add(headers, rows) # 表单中添加表头和数据
table.set_global_opts(
title_opts=ComponentTitleOpts(title="豆瓣读书Top205明细") # 添加标题
)
table.render("豆瓣读书Top205明细.html") # 导出HTML查看
3)绘制柱形图
柱形图能更直观地查看和对比不同年份出版的图书情况,因此,我们进一步绘制查看读书Top250中出版年的图书数量变化。
year_counts = df['出版年'].value_counts() # 根据出版年份统计图书数量
year_counts.columns = ['出版年', '数量'] # 汇总的数据定义列名
year_counts = year_counts.sort_index() # 根据数量排序
c = (
Bar()
.add_xaxis(list(year_counts.index))
.add_yaxis('图书数量', year_counts.values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='各年份图书数量'), # 标题
yaxis_opts=opts.AxisOpts(name='数量'), # y轴
xaxis_opts=opts.AxisOpts(name='出版年'), # x轴
datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_='inside')],) # 数据显示位置
.render('各年份图书数量.html')
)
4)绘制矩形树形图
我们可以使用矩形树形图查看不同的出版社出版图书的分布情况。
publisher = df['出版社'].value_counts() # 根据出版社统计图书数量
output_list = [{"value": value, "name": name} for name, value in publisher.items()] # 转化为列表嵌套字段形式
c = (
TreeMap()
.add("", output_list)
.set_global_opts(title_opts=opts.TitleOpts(title="出版社分析"))
.render("出版社分析.html")
)
4)绘制组合图
通过明细数据可以看到,图书有评分和评价人数,进一步分析三种的数据情况,在这里我们绘制组合图统一展示:
# 创建bar对象,并制定画布大小
bar = Bar(init_opts=opts.InitOpts(width='1200px',height='300px'))
# 将数据根据评分、评价人数、书名进行升序排列
df3 = df.sort_values(by=['评分','评价人数','书名'],ascending=False)
# 依次将排名前十的三列数据拿出
x_data = df3['书名'].tolist()[:10]
rating = df3['评分'].tolist()[:10]
comment_count = df3['评价人数'].tolist()[:10]
# 柱形图设置
bar = (
Bar()
.add_xaxis(x_data) # x轴
.add_yaxis( # y轴系列数据
series_name="评价人数",
y_axis=comment_count,
yaxis_index=0,
z=0,
color="#d14a61",
bar_width=40,
)
.extend_axis( # 扩展的y轴系列参数配置
yaxis=opts.AxisOpts(
type_="value",
name="评分",
name_gap=30,
min_=0,
max_=10,
axislabel_opts=opts.LabelOpts(font_size=15),
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="black")
),
splitline_opts=opts.SplitLineOpts(
is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)
),
)
)
.set_global_opts( # y轴系列参数配置
yaxis_opts=opts.AxisOpts(
name="评价人数",
name_gap=60,
min_=0,
max_=500000,
interval=50000,
axislabel_opts=opts.LabelOpts(font_size=14),
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(color="blank")
),
),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
title_opts=opts.TitleOpts(title="豆瓣读书前十评分和评价人数",pos_left="center",pos_top="top"),
legend_opts=opts.LegendOpts(pos_left='40%',pos_bottom='89%'),
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
)
)
# 折线图设置
line = (
Line()
.add_xaxis(x_data)
.add_yaxis(
series_name="评分",
y_axis=rating,
symbol='triangle',
symbol_size=15,
yaxis_index=1,
color="#aa00ff",
label_opts=opts.LabelOpts(is_show=False, font_size=10,font_weight='bold'),
linestyle_opts=opts.LineStyleOpts(width=3)
)
)
bar.overlap(line).render("豆瓣读书前十评分和评价人数.html")
常见的数据可视化工具主要分为三类:底层程序框架;第三方库;软件工具。在这里使用的是第三方库,主要是使用Python的pyecharts进行了制作,如果想了解更多,可以前往pyecharts官网,当然也可以通过其他软件工具实现,如Tableau、PowerBI等。
本文通过基本的案例,介绍了数据分析的基本流程,了解的各部分的职责。数据分析和可视化其实不难,主要是开头难,大多数人常常止步于数据采集,常因采集不到自己所需要的数据而懊恼或者放弃, 因此本文给大家介绍了数据获取的基本方法和可用的工具(亮 数 据 官 网),希望对大家有所帮助,能有更多的时间用于分析,得出有价值的信息,利用数据更好的驱动决策。