赞
踩
网络爬虫:
又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取网络信息的程序或者脚本,另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
通俗理解:
简单来讲,爬虫就是一个探测机器,它的基本操作就是模拟人的行为去各个网站溜达,点点按钮,查查数据,或者把看到的信息背回来. 就像一只虫子在一幢楼里不知疲倦地爬来爬去.
你可以简单地想象
: 每个爬虫都是你的「分身」。就像孙悟空拔了一撮汗毛,吹出一堆猴子一样
百度:
其实就是利用了这种爬虫技术, 每天放出无数爬虫到各个网站,把他们的信息抓回来,然后化好淡妆排着小队等你来检索。
有了这样的特性, 对于一些自己公司数据量不足的小公司, 这个时候还想做数据分析就可以通过爬虫获取同行业的数据然后进行分析, 进而指导公司的策略指定。
基本步骤:
起始URL地址
发出请求获取响应数据
对响应数据解析
数据入库
requests : 可以模拟浏览器的请求
安装 :pip install requests
快速入门(requests三步走):
# 导入模块 import requests # 通过requests.get()发送请求 # data保存返回的响应数据(这里的响应数据不是单纯的html,需要通过content获取html代码) data = requests.get("http://www.baidu.com") # 通过data.content获取html代码 data = data.content.decode("utf-8")
requests三步走:
# 导入模块 import requests # 通过requests.get()发送请求 # data保存返回的响应数据(这里的响应数据不是单纯的html,需要通过content获取html代码) data = requests.get("http://www.baidu.com") # 通过data.content获取html代码 data = data.content.decode("utf-8")
获取index.html代码
解析index.html代码获取图片url
通过图片url获取图片
# 通过爬虫向index.html发送请求 # requests.get(网址): 向一个网址发送请求,和在浏览器中输入网址是一样的 data = requests.get("http://127.0.0.1:8000/index.html") # content可以把requests.get()获取的返回值中的html内容获取到 data = data.content.decode("utf-8")
# 获取图片的请求url def get_pic_url(): # 通过爬虫向index.html发送请求 # requests.get(网址): 向一个网址发送请求,和在浏览器中输入网址是一样的 data = requests.get("http://127.0.0.1:8000/index.html") # content可以把requests.get()获取的返回值中的html内容获取到 data = data.content.decode("utf-8") # html每一行都有"\n", 对html进行分割获得一个列表 data = data.split("\n") # 创建一个列表存储所有图片的url地址(也就是图片网址) url_list = [] for url in data: # 通过正则解析出所有的图片url result = re.match('.*src="(.*)" width.*', url) if result is not None: # 把解析出来的图片url添加到url_list中 url_list.append(result.group(1)) return url_list
# 把爬取到的图片保存到本地 def save_pic(url_list): # 通过num给照片起名字 例如:0.jpg 1.jpg 2.jpg num = 0 for url in url_list: # 通过requests.get()获取每一张图片 pic = requests.get(f"http://127.0.0.1:8000{url[1:]}") # 保存每一张图片 with open(f"./source/spyder/{num}.jpg", "wb") as f: f.write(pic.content) num += 1
完整代码:
import requests import re # 获取图片的请求url def get_pic_url(): # 通过爬虫向index.html发送请求 # requests.get(网址): 向一个网址发送请求,和在浏览器中输入网址是一样的 data = requests.get("http://127.0.0.1:8000/index.html") # content可以把requests.get()获取的返回值中的html内容获取到 data = data.content.decode("utf8") # html每一行都有"\n", 对html进行分割获得一个列表 data = data.split("\n") # 创建一个列表存储所有图片的url地址(也就是图片网址) url_list = [] for url in data: # 通过正则解析出所有的图片url result = re.match('.*src="(.*)" width.*', url) if result is not None: # 把解析出来的图片url添加到url_list中 url_list.append(result.group(1)) return url_list # 把爬取到的图片保存到本地 def save_pic(url_list): # 通过num给照片起名字 例如:0.jpg 1.jpg 2.jpg num = 0 for url in url_list: # 通过requests.get()获取每一张图片 pic = requests.get(f"http://127.0.0.1:8000{url[1:]}") # 保存每一张图片 with open(f"./source/spyder/{num}.jpg", "wb") as f: f.write(pic.content) num += 1 if __name__ == '__main__': url_list = get_pic_url() save_pic(url_list)
爬取照片的步骤
获取index.html代码
解析index.html代码获取图片url
通过图片url获取图片
通过访问 http://127.0.0.1:8080/gdp.html 可以获取2020年世界GDP排名. 在这里我们通过和爬取照片一样的流程步骤获取GDP数据。
zip() 函数: 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表.
a = [1, 2, 3] b = [4, 5, 6] c = [4, 5, 6, 7, 8] # 打包为元组的列表 zipped = zip(a, b) # 注意使用的时候需要list转化 print(list(zipped)) >>> [(1, 4), (2, 5), (3, 6)] # 元素个数与最短的列表一致 zipped = zip(a, c) # 注意使用的时候需要list转化 print(list(zipped)) >>> [(1, 4), (2, 5), (3, 6)]
import requests import re # 存储爬取到的国家的名字 country_list = [] # 存储爬取到的国家gdp的数据 gdp_list = [] # 获取gdp数据 def get_gdp_data(): global country_list global gdp_list # 获取gdp的html数据 data = requests.get("http://localhost:8000/gdp.html") # 对获取数据进行解码 data = data.content.decode("utf8") # 对gdp的html数据进行按行分割 data_list = data.split("\n") for i in data_list: # 对html进行解析获取<国家名字> country_result = re.match('.*<a href=""><font>(.*)</font></a>', i) # 匹配成功就存放到列表中 if country_result is not None: country_list.append(country_result.group(1)) # 对html进行解析获取<gdp数据> gdp_result = re.match(".*¥(.*)亿元", i) # 匹配成功就存储到列表中 if gdp_result is not None: gdp_list.append(gdp_result.group(1)) # 把两个列表融合成一个列表 gdp_data = list(zip(country_list, gdp_list)) print(gdp_data) if __name__ == '__main__': get_gdp_data()
爬取gdp的步骤
获取gdp.html代码
解析gdp.html代码获取gdp数据
在我们的案例中, 我们只是爬取了2个非常简单的页面, 这两个页面的数据爬取并不会使用太多的时间, 所以我们也没有太多的考虑效率问题.
但是在真正的工作环境中, 我们爬取的数据可能非常的多, 如果还是使用单任务实现, 这时候就会让我们爬取数据的时间很长, 那么显然使用多任务可以大大提升我们爬取数据的效率
实际上实现多任务并不难, 只需要使用我们之前讲过的多任务就可以了
# 获取gdp def get_gdp_data(): pass # 获取照片 def get_pic(): pass if __name__ == '__main__': p1 = multiprocessing.Process(target=get_pic p2 = multiprocessing.Process(target=get_gdp_data) p1.start() p2.start()
多任务
导入模块
创建多进程或者多线程
启动多任务
数据可视化:顾名思义就是让数据看的到, 他的作用也很明显, 让人们不用再去阅读枯燥无味的数据, 一眼看去就可以明白数据是什么, 数据间的关系是什么, 更好的让我们通过数据发现潜在的规律进而进行商业决策。
概况
:
Echarts 是个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可. 而 Python 是门富有表达力的语言,很适合用于数据处理. 当数据分析遇上数据可视化时pyecharts 诞生了.
特性
:
简洁的API设计,使用如丝滑般流畅,支持链式调用
囊括了30+种常见图表,应有尽有
支持主流Notebook 环境,Jupyter Notebook 和JupyterLab
可轻松集成至Flask, Django等主流Web框架
高度灵活的配置项,可轻松搭配出精美的图表
详细的文档和示例,帮助开发者更快的上手项目
多达400+地图文件以及原生的百度地图,为地理数据可视化提供强有力的支持
导入模块
# 导入饼图模块 from pyecharts.charts import Pie # 导入配置选项模块 import pyecharts.options as opts
初始化饼状图:
Pie()函数: 创建饼图
opts.InitOpts参数: Pie(init_opts=opts.InitOpts(width="1400px", height="800px"))
init_opts: 指定参数名
opts.InitOpts: 配置选项
width="1400px" height="800px" :界面的宽度和高度
# 创建饼图并设置这个界面的长和高 # px:像素单位 pie = Pie(init_opts=opts.InitOpts(width="1400px", height="800px"))
给饼图添加数据:
add()函数:
参数1: 名称
参数2: 具体数据, 数据类型为==>[(a,b),(a,b),(a,b)]==>a为数据名称,b为数据大小
参数3: 标签设置 label_opts=opts.LabelOpts(formatter='{b}:{d}%') 符合百分比的形式
# 给饼图添加数据 pie.add( "GDP", data, label_opts=opts.LabelOpts(formatter='{b}:{d}%') )
给饼图添设置标题:
set_global_opts()函数 :
title_opts=opts.TitleOpts : 设置标题
title="2020年世界GDP排名", subtitle="美元" : 设置主标题和副标题
# 给饼图设置标题 pie.set_global_opts(title_opts=opts.TitleOpts(title="2020年世界GDP排名", subtitle="美元"))
保存数据:
# 保存结果 pie.render()
import requests import re # 导入饼图模块 from pyecharts.charts import Pie # 导入配置选项模块 import pyecharts.options as opts # 存储爬取到的国家的名字 country_list = [] # 春初爬取到的国家gdp的数据 gdp_list = [] def get_gdp_data(): global country_list global gdp_list # 获取gdp的html数据 data = requests.get("http://localhost:8000/gdp.html") # 对获取数据进行解码 data = data.content.decode("utf8") # 对gdp的html数据进行按行分割 data_list = data.split("\n") for i in data_list: # 对html进行解析获取<国家名字> country_result = re.match('.*<a href=""><font>(.*)</font></a>', i) # 匹配成功就存放到列表中 if country_result is not None: country_list.append(country_result.group(1)) # 对html进行解析获取<gdp数据> gdp_result = re.match(".*¥(.*)亿元", i) # 匹配成功就存储到列表中 if gdp_result is not None: gdp_list.append(gdp_result.group(1)) # 创建一个饼状图显示GDP前十的国家 def data_view_pie(): # 获取前十的过的GDP数据, 同时让数据符合[(),()...]的形式 data = list(zip(country_list[:10], gdp_list[:10])) # 创建饼图 pie = Pie(init_opts=opts.InitOpts(width="1400px", height="800px")) # 给饼图添加数据 pie.add( "GDP", data, label_opts=opts.LabelOpts(formatter='{b}:{d}%') ) # 给饼图设置标题 pie.set_global_opts(title_opts=opts.TitleOpts(title="2020年世界GDP排名", subtitle="美元")) # 保存结果 pie.render() if __name__ == '__main__': # 获取GDP数据 get_gdp_data() # 生成可视化饼图 data_view_pie()
可视化
Pie()函数 : 创建饼图
add()函数 : 添加数据
set_global_opts()函数 : 设置标题
render()函数 : 保存数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。