实战:原生爬虫

以爬取虎牙直播某具体分类下的主播名称及访问量,并根据访问量排序

思路:

(1)获取网页内容

(2)分析所要获取的数据格式

(3)获取相应的数据

(4)将数据转化为所需要的格式

(5)数据展现

一、类里面所包含的函数

二、具体实现

1、引入request,通过request获取页面内容,注意编码问题!!!!

from urllib import request
 url = 'https://www.huya.com/g/lol'
#私有方法
    def __fetch__content(self):
        r=request.urlopen(Spider.url)
        htmls = r.read()
        htmls = str(htmls, encoding='utf-8')
        return htmls

2、分析页面内容,编写相应的正则表达式获取所需数据

一般选择最近一层能完整包含所需内容的标签

正则表达式:

 #加上问号表示是非贪婪模式
    #加上括号表示组的概念,去掉li
    root_pattern='<span class="txt">([\s\S]*?)</li>'
    name_pattern='<i class="nick" title="([\s\S]*?)">'
    number_pattern='<i class="js-num">([\s\S]*?)</i>'
#分析页面结构,获取相应数据
    def __analysis(self,htmls):
       root_html =  re.findall(Spider.root_pattern,htmls)

       anchors = []
       for html in root_html:
           name=re.findall(Spider.name_pattern,html)
           number=re.findall(Spider.number_pattern,html)
           anchor={'name':name,'number':number}
           anchors.append(anchor)

       return anchors

3、本案例中数据较为标准,在其他情况下,上述操作完成后可能需要删除空格获得换行等,然后将数据转化为所需格式

#数据精炼,将数据转化为需要的数据格式
    def __refine(self,anchors):
        l = lambda anchor:{
            'name':anchor['name'][0].strip(),
            'number':anchor['number'][0]
        }
        return map(l,anchors)

4、对获取到的数据进行处理,如排序

#排序函数
    def __sort(self,anchors):
        #用key指定按照什么排序
        #???为什么这里可以不用传参数???
        anchors = sorted(anchors,key=self.__sort_seed,reverse = True)
        return anchors

    #排序规则
    def __sort_seed(self,anchor):
        r=re.findall('\d*',anchor['number'])
        number = float(r[0])
        # if '万' in anchor['number']:
        #           number *= 10000
        return number

5、数据展现

#展示数据
    def __show(self,anchors):
        for rank in range(0,len(anchors)):
            print('rank ' + str(rank + 1) + ' : ' + anchors[rank]['name']
                  +'     '+anchors[rank]['number'])

三、结果

四、完整代码

from urllib import request
import re
class Spider():
    '''
    < span class ="txt" >
        < span class ="avatar fl" >
            < img data - original = "https://huyaimg.msstatic.com/avatar/1084/b7/896bc815db9560eabbcb4a227f62ba_180_135.jpg"
            src = "https://huyaimg.msstatic.com/avatar/1084/b7/896bc815db9560eabbcb4a227f62ba_180_135.jpg"
            onerror = "this.onerror=null; this.src='//a.msstatic.com/huya/main/assets/img/default/84x84.jpg';"alt = "卡尔"title = "卡尔" >
        < i class ="nick" title="卡尔" > 卡尔 < / i >
        < / span >
        < span class ="num" >
          < i class ="num-icon" > < / i >
          < i class ="js-num" > 273.7万 < / i >
        < / span >
    < / span >
    '''
    url = 'https://www.huya.com/g/lol'
    #加上问号表示是非贪婪模式
    #加上括号表示组的概念,去掉li
    root_pattern='<span class="txt">([\s\S]*?)</li>'
    name_pattern='<i class="nick" title="([\s\S]*?)">'
    number_pattern='<i class="js-num">([\s\S]*?)</i>'

    #私有方法
    def __fetch__content(self):
        r=request.urlopen(Spider.url)
        htmls = r.read()
        htmls = str(htmls, encoding='utf-8')
        return htmls

    #分析页面结构,获取相应数据
    def __analysis(self,htmls):
       root_html =  re.findall(Spider.root_pattern,htmls)
       
       anchors = []
       for html in root_html:
           name=re.findall(Spider.name_pattern,html)
           number=re.findall(Spider.number_pattern,html)
           anchor={'name':name,'number':number}
           anchors.append(anchor)
           
       return anchors

    #数据精炼,将数据转化为需要的数据格式
    def __refine(self,anchors):
        l = lambda anchor:{
            'name':anchor['name'][0].strip(),
            'number':anchor['number'][0]
        }
        return map(l,anchors)

    #排序函数
    def __sort(self,anchors):
        #用key指定按照什么排序
        #???为什么这里可以不用传参数???
        anchors = sorted(anchors,key=self.__sort_seed,reverse = True)
        return anchors

    #排序规则
    def __sort_seed(self,anchor):
        r=re.findall('\d*',anchor['number'])
        number = float(r[0])
        # if '万' in anchor['number']:
        #           number *= 10000
        return number

    #展示数据
    def __show(self,anchors):
        for rank in range(0,len(anchors)):
            print('rank ' + str(rank + 1) + ' : ' + anchors[rank]['name']
                  +'     '+anchors[rank]['number'])

    #入口函数
    def go(self):
        htmls = self.__fetch__content()
        anchors = self.__analysis(htmls)
        anchors= list(self.__refine(anchors))
        anchors = self.__sort(anchors)
        self.__show(anchors)

spider = Spider()
spider.go()

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值