情诗网 >套路情话 > 正文

大话爬虫的基本套路

来源:情诗网    2021-04-04    分类:套路情话


图片

什么是爬虫?

网络爬虫也叫网络蜘蛛,如果把互联网比喻成一个蜘蛛网,那么蜘蛛就是在网上爬来爬去的蜘蛛,爬虫程序通过请求url地址,根据响应的内容进行解析采集数据,
比如:如果响应内容是html,分析dom结构,进行dom解析、或者正则匹配,如果响应内容是xml/json数据,就可以转数据对象,然后对数据进行解析。


有什么作用?

通过有效的爬虫手段批量采集数据,可以降低人工成本,提高有效数据量,给予运营/销售的数据支撑,加快产品发展。


业界的情况

目前互联网产品竞争激烈,业界大部分都会使用爬虫技术对竞品产品的数据进行挖掘、采集、大数据分析,这是必备手段,并且很多公司都设立了爬虫工程师的岗位


合法性

爬虫是利用程序进行批量爬取网页上的公开信息,也就是前端显示的数据信息。因为信息是完全公开的,所以是合法的。其实就像浏览器一样,浏览器解析响应内容并渲染为页面,而爬虫解析响应内容采集想要的数据进行存储。


反爬虫

爬虫很难完全的制止,道高一尺魔高一丈,这是一场没有硝烟的战争,码农VS码农
反爬虫一些手段:


爬虫基本套路


python爬虫


实例解析

斗鱼主播排行

申明:此例子仅作为爬虫学习DEMO,并无其他利用


基于python实现爬虫学习基础demo

def douyu_rank(rankName, statType):
    '''
        斗鱼主播排行数据抓取
        [数据地址](https://www.douyu.com/directory/rank_list/game)

        * `rankName` anchor(巨星主播榜),fans(主播粉丝榜),haoyou(土豪实力榜),user(主播壕友榜)
        * `statType` day(日),week(周),month(月)
    '''
    if not isinstance(rankName, ERankName):
        raise Exception("rankName 类型错误,必须是ERankName枚举")
    if not isinstance(statType, EStatType):
        raise Exception("statType 类型错误,必须是EStatType枚举")

    rankName = '%sListData' % rankName.name
    statType = '%sListData' % statType.name
    # 请求获取html源码 
    rs = rq.get(
        "https://www.douyu.com/directory/rank_list/game",
        headers={'User-Agent': 'Mozilla/5.0'})
    # 正则解析出数据
    mt = re.search(r'rankListData\s+?=(.*?);', rs, re.S)
    if (not mt):
        print u"无法解析rankListData数据"
        return
    grps = mt.groups()
    # 数据转json
    rankListDataStr = grps[0]
    rankListData = json.loads(rankListDataStr)
    dayList = rankListData[rankName][statType]
    # 修改排序
    dayList.sort(key=lambda k: (k.get('id', 0)), reverse=False)
    return dayList


def douyu_room(romm_id):
    '''
        主播房间信息解析
        [数据地址](https://www.douyu.com/xxx)
        'romm_id' 主播房号
    '''
    rs = rq.get(
        ("https://www.douyu.com/%s" % romm_id),
        headers={'User-Agent': 'Mozilla/5.0'})
    mt = re.search(r'\$ROOM\s+?=\s+?({.*?});', rs, re.S)
    if (not mt):
        print u"无法解析ROOM数据"
        return
    grps = mt.groups()
    roomDataStr = grps[0]
    roomData = json.loads(roomDataStr)
    return roomData
    
def run():
    '''
        测试爬虫
    '''
    datas = douyu_rank(ERankName.anchor, EStatType.month)
    print '\r\n主播排行榜:'
    for item in datas:
        room_id = item['room_id']
        roomData = douyu_room(room_id)
        rommName = None
        if roomData is not None:
            rommName = roomData['room_name']
        roomInfo = (u'房间(%s):%s' % (item['room_id'], rommName))
        print item['id'], item[
            'nickname'], roomInfo, '[' + item['catagory'] + ']'


run()


运行结果:

主播排行榜:

无法解析ROOM数据
1 冯提莫 房间(71017):None [英雄联盟]
2 阿冷aleng丶 房间(2371789):又是我最喜欢的阿冷ktv时间~ [英雄联盟]
3 胜哥002 房间(414818):胜哥:南通的雨下的我好心累。 [DNF]
4 White55开解说 房间(138286):卢本伟五五开 每天都要很强 [英雄联盟]
5 东北大鹌鹑 房间(96291):东北大鹌鹑 宇宙第一寒冰 相声艺术家! [英雄联盟]
6 老实敦厚的笑笑 房间(154537):德云色 给兄弟们赔个不是 [英雄联盟]
7 刘飞儿faye 房间(265438):刘飞儿  月底吃鸡 大吉大利 [绝地求生]
8 pigff 房间(24422):【PIGFF】借基地直播,没OW [守望先锋]
9 云彩上的翅膀 房间(28101):翅:还是抽天空套刺激! [DNF]
10 yyfyyf 房间(58428):无尽的9月,杀 [DOTA2]

# 冯提莫 房间做周年主题,解析会有问题

Demo源码地址


=>我的原文地址

热门文章