随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如:
(1)不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。
(2)通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。
(3)万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。
(4)通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。
Python语言在爬虫领域非常强大,本身有自带模块写法简单,对于网页内容的提取可以使用正则表达式或者第三方模块等,由Ajax提供动态数据通过Charles等软件进行获取,可得到xml或者json数据,转易简单。而且有多个第三方爬虫框架,如Scrapy,PySpider,Crawley,Portia等,都是爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中,使用轻松,写法简单。领先于其他语言在爬虫领域的工作。
在本章内容中,先简单介绍使用Python自带模块爬取Charles软件抓取的动态接口数据,并将数据转换成内存中的数据结构,在进行磁盘存储,存储到Excel表格中,将涉及到的图片保存在当前项目路径下。
涉及到的知识点:
- python爬虫模块urllib的基本用法
- json数据在python语言下的转化
- 自动化办公:存储数据到Excel表格中
- 爬虫爬取图片路径地址,将图片保存在本地
逻辑分析:
鉴于这个需求涉及的新知识点较多,而且相比之前项目实例逻辑思想也增多,故先分析一下思路步骤,将步骤转换成代码处理。
- 访问网址对应网页,使用urllib.request模块将网页内容读取到本地
- 将读取到的json数据,使用json模块存储内存字典中
- 遍历字典,将字典中每一对数据存放到要求的列表中
- 将生成列表中数据,通过pyexcel_xls第三方模块写入到excel表格中
- 存放网络图片到本地
这里面涉及到一个第三方模块pyexcel_xls,需要下载此模块,通过在命令行输入"pip install pyexcel_xls"命令,即可下载。如果提示'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。说明在安装python软件时,没有安装pip插件或者选择没有配置python的环境变量,建议卸载python软件,重新安装。
功能实现代码:
import urllib.request
import json,pyexcel_xls
import os
'''
通过爬虫爬取网络数据--》json数据---》分析存储到excel表格---》图片保存到本地
'''
def getDataFromHtml(url,pic_forurl,folderpath):
res = urllib.request.urlopen(url)
res_data = res.read()
#将json字符串转换成python字典
json_dic = json.loads(res_data)
#创建表格当中对应的数据结构
excel_totallist = [["id","type","publishtime","title","summary","image"]]
excel_dic = {"ten":excel_totallist}
#遍历原来的字典的数据结构
for res_item in json_dic["result"]:
# 分析结构:这是每一个item应该获取到的结构
#{"id":100697,"type":3,"publishtime":636,"title":"我的孤独","summary":"","image":"iF6.png"}
item_id = res_item["id"]
item_type = res_item["type"]
item_time = res_item["publishtime"]
item_title = res_item["title"]
item_summary = res_item["summary"]
item_image = res_item["image"]
itemlist = [item_id,item_type,item_time,item_title,item_summary,item_image]
excel_totallist.append(itemlist)
# 调用封装好的保存图片的方法
saveImage(item_image,pic_forurl,folderpath)
#保存excel表格数据
abspath = os.path.join(folderpath,"ten.xls")
pyexcel_xls.save_data(abspath,excel_dic)
'''
保存图片的方法
imgurl :图片的网址 pic_forurl :图片缺省部分的网址 folderpath:图片的保存路径
'''
def saveImage(imgurl,pic_forurl,folderpath):
# http://jbcdn2.b0.upaiyun.com/2015/12/ 6e9755283d00dda6093866f8b9547b43.jpg
imgname = imgurl.split('/')[-1]
if 'http' not in imgurl:
pic = pic_forurl + imgurl
# 保存图片
try:
abspath = os.path.join(folderpath, imgname)
urllib.request.urlretrieve(pic, abspath)
except:
pass
if __name__ == '__main__':
ten_url = 'http://api.shigeten.net/api/Diagram/GetDiagramList'
pic_forurl = 'http://api.shigeten.net/'
folder_path = "file"
if not os.path.exists(folder_path):
os.mkdir(folder_path)
getDataFromHtml(ten_url,pic_forurl,folder_path)
然后就可以将数据下载并存储到本地表格了~
感谢您的阅读!