1、数据分类

非结构化数据:HTML

处理方法:正则表达式、xpath、os4

结构化数据:json、xml

处理方法:转化为Python数据类型

数据提取之json

由于把json数据转化为python内建数据类型很简单,所以爬虫中,如果我们能够找到返回json数据的URL,就会尽量使用这种URL

JSON是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。

使用json注意点

  • json中的字符串都是双引号

图片2.png

案例:抓取掘金动态

  1. import requests
  2. from urllib.request import urlretrieve
  3. class WangzheSpider(object):
  4. def __init__(self):
  5. self.url = "http://gamehelper.gm825.com/wzry/hero/list"
  6. self.headers = {
  7. "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"
  8. }
  9. def wangzhe_parse(self):
  10. res = requests.get(self.url, headers=self.headers)
  11. return res
  12. def parse_data(self, res):
  13. datas = res.json()["list"]
  14. for data in datas:
  15. hero_url = data["cover"]
  16. hero_name = data["name"]
  17. # img_content = requests.get(hero_url, headers=self.headers)
  18. self.save_img(hero_name, hero_url)
  19. def cbk(self, a, b, c):
  20. """回调函数
  21. @a:已经下载的数据块个数
  22. @b:数据块的大小
  23. @c:远程文件的大小
  24. """
  25. per = 100 * a * b / c
  26. print(a, b, c)
  27. if per > 100:
  28. per = 100
  29. print('%.2f%%' % per)
  30. def save_img(self, hero_name, hero_url):
  31. filename = "img/{}.png".format(hero_name)
  32. urlretrieve(hero_url, filename, self.cbk)
  33. # img = img_content.content
  34. # with open(filename, "wb") as f:
  35. # f.write(img)
  36. def run(self):
  37. # 1请求数据
  38. res = self.wangzhe_parse()
  39. # 2解析数据
  40. # 3保存图片
  41. self.parse_data(res)
  42. pass
  43. if __name__ == '__main__':
  44. wangzhe_spider = WangzheSpider()
  45. wangzhe_spider.run()

案例:抓取王者荣耀英雄图片

注意urlretrieve(url, filename)的使用,可以直接将图片下载下来并且保存到指定路径;

  1. import requests
  2. class WangzheSpider(object):
  3. def __init__(self):
  4. self.url = "http://gamehelper.gm825.com/wzry/hero/list"
  5. self.headers = {
  6. "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"
  7. }
  8. def wangzhe_parse(self):
  9. res = requests.get(self.url, headers=self.headers)
  10. return res
  11. def parse_data(self, res):
  12. datas = res.json()["list"]
  13. for data in datas:
  14. hero_url = data["cover"]
  15. hero_name = data["name"]
  16. img_content = requests.get(hero_url, headers=self.headers)
  17. self.save_img(hero_name, img_content)
  18. def save_img(self, hero_name, img_content):
  19. filename = "img/{}.png".format(hero_name)
  20. img = img_content.content
  21. with open(filename, "wb") as f:
  22. f.write(img)
  23. def run(self):
  24. # 1请求数据
  25. res = self.wangzhe_parse()
  26. # 2解析数据
  27. # 3保存图片
  28. self.parse_data(res)
  29. pass
  30. if __name__ == '__main__':
  31. wangzhe_spider = WangzheSpider()
  32. wangzhe_spider.run()