入门级网络爬虫——你认识的LOL主播这里都有!

一、爬取目标:

爬虫的爬取网址:斗鱼直播_英雄联盟

抓取三份数据:1 直播标题 title 2 主播名 name 3主播人气 number

 

二、网页分析

右键单击 审查元素/检查,或者快捷键F12 ,可以看到下面网页的右边部分,同时找到了title name number的对应部分,网页分析完毕。

三、三种数据爬取方法分析对比

1 request库:请求HTTP网址 + beautifulsoup库之select函数:抓取数据。

   request库请求HTTP网址,获取网址的标签信息。

class Spider():
    url='https://www.douyu.com/g_LOL'
    def _fetch_content(self):
        headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
        #添加头信息 防止反爬虫文件识别
        r=requests.get(Spider.url,headers=headers)
        htmls=r.text    
        return htmls

获取每位主播的title、name、number信息。

def _analysis(self,htmls): #分析字符串文本
     soup=BeautifulSoup(htmls,'html.parser')     
     all_articles=soup.select("#listAll > div.layout-Module-container.layout-Cover.ListContent > ul > li")
     anchors=[]
     for article in all_articles:
     title=article.select("div > a.DyListCover-wrap > div.DyListCover-content > div:nth-child(1) > h3")[0].get_text()
     name=article.select("div > a.DyListCover-wrap > div.DyListCover-content > div:nth-child(2) > h2")[0].get_text()
     number=article.select("div > a.DyListCover-wrap > div.DyListCover-content > div:nth-child(2) > span")[0].get_text()
     anchor={'title':title,'name':name,'number':number}
     anchors.append(anchor)
     return anchors

根据主播人气进行降序排列;针对人气中以“万”单位的人气值,sortseed函数处理成整数形式。

def _sort(self,anchors):
        anchors=sorted(anchors,key=self._sortseed,reverse=True) #sorted()列表中元素的排序 key可传输函数 实现自定义类型的排序 返回某列参数 
        return anchors

    def _sortseed(self,anchor):
        r=re.findall('\d*',anchor['number'])   #\d匹配数字
        number=float(r[0])                     #r为列表,取第一个元素
        if '万' in anchor['number']:
            number=number*10000
        return number

总控方法:分别驱动每一个函数有序运行。

def go(self): #总控方法
        htmls=self._fetch_content()
        anchors=self._analysis(htmls)
        #anchors=self._refine(anchors)
        anchors=self._sort(anchors)
        df=pd.DataFrame(anchors)
        df.to_csv("results.csv",encoding='utf_8_sig', index=False)

运行结果如下,数据并导入csv文件。

2 urllib库:请求HTTP网址+re正则表达式:抓取数据。

 request库请求HTTP网址,获取网址的标签信息。

class Spider():
     url='https://www.douyu.com/g_dance'
     root_pattern='div class="DyListCover-info"><span class="DyListCover-hot is-template">([\S\s]*?)</div>' 
     name_pattern='xlink:href="#icon-user_c95acf8"></use></svg>([\s\S]*?)</h2>'
     number_pattern='xlink:href="#icon-hot_8a57f0b"></use></svg>([\s\S]*?)</span><h2'

     def _fetch_content(self):
         r=request.urlopen(Spider.url)
         #bytes
         htmls=r.read()
         buff = BytesIO(htmls)
         f = gzip.GzipFile(fileobj=buff)
         htmls = f.read().decode('utf-8') 
         return htmls

获取每位主播的title、name、number信息。

def _analysis(self,htmls): 
         root_html=re.findall(Spider.root_pattern,htmls)
         #print(root_html[1:5])
         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

根据主播人气进行降序排列;针对人气中以“万”单位的人气值,sortseed函数处理成整数形式。

def _sort(self,anchors):
        anchors=sorted(anchors,key=self._sortseed,reverse=True) #sorted()列表中元素的排序 key可传输函数 实现自定义类型的排序 返回某列参数 
        return anchors

    def _sortseed(self,anchor):
        r=re.findall('\d*',anchor['number'])   #\d匹配数字
        number=float(r[0])                     #r为列表,取第一个元素
        if '万' in anchor['number']:
            number=number*10000
        return number

总控方法:分别驱动每一个函数有序运行,同时导出至CSV文件,数据一致。

     def go(self): #总控方法
         htmls=self._fetch_content()
         anchors=self._analysis(htmls)
         anchors=self._sort(anchors)
         df=pd.DataFrame(anchors)
         df.to_csv("results.csv",encoding='utf_8_sig', index=False)

3 request库:请求HTTP网址+beautifulsoup之find函数。

此方法与第一个方法类似,由于find的函数的attrs部分需要自己根据数据的定位逐个找寻,十分麻烦!同时在尝试了几次后代码时钟放错及其浪费时间,因此放弃了第三种方法。

四、总结

urllib+正则表达式:可以抓取数据,但是效率较底下,每次抓取数据需要自己按照标签信息逐条填写正则表达式的str部分。

request库+beautifulsoup的select函数:效率最高,抓取效果也很好,个人十分推荐!!!

request库+beautifulsoup的find函数:效率低下,抓取数据的准确率不高,取决于网页标签的数据分布类型,个人不太推荐!


结语:

本次的信息抓取完毕,同时笔者的编程能力不是很好,欢迎志同道合的朋友一起学习进步。

同时上述的只摘取了程序的部分代码,对完整代码有兴趣的朋友欢迎关注我,个人微信上分享给你代码部分。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值