当前位置:   article > 正文

Python实训day06am【网络爬虫(爬取接口)】_有没有使用python去调用软件接口,进行过网络爬虫吗?

有没有使用python去调用软件接口,进行过网络爬虫吗?

目录

1、“from bs4 import BeautifulSoup”解析

2、字体反爬虫

3、网络爬虫

3.1、直接爬取页面html-爬取每个章节的内容

3.2、爬取数据接口-英雄之刃头像

3.3、爬取数据接口-课堂练习-王者头像


1、“from bs4 import BeautifulSoup”解析

知乎:https://www.zhihu.com/question/308106778?sort=created

2、字体反爬虫

遇到问题之后:

  1. 积极的寻求解决方案【心态】
  2. 在寻求解决方案时,方向是否正确【经验】【谁吃的亏,填的坑多】
  3. 能否通过各种办法,快速的得到解决【经验+手段+技术】

昨天内容:得票数,字体库来加密展现 ,无法爬取。
    𢏇 𦓛..... 
    140231 --解密--> 0~9
    156891 --解密--> 0~9

  1. import requests
  2. from bs4 import BeautifulSoup as BS
  3. from fontTools.ttLib import TTFont # 前提是先安装fontTools:pip install fontTools
  4. import re
  5. '''
  6. 起点中文网的数字数据为动态字体加密,通过观察每次刷新页面字体文件都会改变
  7. 这是一种通过字体反爬虫的手段,猫眼、大众点评也使用类似的方法阻止爬虫回去数字类信息
  8. 比如:点评数量、点评分数、电影票房等数据
  9. 解码方法是字体文件下载到本地,通过python自带的字体处理库打开,生成xml文件获取映射
  10. 将原始网页的由'&#'开头的编码根据映射关系替换即可获得具体数字
  11. 参考:https://www.bilibili.com/video/av967854064/
  12. https://blog.csdn.net/jianmoumou233/article/details/81267055
  13. https://www.cnblogs.com/chenlove/p/14858742.html
  14. 注:可将功能封装为函数
  15. '''
  16. hds = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
  17. resp = requests.get('https://www.qidian.com/rank/yuepiao/year2022-month01/', headers=hds);
  18. ct = resp.content.decode('utf-8');
  19. # print(ct);
  20. bs = BS(ct, 'lxml');
  21. c = bs.select('.rank-body .book-right-info .total p span style');
  22. # 使用正则表达式匹配获取下载链接
  23. font_url = re.findall('https.*?\'', str(c[0]));
  24. # print(font_url);
  25. # 第二条链接为.woff文件
  26. woff = requests.get(font_url[1].replace('\'', '')).content;
  27. # 存储.woff文件到本地(本地保存字体库)
  28. with open(r'.\fonts.woff', 'wb') as f:
  29. f.write(woff);
  30. f.close();
  31. # 解析字体库,得到加密规则
  32. online_fonts = TTFont(r'.\fonts.woff'); # 使用TTFont打开字体文件
  33. online_fonts.saveXML(r'.\fonts.xml'); # 将字体文件存储为xml文件
  34. font_map = online_fonts.getBestCmap(); # 获取xml文件中的字体编码映射关系
  35. # print(font_map)
  36. # 建立英文数字字典
  37. _dic = {
  38. "period": ".",
  39. "zero": "0",
  40. "one": "1",
  41. "two": "2",
  42. "three": "3",
  43. "four": "4",
  44. "five": "5",
  45. "six": "6",
  46. "seven": '7',
  47. "eight": "8",
  48. "nine": "9",
  49. }
  50. # 使用建立的字典修改字体编码映射关系,将英文改为数字
  51. for key in font_map:
  52. font_map[key] = _dic[font_map[key]];
  53. print(font_map);
  54. # 使用新的映射遍历网页内容并替换为相应数字
  55. for key in font_map:
  56. ct = ct.replace('&#' + str(key) + ';', font_map[key]);
  57. bs = BS(ct, 'lxml'); # 重新获取网页信息
  58. votes = bs.select('.rank-body .book-right-info .total p span span'); # 获取票数标签
  59. for i in range(len(votes)):
  60. print(votes[i].get_text());

3、网络爬虫

1、直接爬取页面html,从html中就能获取到结果(30%)

2、爬取的html页面只是一个空壳子,里面没有想要的内容。(50%)
    页面中我们看到的内容,是“前端页面通过请求后台接口(ajax请求),得到数据”后,又充填到html中的。
    重点:通过工具,找到提供数据的那个后台接口。

3.1、直接爬取页面html-爬取每个章节的内容

昨天的内容:爬取每个章节的内容。

  1. import requests
  2. from bs4 import BeautifulSoup as BS
  3. # 伪装成浏览器
  4. hds = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
  5. # 小说首页路径
  6. url = 'https://book.qidian.com/info/1027669580/#Catalog';
  7. resp = requests.get(url, headers=hds);
  8. ct = resp.content.decode('utf-8');
  9. # print(ct)
  10. # print(ct.index('李家的剑')) # 找到了,说明爬取到的html中包含我们想要的内容;使用BeautifulSoup解析即可
  11. bs = BS(ct, 'lxml');
  12. sa = bs.select('.volume-wrap .volume:first-child .book_name a'); #:nth-child(1)
  13. zjinfo = {}; # 名称:url地址
  14. for a in sa:
  15. zjinfo[a.get_text()] = 'https:' + a['href'];
  16. # print(zjinfo)
  17. # 遍历每个章节
  18. for k, v in zjinfo.items():
  19. u2 = v;
  20. resp = requests.get(u2, headers=hds);
  21. ct = resp.content.decode('utf-8');
  22. # print(ct.index('纯净的笑容')) # 可以使用BS解析,获取想要的内容
  23. # print(ct)
  24. bs = BS(ct, 'lxml');
  25. sps = bs.select('.main-text-wrap .read-content p'); # 通过打印ct,再次确认元素选择器结构
  26. print(len(sps)); # 89:89个自然段的内容
  27. cts = [];
  28. # 遍历,获取每一个内容,放入到cts中
  29. for p in sps:
  30. cts.append(p.get_text());
  31. # print(cts);
  32. # 写入文件
  33. f = open(r'C:\Users\lwx\Desktop\星门\{}'.format(k + '.txt'), 'w');
  34. f.write('\n'.join(cts)); # 将cts中所有字符串拼接,使用\n换行,间隔
  35. f.close();
  36. print("已下载:" + k)

3.2、爬取数据接口-英雄之刃头像

  1. import requests
  2. from bs4 import BeautifulSoup as BS
  3. # 验证,爬取到的就是一个壳子,其中没有英雄信息!!!
  4. # 伪装成浏览器
  5. hds = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
  6. url = 'https://cos.99.com/data/'
  7. resp = requests.get(url, headers=hds);
  8. ct = resp.content.decode('utf-8');
  9. # print(ct)
  10. # print(ct.index('东方月初')) # 报错
  11. bs = BS(ct, 'lxml'); # 解析html
  12. imgs = bs.select('#heroList .img img');
  13. # print(len(imgs)) # 0
  14. # 数据是通过ajax来访问后台数据接口得到的
  15. # 所以爬虫程序,需要找到数据接口,来访问得到数据
  16. # 关键: 通过浏览器调试工具 找数据接口!!!
  17. # 方法:综合根据 接口名、 筛选工具(Fetch/XHR)、响应内容等方法,来找到数据接口
  18. # 英雄信息的数据接口:
  19. # https://wjdown.99.com/games/cos/upload/yhzrheroattr/yhzr_hero_list.js?_=1641864636638
  20. # 爬取数据接口,得到英雄信息,并解析:
  21. import json
  22. # 爬取数据接口,得到数据
  23. hds = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
  24. url = 'https://wjdown.99.com/games/cos/upload/yhzrheroattr/yhzr_hero_list.js?_=1641864636638'
  25. resp = requests.get(url, headers=hds);
  26. ct = resp.content.decode('utf-8');
  27. # print(ct)
  28. # print(type(ct))
  29. # 解析接口响应的字符串,不是html页面,不需要使用BeautifulSoup
  30. # 对象形式的字符串---->对象本身
  31. ls = json.loads(ct);
  32. # print(ls)
  33. # print(type(ls))
  34. dr = r'C:\Users\lwx\Desktop\英魂之刃\{}.jpg'
  35. for h in ls:
  36. # print(h['name'])
  37. # print(h['headimg'])
  38. # https://wjdown.99.com/games/cos/upload/yhzrheroheadimg/123001.jpg
  39. resp = requests.get(h['headimg'], headers=hds);
  40. ct = resp.content; # 文件格式数据,不需要decode解码
  41. f = open(dr.format(h['name']), 'wb');
  42. f.write(ct);
  43. f.close();
  44. print('下载完成:', h['name']);

小结,根据爬取后的响应,分为如下3种情况:

  1. 爬取到的是html页面(文本信息),需要decode解码+beautifulsoup解析。
  2. 爬取到的是接口数据(文本信息),需要decode解码+json解析。
  3. 爬取到的是文件(图片、音视频、woff、pdf、doc等),不能decode解码,直接io写入本地即可。

3.3、爬取数据接口-课堂练习-王者头像

课堂练习:将王者中108个英雄的头像全部爬取下来,文件名以英雄的名字来命名:https://pvp.qq.com/web201605/herolist.shtml

提醒:

  1. 确认是否需要爬取接口,可能html页面中就包含你需要的信息;
  2. 如果decode('utf-8')不行,那就decode('gbk')尝试。

  1. # 课堂练习:将王者中108个英雄的头像全部爬取下来,文件名以英雄的名字来命名:
  2. # https://pvp.qq.com/web201605/herolist.shtml
  3. import requests
  4. from bs4 import BeautifulSoup as BS
  5. hds = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
  6. resp = requests.get('https://pvp.qq.com/web201605/herolist.shtml', headers=hds);
  7. ct = resp.content.decode('gbk');
  8. # print(ct)#有我们需要的英雄信息,所以解析html即可
  9. bs = BS(ct, 'lxml');
  10. imgs = bs.select('.herolist img');
  11. print(len(imgs)); # 93 --->不全 !!!!!
  12. # 还是需要爬接口,https://pvp.qq.com/web201605/js/herolist.json
  13. import requests
  14. import json
  15. hds = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'}
  16. resp = requests.get('https://pvp.qq.com/web201605/js/herolist.json', headers=hds);
  17. ct = resp.content.decode('utf-8');
  18. # print(ct)
  19. ls = json.loads(ct);
  20. # print(ls)
  21. # print(len(ls)) # 108 全!!
  22. # {'ename': 105, 'cname': '廉颇', 'title': '正义爆轰', 'pay_type': 10, 'new_type': 0, 'hero_type': 3, 'skin_name': '正义爆轰|地狱岩魂'}
  23. # 头像咋弄呢?
  24. url_img = 'https://game.gtimg.cn/images/yxzj/img201606/heroimg/{}/{}.jpg';
  25. dr = r'C:\Users\lwx\Desktop\王者\{}.jpg';
  26. for h in ls:
  27. hid = h['ename'];
  28. hname = h['cname'];
  29. resp = requests.get(url_img.format(hid, hid), headers=hds);
  30. ct = resp.content;
  31. f = open(dr.format(hname), 'wb');
  32. f.write(ct);
  33. f.close();
  34. print('下载完成:', hname)

心为形役,尘世马牛;身被名牵,樊笼鸡鹜。——明·陈继儒《小窗幽记》

勿自暴,勿自弃,圣与贤,可驯致。——《弟子规》

正气内存,邪不可干。——《黄帝内经》

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/1004875
推荐阅读
相关标签
  

闽ICP备14008679号