使用Selenium模拟浏览器抓取斗鱼直播间信息
获取斗鱼直播间每个房间的名称、观看人数、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模拟浏览器抓取斗鱼直播间信息的更多相关文章
- Selenium模拟浏览器抓取淘宝美食信息
前言: 无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到sel ...
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- 使用selenium模拟浏览器抓取淘宝信息
通过Selenium模拟浏览器抓取淘宝商品美食信息,并存储到MongoDB数据库中. from selenium import webdriver from selenium.common.excep ...
- 3.使用Selenium模拟浏览器抓取淘宝商品美食信息
# 使用selenium+phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏览器翻页,并 ...
- Python爬虫学习==>第十二章:使用 Selenium 模拟浏览器抓取淘宝商品美食信息
学习目的: selenium目前版本已经到了3代目,你想加薪,就跟面试官扯这个,你赢了,工资就到位了,加上一个脚本的应用,结局你懂的 正式步骤 需求背景:抓取淘宝美食 Step1:流程分析 搜索关键字 ...
- 16-使用Selenium模拟浏览器抓取淘宝商品美食信息
淘宝由于含有很多请求参数和加密参数,如果直接分析ajax会非常繁琐,selenium自动化测试工具可以驱动浏览器自动完成一些操作,如模拟点击.输入.下拉等,这样我们只需要关心操作而不需要关心后台发生了 ...
- 使用Selenium模拟浏览器抓取淘宝商品美食信息
代码: import re from selenium import webdriver from selenium.webdriver.common.by import By from seleni ...
- 爬虫实战--使用Selenium模拟浏览器抓取淘宝商品美食信息
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exce ...
- 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位系统 ...
随机推荐
- HPU第四次积分赛-L:A Winged Steed(完全背包)
A Winged Steed 描述 有n种千里马,每一种都有若干匹,第i种马的颜值ai,价格di.现有m个牧马人要去挑选千里马,每一位牧马人对马的颜值都有要求:{所选马的颜值总和} ⩾Ai.现在 ...
- 【牛客练习赛22 C】
https://www.nowcoder.com/acm/contest/132/C 题目大意:在n个区间中取出n个数,相加的和一共会出现多少种结果. 题目分析:对于这种挑选数字相加,由于每一步不同的 ...
- hdu1695 GCD 容斥原理
Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) ...
- Python知识点整理,基础4 - 集合操作
- doubleclick-video-skipable
from:https://support.google.com/adxbuyer/answer/2691733?hl=en Implement skippable functionality usin ...
- Tomcat三种项目部署方式
第一种:直接将项目放在webapps目录下 材料:项目文件名hello,文件hello.html如图: 访问地址: 注释:hello 项目文件名 hello.html 访问的文件名字 第二种:修改c ...
- 著名软件工程师与作家、极限编程的创始者、JUnit作者之Kent Beck
Kent Beck,1961年出生,中文名肯特贝克,美国著名软件工程师与作家,在软件工程方面有很大的贡献.他是Smalltalk软件的开发者,设计模式的先驱,测试驱动开发的支持者,也是极限编程的创始者 ...
- JCP与JSR
JCP Java Community Process ,Java社区进程,Java标准指定组织JCP成立于1998年,官网,由社会各界Java组成的社区,规划和领导Java的发展,其成员可以在这里看到 ...
- async await 的 实质 本质
async await 的 实质 就是 用 “状态机” 来 取代 函数层层调用 . async await 的 本质 是 语法糖, 和 提高性能 什么的 没什么关系 . 为了避免理解歧义, 我把 ...
- No MaterialLocalizations found (Flutter)
在显示SimpleDialog时候程序报错 No MaterialLocalizations found 没有找到 MaterialLocalizations 搜索找到原因 runApp 需要先调用 ...