12.爬虫

作者: tomtiddler | 来源:发表于2018-10-01 09:23 被阅读0次

    原生爬虫

    真正的爬虫功能非常复杂:
    比如反爬机制、自动登录、代理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"""<div[\s]*?class="video-info">[\s\S]*?nickname"[\s]*?title="([\s\S]*?)">[\s\S]*?number">([\s\S]*?)</span>"""
        # )
        # 匹配全部内容 -> [\s\S]  . [\d\D] [\w\W]
        root_pattern = '<div class="video-info">([\s\S]*?)</div>'
        name_pattern = '[\s\S]*?nickname"[\s]*?title="([\s\S]*?)">'
        number_pattern = '[\s\S]*?number">([\s\S]*?)</span>'
    
        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.爬虫

          本文链接:https://www.haomeiwen.com/subject/lwmonftx.html