获取斗鱼直播间每个房间的名称、观看人数、tag、主播名字

代码:

import time
from multiprocessing import Pool from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from bs4 import BeautifulSoup
from pymongo import MongoClient
from pymongo.errors import PyMongoError # monogdb配置信息
MONGO_HOST = "localhost"
MONGO_DATABASE = "douyu"
MONGO_TABLE = "zhibo"
client = MongoClient(host=MONGO_HOST)
db = client[MONGO_DATABASE] # PhantomJS 命令行相关配置
# 参见 http://phantomjs.org/api/command-line.html
SERVICE_ARGS = ['--disk-cache=true', '--load-images=false'] # driver = webdriver.Chrome() # 有界面
driver = webdriver.PhantomJS(service_args=SERVICE_ARGS) # 无界面
delay = 10
wait = WebDriverWait(driver, delay)
driver.maximize_window() def get_total_pages():
url = 'https://www.douyu.com/directory/all'
driver.get(url)
pages = int(driver.find_element_by_css_selector(
'.shark-pager-dot + .shark-pager-item').text)
print("正在获取第1页数据")
room_list = get_rooms_by_beautifulsoup()
save_to_monogodb(room_list)
return pages # 根据页码获取指定页数据,并将其保存到数据库中
def parse_page(page_num):
print("正在获取第%d页数据" % page_num)
try:
page_num_box = wait.until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, "input.jumptxt")))
go_btn = wait.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, 'a.shark-pager-submit')))
page_num_box.clear()
page_num_box.send_keys(page_num)
go_btn.click()
# driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# time.sleep(0.1)
wait.until(
EC.text_to_be_present_in_element(
(By.CSS_SELECTOR,
'.shark-pager-item.current'),
str(page_num)))
# 对于By.CLASS_NAME invalid selector: Compound class names not permitted
room_list = get_rooms_by_beautifulsoup()
save_to_monogodb(room_list)
except TimeoutException:
print("请求第%d页失败" % page_num)
print("尝试重新获取第%d页" % page_num)
return parse_page(page_num) # 通过bs4解析数据
def get_rooms_by_beautifulsoup():
'''
通过bs4库解析数据
获取直播间的名称,观看人数,标签,主播名
'''
wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, "ul#live-list-contentbox > li")))
html = driver.page_source soup = BeautifulSoup(html, 'lxml')
rooms = soup.select('ul#live-list-contentbox > li')
for room in rooms:
room_name = room.find(
'h3', attrs={
'class': 'ellipsis'}).get_text(
strip=True)
view_count = room.find('span', class_='dy-num fr').text
tag = room.find('span', class_='tag ellipsis').text
hostname = room.find('span', class_='dy-name ellipsis fl').text
#print("房间名: " + room_name + "\t观看人数: " + view_count + "\t标签: " + tag + "\t主播名: " + hostname)
yield {
'room_name': room_name,
'view_count': view_count,
'tag': tag,
'hostname': hostname,
} def save_to_monogodb(room_list):
for room in room_list:
try:
db[MONGO_TABLE].insert(room) # insert支持插入多条数据
print("mongodb插入数据成功:", room)
except PyMongoError as e:
print("mongodb插入数据失败:", room, e) if __name__ == '__main__':
try:
total_pages = get_total_pages()
for page_num in range(2, total_pages + 1):
parse_page(page_num)
except Exception as e:
print("出错了", e)
finally: # 确保 浏览器能正常关闭
print("共有%d页" % total_pages)
driver.close()

使用Selenium模拟浏览器抓取斗鱼直播间信息的更多相关文章

  1. Selenium模拟浏览器抓取淘宝美食信息

    前言: 无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到sel ...

  2. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  3. 使用selenium模拟浏览器抓取淘宝信息

    通过Selenium模拟浏览器抓取淘宝商品美食信息,并存储到MongoDB数据库中. from selenium import webdriver from selenium.common.excep ...

  4. 3.使用Selenium模拟浏览器抓取淘宝商品美食信息

    # 使用selenium+phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏览器翻页,并 ...

  5. Python爬虫学习==>第十二章:使用 Selenium 模拟浏览器抓取淘宝商品美食信息

    学习目的: selenium目前版本已经到了3代目,你想加薪,就跟面试官扯这个,你赢了,工资就到位了,加上一个脚本的应用,结局你懂的 正式步骤 需求背景:抓取淘宝美食 Step1:流程分析 搜索关键字 ...

  6. 16-使用Selenium模拟浏览器抓取淘宝商品美食信息

    淘宝由于含有很多请求参数和加密参数,如果直接分析ajax会非常繁琐,selenium自动化测试工具可以驱动浏览器自动完成一些操作,如模拟点击.输入.下拉等,这样我们只需要关心操作而不需要关心后台发生了 ...

  7. 使用Selenium模拟浏览器抓取淘宝商品美食信息

    代码: import re from selenium import webdriver from selenium.webdriver.common.by import By from seleni ...

  8. 爬虫实战--使用Selenium模拟浏览器抓取淘宝商品美食信息

    from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exce ...

  9. Path通过Selenium模拟浏览器抓取,Windows 64解决selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.方法

    1.下载geckodriver.exe: 下载地址:https://github.com/mozilla/geckodriver/releases请根据系统版本选择下载:(如Windows 64位系统 ...

随机推荐

  1. djang 过滤器和装饰器

    Django自定义过滤器 Django 自定义过滤器, 在项目目录中建立templatetags目录. 建立my_filter.py 文件, 导入模板模块 :from django import te ...

  2. POJ3090 Visible Lattice Points (数论:欧拉函数模板)

    题目链接:传送门 思路: 所有gcd(x, y) = 1的数对都满足题意,然后还有(1, 0) 和 (0, 1). #include <iostream> #include <cst ...

  3. Python数据结构与算法(排序)

    https://www.cnblogs.com/fwl8888/p/9315730.html

  4. hdu4135 Co-prime 容斥原理

    Given a number N, you are asked to count the number of integers between A and B inclusive which are ...

  5. struts2的国际化i18n

    先来例子,普通的读取配置文件中不同语言信息,一个测试类,一份中文配置文件,一份英文配置文件 中文配置文件,书写中文“欢迎”,myelipse自动转码 public class Readi18n { p ...

  6. MySQL系列-优化之like关键字 创建索引

    原文: https://blog.csdn.net/ufo___/article/details/81164996 MySQL系列-优化之覆盖索引:  https://blog.csdn.net/UF ...

  7. xencenter如何安装Centos7虚拟机系统

    xencenter的ip地址192.168.245.134(win10系统) 首先我们在win10系统安装好xencenter(这个软件可以直接在xenserver启动后,通过访问xenserver的 ...

  8. c的动态内存管理

    在linux系统下使用malloc提示警告,解决方法,加入头文件<stdlib.h> 首先来个基本的例子 int *p=(int *)malloc(sizeof(int));(当mallo ...

  9. 使用 pkg 打包分发 nodejs 应用

    pkg 是一个很不错的跨平台 nodejs 应用打包工具,使用此工具,我们只需要给与用户提供一个简单的 可执行文件就可以了,同时代码也是二进制的,提高了代码的安全性 备注:测试demo 很简单,也比较 ...

  10. timescaledb 集成 madlib

    github 上有人提出了一个问题(2017 很早了),然后搜索timescaledb 的docs 文档,发现有 一片介绍的文章,所以尝试运行下 备注: 环境使用虚拟机安装(没有使用docker ma ...