某鱼直播数据全站爬取

前言

本次爬取使用了代理IP,爬取全站为1个小时,当然也可以不用代理proxy,但是要设置爬取速度 time.sleep(5)

先附上完整代码,下面有详解

import csv
from fake_useragent import UserAgent
import json

from lxml import etree

import requests

# 代理服务器
proxyHost = "http-dyn.abuyun.com"
proxyPort = "9020"

# 代理隧道验证信息
proxyUser = "HM89Z6WLA4F6N05D"
proxyPass = "C8CF37D06DBED9DB"

proxyMeta = "http://%(user)s:%(pass)[email protected]%(host)s:%(port)s" % {
    "host": proxyHost,
    "port": proxyPort,
    "user": proxyUser,
    "pass": proxyPass,
}

proxies = {
    "http": proxyMeta,
    "https": proxyMeta,
}

headers = {"User-Agent": ‘{}‘.format(UserAgent().random),
           "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
           "Accept-Language": "en-us",
           "Connection": "keep-alive",
           "Accept-Charset": "GB2312,utf-8;q=0.7,*;q=0.7"}

#-------- 获取 游戏名称 和 url ------------#
directory_url = ‘https://www.douyu.com/directory‘

Web = requests.get(directory_url, headers=headers, proxies=proxies).text

dom = etree.HTML(Web)

Game_urls_list = []
Game_names_list = []
for i in range(3, 13):
    Game_names = dom.xpath(‘//*[@id="allCate"]/section/div[{}]/ul/li/a/strong/text()‘.format(i))
    Game_urls = dom.xpath(‘//*[@id="allCate"]/section/div[{}]/ul/li/a/@href‘.format(i))

#--------------游戏名和游戏url放入新的列表,并分割游戏url(后面会用到)----------#
    for Gn in Game_names:
        Game_names_list.append(Gn)
    for Gu in Game_urls:
        G_url = Gu.split(‘_‘)[1]
        Game_urls_list.append(G_url)

#----------把名字和url存入字典------------#
All_game = dict(zip(Game_names_list, Game_urls_list))

#----------依次取出字典的 key 循环----------#
for G_name in All_game.keys():
    print("===========正在爬取========", G_name)
    count = 1  # 因为不同游戏分区,爬取页数不一样,用count计数做一个灵活的爬取办法

    for page in range(1, 350):   #观察得一个游戏最多不会超过350页
        # time.sleep(5)
        base_api = ‘https://m.douyu.com/api/room/list?page={}&type={}‘.format(page, All_game[‘{}‘.format(G_name)])
        try:
            response = requests.get(base_api, headers=headers, proxies=proxies, timeout=30, verify=False).text

        except IOError:
            pass

        RoomList = json.loads(response).get(‘data‘).get(‘list‘)

        if len(RoomList) > 1:
        # 本页api有数据,count+1
            count += 1
            path = ‘/home/liuyang/Spider/Scrapy_Project/BS_Spider/Douyu/Info_Douyu2020-04-05-14:00.csv‘

            for room in RoomList:
                GameName = G_name
                RoomId = room.get(‘rid‘)
                RoomName = room.get(‘roomName‘)
                BlogName = room.get(‘nickname‘)
                HotSpots = room.get(‘hn‘)

                with open(path, "a+", encoding=‘utf-8-sig‘) as f:
                    writer = csv.writer(f, dialect="excel")
                    csv_write = csv.writer(f)
                    csv_data = [G_name, RoomId, RoomName, BlogName, HotSpots]
                    csv_write.writerow(csv_data)
                    f.close()
                    print(G_name, RoomId, RoomName, BlogName, HotSpots)
        else:
            count -= 10
	    # 本页没有数据,count减去10,
	    # 因为前面只要有数据 count就会 +1,如果page=1 那么 count=2 ,page=2 则count=3......
	    # 一旦有一页(最后一页)没有数据,那么count -10 ,满足conut<page 则 break,就说明这个游戏所有页数全部爬取完了,开始爬取下一个游戏
        print(count, page)

        if count < page:
        # 因为有的游戏只有 10多页 而有的游戏有350多页,所以没必要对一个10多页游戏的api重复请求350次
            break

如果需要IP代理的话推荐阿布云,可以按小时计算 1h 1块钱,毕竟家境贫寒,代理IP可以看看一看这片文章https://zhuanlan.zhihu.com/p/36207770

详解:

我们是先把各个游戏的名称url爬取下来并存入字典,然后再依次取出字典进入各个游戏分区对所有直播间进行爬取

先从斗鱼的分类地址获取所有游戏:https://www.douyu.com/directory

directory_url = ‘https://www.douyu.com/directory‘

获取一个游戏所有直播数据:

先从斗鱼的分类地址:https://www.douyu.com/directory,中点开一个游戏,就LOL了

点进去后,不用进入直播间,我们直接从api接口获取数据,比如LOL第1页的API链接就是:https://m.douyu.com/api/room/list?page=1{}&type=LOL

API 页面是这样的

Over!

最后欢迎访问我的个人博客:wangwanghub.com

郑重声明:本项目及所有相关文章,仅用于经验技术交流,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关。

原文地址:https://www.cnblogs.com/wangwanghub/p/12638690.html

时间: 2024-08-01 05:28:51

某鱼直播数据全站爬取的相关文章

python爬虫---CrawlSpider实现的全站数据的爬取,分布式,增量式,所有的反爬机制

CrawlSpider实现的全站数据的爬取 新建一个工程 cd 工程 创建爬虫文件:scrapy genspider -t crawl spiderName www.xxx.com 连接提取器LinkExtractor 可以根据指定的规则对指定的连接进行提取 提取的规则就是构造方法中的allow('正则表达式')参数决定 规则解析器Rule 可以将将连接提取器提取到的连接进行请求发送,可以根据指定的规则(callback)对请求到的数据进行解析 follow=True:将连接提取器 继续作用到

爬虫 --- 07. 全站爬取, post请求,cookie, 传参,中间件,selenium

一.全站数据的爬取 - yield scrapy.Request(url,callback):callback回调一个函数用于数据解析 # 爬取阳光热线前五页数据 import scrapy from sunLinePro.items import SunlineproItem class SunSpider(scrapy.Spider): name = 'sun' # allowed_domains = ['www.xxx.com'] start_urls = ['http://wz.sun0

爬虫 + 数据分析 - 7 CrawlSpider(全站爬取), 分布式, 增量式爬虫

一.全站爬取(CrawlSpider) 1.基本概念 作用:就是用于进行全站数据的爬取 - CrawlSpider就是Spider的一个子类 - 如何新建一个基于CrawlSpider的爬虫文件 - scrapy genspider -t crawl xxx www.xxx.com - LinkExtractor连接提取器:根据指定规则(正则)进行连接的提取 - Rule规则解析器:将链接提取器提取到的链接进行请求发送,然后对获取的页面数据进行 指定规则(callback)的解析 - 一个链接提

python爬虫入门 之 移动端数据的爬取

第七章 移动端数据的爬取 基于某一款抓包工具 : fiddler ,青花瓷 ,miteproxy 7.1 fiddler 基本配置 7.1.1fiddler简介和安装 什么是Fiddler? Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一 . 它能够记录客户端和服务器之间的所有 HTTP请求,可以针对特定的HTTP请求,分析请求数据.设置断点.调试web应用.修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是web调试的利器. Fiddler

全站爬取cnblogs

全站爬取cnblogs 创建 """ # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com """ 代码演示 """ # -*- coding: utf-8 -*- import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scr

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器, 分布式爬虫, java等语言概念补充, bilibili爬视频参考

1 全站爬取cnblogs # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com 示例: # cnblogs_crawl/cnblogs_crawl/spiders/cnblogs.py import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scrapy.http import Request class

使用 Chrome 浏览器插件 Web Scraper 10分钟轻松实现网页数据的爬取

本文标签: WebScraper Chrome浏览器插件 网页数据的爬取 使用Chrome 浏览器插件 Web Scraper 可以轻松实现网页数据的爬取,不写代码,鼠标操作,点哪爬哪,还不用考虑爬虫中的登陆.验证码.异步加载等复杂问题. Web Scraper插件 Web Scraper 官网中的简介: Web Scraper Extension (Free!)Using our extension you can create a plan (sitemap) how a web site

雪球数据的爬取

import requests from lxml import etree import json import pymongo # 连接mongodb 数据库 存mongodb中 client = pymongo.MongoClient('127.0.0.1', port=27017) db = client.xueqiu collection = db.xueqiu url = 'https://xueqiu.com/' headers = { "User-Agent": &qu

爬虫入门五(移动端数据的爬取)

常用的抓包工具 常用的抓包工具:本质就是一款服务器,适用于实现请求和响应的拦截 fiddler 默认只可以抓起http协议的请求和响应 https: tools - options - https - detrypt https traffic 含义:将fiddler的证书安装到本地 青花瓷(charles) miteproxy 移动端数据的爬取 配置相关的环境 fiddler的配置: tools->options->connections->allow remote conxxx 查看