多线程Beatiful Soup爬取斗鱼所有在线主播的信息

  最近看了个爬虫的教程,想着自己也常在斗鱼看直播,不如就拿它来练练手。于是就写了个爬取斗鱼所有在线主播的信息,分别为类别、主播ID、房间标题、人气值、房间地址。

  需要用到的工具python3下的bs4,requests,pymongo。我用的IDE是pycharm,感觉这个软件实在太强大,有点离开它什么都不会的感觉,数据库Mongodb,结合pycharm工具可以直接在右侧显示数据。

#-*- coding:utf-8 -*-
from bs4 import BeautifulSoup
import requests, time ,datetime
import json
import pymongo

class douyu_host_info():
    def __init__(self):
        self.date_time = datetime.datetime.now().strftime(‘%Y-%m-%d_%H-%M‘)
        self.host_url = ‘https://www.douyu.com‘
        self.list_data = []
        self.urls_list = []
        self.headers = {
        ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36‘,
        }
    def get_url(self):
        #获取所有类别的网站地址
        urls = ‘https://www.douyu.com/directory‘
        data = requests.get(urls)
        Soup = BeautifulSoup(data.text, ‘lxml‘)
        list = Soup.select(‘.r-cont.column-cont  dl  dd  ul  li  a‘)
        for i in list:
            urls = i.get(‘href‘)
            self.urls_list.append(urls)
        print (self.urls_list)
        return self.urls_list

    def get_info(self, url):
        #查询所需信息并写调用写入数据库及本地磁盘的函数
        time.sleep(1) #避免服务器承压过大,每个网站爬取设置1s间隔
        url = self.host_url + url
        print (‘Now start open {}‘.format(url))
        get_data = requests.get(url, headers=self.headers)
        Soup = BeautifulSoup(get_data.text, ‘lxml‘)
        names = Soup.select(‘.ellipsis.fl‘)
        nums = Soup.select(‘.dy-num.fr‘)
        titles = Soup.select(‘.mes h3‘)
        hrefs = Soup.select(‘#live-list-contentbox  li  a‘)
        #网站中带directory时只是一个分类页面没有主播信息
        if ‘directory‘ in url:
            pass
        #异常处理,有少数类别的HTML元素有差别,这里就舍弃了
        try:
            category = Soup.select(‘.listcustomize-topcon-msg h1‘)[0].get_text()
        except:
            category = ‘秩名类别‘
        for name, num, href, title in zip(names, nums, hrefs, titles):
            data = {
                ‘类别‘: category,
                ‘主播‘: name.get_text(),
                ‘标题‘: title.get_text().split(‘\n‘)[-1].strip(),
                ‘链接‘: ‘https://www.douyu.com‘ + href.get(‘href‘),
                #把人气指数转换成以万为单位的浮点型,方便后面计算查找
                ‘人气指数‘: float(num.get_text()[:-1]) if ‘万‘in num.get_text() else float(num.get_text())/10000,
            }
            if data[‘人气指数‘] > 2:
                print (data)
                self.w_to_local(data)
                self.w_to_db(data)

    def open_data(self, date_time):
        #需要用到时可以输入指定时间点读取本地保存的数据
        with open(‘D:\douyu_host{}.csv‘.format(date_time), ‘r‘) as r_data:
            r_data = json.load(r_data)
            for i in r_data:
                print (i)

    def w_to_local(self,data):
        #在将数据写入数据库的同时在本地磁盘保存一份
        with open(‘D:\douyu_host{}.csv‘.format(self.date_time), ‘a‘) as w_data:
            json.dump(data, w_data)

    def w_to_db(self, data):
        #将数据写入一个以时间为后缀的数据库表, data需要是字典格式
        client = pymongo.MongoClient(‘localhost‘, 27017)
        walden = client[‘walden_{}‘.format(self.date_time)]
        sheet_tab = walden[‘sheet_tab‘]
        if data is not None:
            sheet_tab.insert_one(data)

    def check_from_db(self, date_time):
        #输入时间从数据库查询相关人气信息
        client = pymongo.MongoClient(‘localhost‘, 27017)
        walden = client[‘walden_{}‘.format(date_time)]
        sheet_tab = walden[‘sheet_tab‘]
        for data in sheet_tab.find({‘人气指数‘:{‘$gte‘:40}}):
            print (data)

  本来没想用类来写的,后来发现很多数据传来传去很乱,而且重要的数据存储时间不好统一,于是就写在一个类里了。里面很关键的一点,用select模块选取元素路径,如下图。

  复制出来的是很长的一段路径,可以慢慢观察选取主要的关键字段就好了。

  然后新建一个py文件用来调用之前写好的类,实例化后,用pool多线程运行,结果就出来了。

#-*- coding:utf-8 -*-
import time
from multiprocessing import Pool
from test0822 import douyu_host_info

douyu = douyu_host_info()

if __name__ == ‘__main__‘:
    #多线程爬取数据
    urls_list = douyu.get_url()
    pool = Pool()
    pool.map(douyu.get_info, urls_list)

来个运行后的全景图。

原文地址:https://www.cnblogs.com/lkd8477604/p/9568521.html

时间: 2024-10-02 21:30:46

多线程Beatiful Soup爬取斗鱼所有在线主播的信息的相关文章

斗鱼爬虫,爬取颜值频道的主播图片和名字

在斗鱼的界面中,如果滚动条没有拉下去,那么下面的图片都只是一条鱼的图片,所以要使浏览器自动拉动滚动条,可以用到python的selenium库, 1.配置浏览器 要使用selenium,还需要安装 chromedriver.exe,这里是使用Chrome浏览器,首先在https://npm.taobao.org/mirrors/chromedriver下这个网址中下载适合自己浏览器版本的chromedriver.exe,然后安装在Chrome浏览器的根目录下 2使用selenium库,获取斗鱼直

原生爬虫(爬取熊猫直播人气主播排名)

'''' This is a module ''' import re from urllib import request # 断点调试 class Spider(): ''' This is a class ''' # 私有方法 # 匹配所有字符 [\s\S]*? 非贪婪 url='https://www.panda.tv/all?pdt=1.27.psbar-menu.0.1oj9bbkfjbh' root_pattern = '<div class="video-info"

Python爬取斗鱼的弹幕,看看奇葩网友都说了些什么

0.前言 前几天(寒假前咯)闲着无聊,看到舍友们都在看斗鱼TV,虽然我对那些网络游戏都不是非常感兴趣,但是我突然间想到,如果我可以获取上面的弹幕内容,不就有点意思了么? 1.分析阶段 如果我想要抓取网页上面的东西,无非就是两种方法 使用浏览器,手工(自己点击)或者非手工(使用JS脚本),存取我想要的东西. 编写HTTP客户端(斗鱼无HTTPS通讯) 第一种方法是万能的,但显然是不行的, 原因如下: 学习Python中有不明白推荐加入交流裙                  号:653466668

简单的实现一个python3的多线程爬虫,爬取p站上的每日排行榜

大概半年前我开始学习python,也就是半年前,我半抄半改的同样的爬虫写了出来,由于是单线程的程序,当中出了一点的小错就会崩溃,但是那个爬虫中的header之类的东西现在依旧还是能够使用的,于是我就把之前那份的保留了下来.由于有一半是抄的,自己得到的并不多,这次重写,我相当于又重新学习了一遍.,当中有可能有认识不足的,欢迎指正. 首先我们要想登陆p站,得构造一个请求,p站登陆的请求包括: request = urllib.request.Request( #创建请求 url=login_url,

Python3网络爬虫(七):使用Beautiful Soup爬取小说

转载请注明作者和出处:http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 一.Beautiful Soup简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简

详解Python 采用 requests + Beautiful Soup 爬取房天下新楼盘推荐

最近一直在关注Python写爬虫相关的知识,尝试了采用requests + Beautiful Soup来爬取房天下(原搜房网)的推荐新楼盘. 不用不知道,一用发现有惊喜也有惊吓,本文就一同记录下惊喜和踩的一些乱码的坑. 首先,觉得Beautiful soup解析网页更加符合人类的常规思维,比使用正则表达式(python中的re库)更容易理解. 同时关于requests遇到了中文字符和特殊字符解码的问题.本文都将给于深入的解说. 软件环境 Python    : 3.6.0 PyCharm: C

python—多协程爬取斗鱼高颜值美女图片

1 import requests 2 from bs4 import BeautifulSoup 3 from urllib import request 4 # import threading 5 import gevent 6 from gevent import monkey 7 8 monkey.patch_all() 9 10 def get_html_text(url): 11 try: 12 r = requests.get(url, timeout=10) 13 r.rais

爬虫---Beautiful Soup 爬取知乎热榜

前两章简单的讲了Beautiful Soup的用法,在爬虫的过程中相信都遇到过一些反爬虫,如何跳过这些反爬虫呢?今天通过豆瓣网写一个简单的反爬中 什么是反爬虫 简单的说就是使用任何技术手段,阻止别人批量获取自己网站信息的一种方式.关键也在于批量. 反反爬虫机制 增加请求头---headers为了模拟更真实的用户场景 更改IP地址---网站会根据你的IP对网站访问频密,判断你是否属于爬虫 ua限制---UA是用户访问网站时候的浏览器标识,其反爬机制与ip限制类似 模拟帐号登录----通过reque

python协程gevent案例:爬取斗鱼美女图片

分析 分析网站寻找需要的网址 用谷歌浏览器摁F12打开开发者工具,然后打开斗鱼颜值分类的页面,如图: 在里面的请求中,最后发现它是以ajax加载的数据,数据格式为json,如图: 圈住的部分是我们需要的数据,然后复制它的网址为https://www.douyu.com/gapi/rknc/directory/yzRec/1,出于学习目的只爬取第一页(减少服务器压力).然后把网址放到浏览器中测试是否可以访问.如图: 结果正常. 分析json数据,提取图片链接 最后分析发现json中的data里面的