获取斗鱼直播间每个房间的名称、观看人数、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. ccf 201312-04 有趣的数(组合数学)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  2. 配置url防盗链、目录权限访问控制Directory、文件访问权限控制FilesMatch

    1.配置url防盗链: 编辑:/usr/local/apache2.4/conf/extra/httpd-vhosts 文件 写入: <Directory /var/www/222/>Se ...

  3. T-SQL 基础

    什么是T-SQL语言? T-SQL语言是SQL语言的扩展和增强,是与SQL server交流沟通的语言之一. T-SQL的组成部分,数据定义语言-DDL(对数据库对象的创建和管理),数据控制语言-DC ...

  4. Version Control 版本控制

    一.version control是什么: version control版本控制,是指对软件开发过程中各种程序代码.配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一. 二.versi ...

  5. 实验吧—Web——WP之 上传绕过

    我们先上传一个png文件,发现他说必须上传后缀名为PHP的文件才可以,那么,我们尝试一下,PHP文件 但是他又说不被允许的文件类型 在上传绕过里最有名的的就是00截断,那么我们就先要抓包 在这里我们需 ...

  6. 【HDOJ1043】【康拓展开+BFS】

    http://acm.hdu.edu.cn/showproblem.php?pid=1043 Eight Time Limit: 10000/5000 MS (Java/Others)    Memo ...

  7. 浅谈log4j-5-读取properties文件(转自godtrue)

    #### 在代码中配置log4j环境的方式,我们已经见识过了,是不是感觉比较麻烦,我们试试使用配置文件的方式是否使您的应用程序更加的灵活.# Log4j支持两种配置文件格式,一种是XML格式的文件,一 ...

  8. 用Python开发Zeroc Ice应用

    Zeroc Ice简介   Zeroc ICE(Internet Communications Engine ,互联网通信引擎)是目前功能比较强大和完善的RPC框架,支持跨平台.跨语言调用.它非常灵活 ...

  9. confluence 为合并的单元格新增一行

    1,先将最后一个结构取消合并单元格 |    | ___ | |    | ___ | | _ | ___ | 2,在最后一行追加一行,将左侧合并 3,将上面取消合并的重新合并即可

  10. 主机-配件-接口-整机-3c-1

    standby 待机 hibernate 休眠(睡眠) power-off 关机 usb端口能给外部设备充电在低压状态(standby,hibernate,power-off),如果系统运行在batt ...