1、数据分类
非结构化数据:HTML
处理方法:正则表达式、xpath、os4
结构化数据:json、xml
处理方法:转化为Python数据类型
数据提取之json
由于把json数据转化为python内建数据类型很简单,所以爬虫中,如果我们能够找到返回json数据的URL,就会尽量使用这种URL
JSON是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。
使用json注意点
- json中的字符串都是双引号
案例:抓取掘金动态
import requests
from urllib.request import urlretrieve
class WangzheSpider(object):
def __init__(self):
self.url = "http://gamehelper.gm825.com/wzry/hero/list"
self.headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}
def wangzhe_parse(self):
res = requests.get(self.url, headers=self.headers)
return res
def parse_data(self, res):
datas = res.json()["list"]
for data in datas:
hero_url = data["cover"]
hero_name = data["name"]
# img_content = requests.get(hero_url, headers=self.headers)
self.save_img(hero_name, hero_url)
def cbk(self, a, b, c):
"""回调函数
@a:已经下载的数据块个数
@b:数据块的大小
@c:远程文件的大小
"""
per = 100 * a * b / c
print(a, b, c)
if per > 100:
per = 100
print('%.2f%%' % per)
def save_img(self, hero_name, hero_url):
filename = "img/{}.png".format(hero_name)
urlretrieve(hero_url, filename, self.cbk)
# img = img_content.content
# with open(filename, "wb") as f:
# f.write(img)
def run(self):
# 1请求数据
res = self.wangzhe_parse()
# 2解析数据
# 3保存图片
self.parse_data(res)
pass
if __name__ == '__main__':
wangzhe_spider = WangzheSpider()
wangzhe_spider.run()
案例:抓取王者荣耀英雄图片
注意urlretrieve(url, filename)的使用,可以直接将图片下载下来并且保存到指定路径;
import requests
class WangzheSpider(object):
def __init__(self):
self.url = "http://gamehelper.gm825.com/wzry/hero/list"
self.headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}
def wangzhe_parse(self):
res = requests.get(self.url, headers=self.headers)
return res
def parse_data(self, res):
datas = res.json()["list"]
for data in datas:
hero_url = data["cover"]
hero_name = data["name"]
img_content = requests.get(hero_url, headers=self.headers)
self.save_img(hero_name, img_content)
def save_img(self, hero_name, img_content):
filename = "img/{}.png".format(hero_name)
img = img_content.content
with open(filename, "wb") as f:
f.write(img)
def run(self):
# 1请求数据
res = self.wangzhe_parse()
# 2解析数据
# 3保存图片
self.parse_data(res)
pass
if __name__ == '__main__':
wangzhe_spider = WangzheSpider()
wangzhe_spider.run()