为了账号安全,请及时绑定邮箱和手机立即绑定

使用python编写一个原生小爬虫

2019.07.25 21:46 175浏览

引言

本篇是在学习Python基础知识之后的一次小小尝试,这次将会爬取斗鱼TV网页上的王者荣耀主播排名,在不借助第三方框架的前提下演示一个爬虫的原理。

一、实现Python爬虫的思路

第一步:明确目的
1.找到想要爬取数据的网页
2.分析网页结构,找到需要爬取数据所在的标签位置

第二步:模拟Http请求,提取数据,加工数据
1.模拟Http网络请求,向服务器发送请求,获取服务器返回给我们的html
2.使用正则表达式从Html中提取我们需要的数据(比如本例中的主播名字和人气)
3.对提取的数据进行加工,显示成我们可以直观查看的形式

二、查看网页源码,观察关键值

我们应该首先找到需要处理的网页,即:斗鱼TV网页上的英雄联盟,然后查看这个网页的源代码,观察我们需要关注的数据在哪个位置,下面是截取的网页效果图。

图片描述

然后,我们需要在浏览器中查看当前网页的Html源码,不同的浏览器中查看的操作会有所不同,这个需要自行百度一下。此次我们需要拿到每个主播的名字和视频浏览量,从下面源码中我们可以很快发现这些关键数据的位置,如图中的标注。
图片描述

三、实现Python爬虫的具体实践

下面就是实现爬取数据的具体操作了,这里是创建了一个爬虫类Spider,然后使用不同的正则获取Html标签里的数据,进而将其重新整理后打印显示,具体的代码如下。注释中标记了各处的作用。

from urllib import request 
import re
class Spider():
    p = '<p>([\s\S]*)</p>'
    num = '<span class="dy-num fr">([\s\S]*?)</span>' # 匹配主播人气
    name = '<span class="dy-name ellipsis fl">([\s\S]*?)</span>' # 匹配主播名
    url ='https://www.douyu.com/g_LOL'
# 抓取网页数据
    def __fetch_content(self):
        r = request.urlopen(Spider.url)
        print(r)
        htmls = r.read()
        htmls = str(htmls, encoding='utf-8')
        return htmls
# 将数据放入到字典中
    def __analysis(self, htmls):
        auchors = []
        p = re.findall(self.p, htmls)
        for html in p:
            num = re.findall(Spider.num, html)
            name = re.findall(Spider.name, html)
        auchor = {'name': name,'number':num}
        auchors.append(auchor)
        return auchors
# 提取name
    def __name(self,anchors):
        c=[]
        for a in anchors:
            for b in a['name']:
                c.append(b)
        return c
# 提取number
    def __number(self, anchors):
        d = []
        for a in anchors:
            for b in a['number']:
                d.append(b)
        return d
#整理数据
    def __show(self,name,number):
        for x,y in zip(name, number):
            print('主播名:'+x+'-------------------'+'人气:'+y)
# 入口方法
    def go(self):
        htmls = self.__fetch_content()
        anchors = self.__analysis(htmls)
        live_name = self.__name(anchors)
        live_number = self.__number(anchors)
        anchors = self.__show(live_name,live_number)
spider = Spider()
spider.go()
点击查看更多内容
0人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 邀请有奖 帮助中心 APP下载
官方微信

举报

0/150
提交
取消