12.爬虫

原生爬虫

真正的爬虫功能非常复杂:
比如反爬机制、自动登录、代理IP等辅助功能
演示python小工具项目应该遵守的规范
顺便通过小案例,聊一下好代码应该如何编写
1.巩固知识
2.合理编码方式
3.了解爬虫基本原理

最开始爬豆瓣
爬取熊猫TV
爬取某个游戏分类下面,主播的人气排行

整理爬虫常规思路

利用chorme查看html结构。
主播名字、观看人数
无论简单的爬虫还是复杂的爬虫,都是通过分析html提取所需要的信息。

爬虫的前奏:
1.明确目的 -- 某一类游戏的主播的排名
2.找到数据的网页

  1. 分析网页的结构、找到数据所在的标签位置

模拟http请求,向服务器发送请求,获取服务器返回给我们的html
用正则表达式提取我们需要的数据

vscode中调试代码

断点调试 非常重要
python自带的 assert 也是好久没用过了?

html结构分析基本原则 二条

抓取的html为bytes,可以采用str函数转换格式
htmls = str(htmls, encodeing="utf-8)
寻找标签:通过标签定位所需要的信息。

数据提取层分析及 原则三

3.选择标签时,尽量选取可以闭合的标签。同时将需要爬取的一组数据包裹起来,防止分开爬取

正则分析html

正则分析获取名字和人数

数据精炼

sorted排序

案例总结

import re
from urllib import request


class Spider(object):
    url = "https://www.panda.tv/cate/lol?pdt=1.24.s1.3.7udc0vft7s5"
    # reg = re.compile(
    #     r"""[\s\S]*?nickname"[\s]*?title="([\s\S]*?)">[\s\S]*?number">([\s\S]*?)"""
    # )
    # 匹配全部内容 -> [\s\S]  . [\d\D] [\w\W]
    root_pattern = '
([\s\S]*?)
' name_pattern = '[\s\S]*?nickname"[\s]*?title="([\s\S]*?)">' number_pattern = '[\s\S]*?number">([\s\S]*?)' def __feach_content(self): r = request.urlopen(Spider.url) htmls = r.read() return htmls # assert htmls, "没有返回值" # with open("test.txt", "wb") as f: # f.write(htmls) def __analysis(self, htmls): # result = Spider.reg.findall(htmls) # print(result) root_html = re.findall(Spider.root_pattern, htmls) re_dict = [] for result in root_html: name = re.findall(Spider.name_pattern, result) number = re.findall(Spider.number_pattern, result) anchor = {"name": name, "number": number} re_dict.append(anchor) return re_dict def __refine(self, re_dict): l = lambda re_dict:{"name": re_dict["name"][0], "number": re_dict["number"][0]} return map(l, re_dict) def __sort(self, re_dict): re_dict = sorted(re_dict, key=self.__sort_seed, reverse=True) return re_dict def __sort_seed(self, re_dict): # 排序种子,对应re_dict的一个元素 r = re.findall("\d*", re_dict["number"]) number = float(r[0]) if "万" in re_dict["number"]: number *= 10000 return number def __show(self, re_dict): for rank in range(0, len(re_dict)): print("rank:" + str(rank + 1) + "---" + re_dict[rank]["name"] + "----" + re_dict[rank]["number"]) def go(self): htmls = self.__feach_content() htmls = htmls.decode("utf-8") # 提取大块数据 re_dict = self.__analysis(htmls) # 分析数据 re_dict = self.__refine(re_dict) # 数据精炼 re_dict = self.__sort(re_dict) self.__show(re_dict) spider = Spider() spider.go()

你可能感兴趣的:(12.爬虫)