数据采集
巧妇难为无米之炊。没有数据支撑一切都是空想。
彼得德鲁克说过,对于一项业务如果不能衡量它,那就无法实现有效增长。衡量的本质就是量化思维,数据则是实现量化的主要手段和结果。
数据(英语:data),是指未经过处理的原始记录。一般而言,数据缺乏组织及分类,无法明确的表达事物代表的意义,它可能是一堆的杂志、一大叠的报纸、数种的开会记录或是整本病人的病历纪录。数据描述事物的符号记录,是可定义为意义的实体,涉及事物的存在形式。是关于事件之一组离散且客观的事实描述,是构成消息和知识的原始材料。
信息是有价值的数据,知识是体系化的信息。两者的基础都是数据,正如wiki百科所讲,数据是两者的原始材料。
那么,数据从哪儿来呢?
数据来源有主要有:开放数据源、爬虫抓取、日志采集以及传感器。其中爬虫抓取使我们平时接触最多的,但也不要轻易忽略其他三个来源。开放数据源来自政府、企业、高校等单位,如统计局公布数据、企业年鉴,或者金融、能源等行业,如行业年报。日志采集目前多应用于消费互联网企业,而传感器随着物联网的发展将在数据采集方面占据一席重要地位。
Python爬虫
练习项目:编写Python代码实现自动化下载周星驰海报
爬虫主要包括三个阶段,即打开网页、提取数据和保存数据。
Requests访问页面
import requests
r = requests.get('http://www.douban.com')
XPath定位
XPath是XML的路径语言,通过元素和属性进行导航帮我们定位位置,常见的路径表达方式有以下8种:
表达式 | 含义 |
---|---|
node | 选取node节点下的所有子节点 |
/ | 从根节点选取 |
// | 选择所有的当前节点,不考虑他们的位置 |
. | 当前节点 |
… | 父节点 |
@ | 属性选取 |
| | 或,两个节点的合计 |
text() | 当前路径下的文本内容 |
举例说明:
1.xpath(‘node’)选取了node节点的所有子节点;
2.xpath(’/div’)从根节点上选取div节点;
3.xpath(’//div’)选取所有的div节点;
4.xpath(’./div’)选取当前节点下的div节点;
5.xpath(’…’)回到上一个节点;
6.xpath(’//@id’)选取所有的id属性;
7.xpath(’//book[@id]’)选取所有名为id的属性的book元素;
8.xpath(’//book[@id=“abc”]’)选取所有book元素,且这些book元素拥有id="abc"的属性
9.xpath(’//book/title|//book/price’)选取book元组的所有title和price元素
使用XPth定位,需要导入lxml库,调用HTML解析命令,然后再对HTML进行XPath函数的调用
# 定位到HTML中的所有列表项目
from lxml import etree
html = etree.HTML(html)
result = html.xpath('//li')
JSON对象
利用JSON库可以使用JSON对象和Python对象的相互转换,通过将JSON对象转换成Python对象来进行数据解析.方法json.dumps()可以实现Python转JSON,方法json.loads()可以实现JSON转Python
import json
jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}'
input = json.loads(jsonData)
print (input)
output:
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
利用JSON数据自动下载周星驰图片
首先把我们的日常操作步骤整理下:
1.打开网页
2.输入关键词"周星驰"
3.在搜索结果页中选择图片
4.下载图片页中的所有海报
这里需要关注的是,如果爬取的页面是动态页面,就需要关注XHR数据.因为动态页面的原理就是通过原生的XHR数据对象发出HTTP请求,得到服务器返回的数据后进行处理显示,XHR会用于在后台与服务器交换数据.可以利用Chrome浏览器中的开发者工具。
import json
import re
import os
import requests
# 创建图片存储文档
query = '周星驰'
path = os.getcwd()
picpath = path + '/' + query # 图片存储位置文件夹
print(picpath)
if not os.path.isdir(picpath): # 没有该文件夹则创建一个
os.mkdir(picpath)
# 创建下载函数
def download(src, id):
dir = picpath + '/' + str(id) + '.jpg'
try:
pic = requests.get(src, timeout=10)
except requests.exceptions.ConnectionError:
print(id + '图片无法下载')
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
# 抓取图片地址与id
for i in range(0, 2000, 20):
url = 'https://www.douban.com/j/search_photo?q=' + query + '&limit=20&start=' + str(i)
html = requests.get(url).text
response = json.loads(html,encoding = 'uft-8')
print('已下载' + str(i) + '张图片')
for image in response['images']:
image['src'] = image['src'].replace('thumb', 'l')
print(image['src'])
download(image['src'], image['id'])