Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
作者:wanlifeipeng 发布时间:2023-06-13 09:23:30
标签:Python,Selenium,抓取
本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息。分享给大家供大家参考,具体如下:
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()
希望本文所述对大家Python程序设计有所帮助。
来源:http://www.cnblogs.com/hupeng1234/p/7138551.html


猜你喜欢
- //定义编码header( 'Content-Type:text/html;charset=utf-8 ');//Atomh
- 这学期在学习编译原理,最近的上机作业就是做一个简单的词法分析器,在做的过程中,突然有个需求就是判断一个字符串是否为合法的标示符,因为我是用p
- 题主Vue小白,入门demo时想在其中使用jQuery(当然可能是不推荐的做法哈,毕竟俩儿的风格不一样,但万一你就需要呢 _^ ^_),结果
- 功能:实现网页内容的即时编辑,增加页面的可用性、交互性。方法1:直接通过textarea标签实现,请运行下边代码:<!DOCTYPE
- 如下所示:>>> import numpy as np>>> a = np.array([[1, 2,
- 之前介绍了一个Python包 openpyxl ,用于处理 Excel ;而对于 Word 文本时同样也有对应的 Python库 Pytho
- 简介Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。你可以将它理解成脚本语言,大多情况我也是将它作为写脚本工具
- 如果对自然语言分类,有很多中分法,比如英语、法语、汉语等,这种分法是最常见的。在语言学里面,也有对语言的分类方法,比如什么什么语系之类的。我
- SQL Server有两种备份方式,一种是使用BACKUP DATABASE将数据库文件备份出去,另外一种就是直接拷贝数据库文件mdf和日志
- 以住做B/S的系统都是以IE浏览器为主,基本上忽略其他的浏览器,这次决定来个大兼容,但在实现背景渐变上就是个 * 烦。本想用图片来实现的,但要
- 前面讲述了"专题一.函数的基础知识",而这篇文章讲述的Python的条件语句和循环语句的基础知识.主要内容包括:1.条件
- pycharm确实要比Spyder功能全面,但是anaconda的环境配置实在太方便了,所以想take both,其实很简单,利用pycha
- 生成静态页的方法有很多种,我比较喜欢用xmlhttp的方法生成,因为我不用考虑很多东西,我只要把动态的asp页面编写好就行了。<% s
- 一 概述在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章试图采用图文的方式来与大家一起探讨。“浅
- 用在产品内容展示的页面上,给产品图片加上提示工具条,鼠标移动图片上即可看到效果,效果还是不错的:带黑白效果和放大图片效果(by misshj
- 在网站的一些应用中需要提供用户直接打印页面的功能,最明显的就是电子优惠券,商家根据网站提供的模板输入内容,然后生成优惠券页面,用户打印这个页
- 我在使用conda安装虚拟环境的过程中,下载一些包,比如torch等,发现在虚拟环境中有一份以外,pkgs文件夹下同样也会出现一份,大小一样
- 1.查询高于平均价格的商品名称: SELECT item_name FROM ebsp.product_market_price WHERE
- 今天在慕课网上学习了有关于python操作MySQL的相关知识,在此做些总结。python操作数据库还是相对比较简单的,由于python统一
- Mysql默认是不可以通过远程机器访问的,通过下面的配置可以开启远程访问.我的Mysql环境是ubuntu+mysql51.修改/etc/m