用selenium自动登录虎牙账号
from random import choicefrom time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
def parse_data(wd):
sleep(1)
room_list = wd.find_elements(By.XPATH,"/html/body/div/div/div/div/div/div/ul/li")
print(len(room_list))
temp_list = []
for room in room_list:
temp = {}
try:
# temp["title"] = room.find_element(By.XPATH,"./a/li/a").get_attribute("title")
temp["url"] = room.find_element(By.XPATH,"./a").get_attribute("href")
temp["owner"] = room.find_element(By.XPATH,"./span/span/i").text
temp["type"] = room.find_element(By.XPATH,"./span/span/i").text
# temp["num"] = room.find_element(By.XPATH,"./span/span/i").text
temp_list.append(temp)
except:
continue
return temp_list
def save_data(temp_list):
count = 1
for temp in temp_list:
print(count,temp)
count += 1
def HuyaDanmu(address,ua):
options = webdriver.ChromeOptions() # 定义Chrome配置参数
options.add_argument('--ignore-certificate-errors') # 忽略https证书错误
options.add_argument('user-agent=' + ua) # 设置user-agent,取消浏览器被识别出来
# options.add_argument('--headless') # 该‘浏览器不提供可视化页面’设置去掉
# options.add_argument('blink-settings=imagesEnabled=false')# 添加不加载图片设置,提升速度
s = Service(address) # 加载Chrome服务
wd = webdriver.Chrome(service=s, options=options) # 创建浏览器实例
wd.implicitly_wait(160) # 让浏览器实例隐式等待60秒,方便浏览器加载完成后就可以获取页面的元素
# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
wd.get('https://www.huya.com')
#点击登陆出现扫码登陆
# wd.find_element(By.LINK_TEXT, "登录").click()
#账号密码在记事本中,第一行账号,第二行密码
with open(r"G:\TDDOWNLOAD\qq自动化登录虎牙\LoginHuyaByQ\HY账号密码.txt", "r", encoding="utf-8") as g:
hypassword = g.readlines()
print(hypassword)
print(hypassword)
# wd.switch_to.frame("UDBSdkLgn_iframe") #定位第一个弹窗并关闭
# wd.find_element(By.ID, 'close-udbLogin').click()
action = ActionChains(wd)
denglu = wd.find_element(By.CLASS_NAME, "LoginHd--1Jf6S0CCU3DUkJdjVqVn3") #定位悬停位置
action.move_to_element(denglu).perform() #鼠标悬停
# wd.find_element(By.LINK_TEXT, "点我注册").click()
# wd.switch_to.frame("UDBSdkLgn_iframe")
# wd.find_element(By.CLASS_NAME, 'returnlogin-btn').click()
# # wd.find_element(By.XPATH, "//*[@id='account-login-form']/div/input").send_keys(hypassword)
# wd.find_element(By.XPATH, "//*[@id=‘account-login-form’]/div/input").send_keys(hypassword)
#
# # wd.find_element(By.XPATH, "//*[@id='account-login-form']/div/input").send_keys(hypassword)
# wd.find_element(By.XPATH, "//*[@id=‘account-login-form’]/div/input").send_keys(hypassword)
# wd.find_element(By.XPATH, "//*[@id='login-btn']").click()
sleep(10)
#打印模拟器板块主播数量以及具体信息
wd.get("https://www.huya.com/g/3203#cate-1-4507-0")
temp_list_monq = parse_data(wd)
save_data(temp_list_monq)
wd.get("https://www.huya.com/g/3203")
temp_list = parse_data(wd)
save_data(temp_list)
while True:
for roomherf in temp_list:
wd.get(roomherf['url'])
f = open("G:\TDDOWNLOAD\qq自动化登录虎牙\LoginHuyaByQ\主播打招呼文本.txt", "r", encoding="UTF-8")# 设置文件对象
lines = f.readlines()# 将txt文件的所有内容读入到字符串str中
f.close()
messageBox = wd.find_element(By.XPATH, '//*[@id="pub_msg_input"]')# 找到页面上的输入框,用于发送弹幕
messageBut = wd.find_element(By.XPATH, '//*[@id="msg_send_bt"]')# 找到发送弹幕按钮
danmu = choice(lines).strip('\n')# 随机从文件中读取一个弹幕
messageBox.send_keys(danmu)# 在输入框中输入弹幕
sleep(1)
messageBut.click()# 点击发送弹幕
sleep(20)
break
# try:
# el_next = wd.find_element_by_xpath("//a[@class='laypage_next']")
# wd.execute_script("scrollTo(0, 100000)")
# el_next.click()
# except:
# print("结束!")
# break
if __name__ == '__main__':
# f = open("settings.txt", "r",encoding='utf-8')# 设置文件对象
# lines = f.readlines()# 将txt文件的所有内容读入到字符串str中
address="G:\TDDOWNLOAD\qq自动化登录虎牙\LoginHuyaByQ\chromedriver.exe"
ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
# f.close()
HuyaDanmu(address,ua)
input("输入任意键结束")
现在这个网页怎么获取登录框信息,切换不到那个ifram框里,捣鼓半天没弄不好,想爬取每个网页信息 现在最多获取7个,还请各位大佬帮忙,谢谢了,代码让我改的烂摊子了{:5_99:} 要用 Selenium 自动登录虎牙账号并爬取房间信息,可以按照以下步骤进行修改和完善代码:
1. **安装相关库(如果未安装):**
pip install selenium
2. **初始化 WebDriver 和登录功能:**
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from time import sleep
def login_huya(wd, username, password):
# 打开虎牙登录页
wd.get("https://www.huya.com")
# 点击登录按钮
login_button = wd.find_element(By.LINK_TEXT, "登录")
login_button.click()
# 切换到账号登录方式
wd.switch_to.frame(wd.find_element(By.ID, 'UDBSdkLgn_iframe_content'))
account_login = wd.find_element(By.CSS_SELECTOR, ".udbsdk_udblogin_tab-item:nth-child(2)")
account_login.click()
# 输入用户名和密码
wd.find_element(By.ID, "account-login-accountName").send_keys(username)
wd.find_element(By.ID, "account-login-password").send_keys(password)
# 点击登录
wd.find_element(By.ID, "login-btn-submit").click()
# 确保登录成功,可以添加合适的等待时间
sleep(5)
def parse_data(wd):
sleep(1)
room_list = wd.find_elements(By.XPATH, "/html/body/div/div/div/div/div/div/ul/li")
temp_list = []
for room in room_list:
temp = {}
try:
temp['url'] = room.find_element(By.XPATH, "./a").get_attribute("href")
temp['title'] = room.find_element(By.XPATH, "./a").get_attribute("title")
temp['info'] = room.find_element(By.XPATH, "./span/span/i").text
temp_list.append(temp)
except Exception as e:
print(e)
continue
return temp_list
def save_data(temp_list):
count = 1
for temp in temp_list:
print(count, temp)
count += 1
def HuyaDanmu(address, ua, username, password):
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('user-agent=' + ua)
s = Service(address)
wd = webdriver.Chrome(service=s, options=options)
wd.implicitly_wait(60)
login_huya(wd, username, password)
temp_list = parse_data(wd)
save_data(temp_list)
wd.quit()
# 示例调用
HuyaDanmu("path_to_chromedriver", "your_user_agent", "your_username", "your_password")
请将 `"path_to_chromedriver"` 修改为 `chromedriver` 的实际路径,将 `"your_user_agent"` 修改为实际的浏览器 UA(用户代理), `"your_username"` 和 `"your_password"` 修改为实际的虎牙账号和密码。
注意:由于虎牙的登录方式较为复杂,有时可能会遇到验证码或其他验证流程。以上脚本使用了账号密码登录方式,如果虎牙过程中有任何修改,脚本可能需要相应更新。另外,请确保访问控制策略和节操。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 1. **等待元素可见**:使用`WebDriverWait`和`expected_conditions`来等待登录框的iframe可见。
2. **检查iframe的属性**:确认iframe的id和class属性是否正确,有时候这些属性可能会因为网站更新而改变。
3. **滚动到元素可见**:有时候iframe可能不在当前视图内,需要滚动到该元素。
4. **检查iframe是否有多层嵌套**:有时候登录框可能在一个嵌套的iframe中,需要逐层切换。
下面是一个更新后的代码示例,它使用了`WebDriverWait`来等待登录框的iframe可见,并尝试切换到该iframe:
```python
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.webdriver.chrome.service import Service
import time
def HuyaDanmu(address, ua):
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('user-agent=' + ua)
s = Service(address)
wd = webdriver.Chrome(service=s, options=options)
wd.implicitly_wait(10)
wd.get('https://www.huya.com')
time.sleep(5)# 等待页面加载
try:
# 等待登录iframe可见
iframe = WebDriverWait(wd, 10).until(
EC.presence_of_element_located((By.XPATH, '你的登录iframe的XPATH'))
)
wd.switch_to.frame(iframe)# 切换到iframe
except TimeoutException:
print("登录iframe未找到")
return
# 现在你应该在登录iframe中,可以进行登录操作
# ...
if __name__ == '__main__':
address = "你的chromedriver路径"
ua = "你的user-agent字符串"
HuyaDanmu(address, ua)
input("输入任意键结束")
```
请注意,你需要将`你的登录iframe的XPATH`替换为实际的XPATH,可以通过检查页面元素来找到正确的XPATH。
FishC 发表于 2024-9-24 16:35
要用 Selenium 自动登录虎牙账号并爬取房间信息,可以按照以下步骤进行修改和完善代码:
1. **安装相关 ...
哥哥,还是没法切换到哪个登录iframe登录框{:10_266:}是我那个地方做错了吗 费小牛 发表于 2024-09-27 18:26
哥哥,还是没法切换到哪个登录iframe登录框{:10_266:} ...
我明白了,可能是因为 iframe 切换出错,导致无法正确切换到登录框。我们可以通过检查和确定 iframe 的 ID 和位置来解决这个问题。以下是一个修正版本,确保按步骤替代和测试:
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from time import sleep
def login_huya(wd, username, password):
# 打开虎牙主页
wd.get("https://www.huya.com")
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 很cool的阳 发表于 2024-9-26 17:26
1. **等待元素可见**:使用`WebDriverWait`和`expected_conditions`来等待登录框的iframe可见。
2. **检查 ...
哥,您这个IFRAME对话框我就切换成功进去一次 再次运行 再也不成功了{:10_266:} 费小牛 发表于 2024-09-27 18:31
哥,您这个IFRAME对话框我就切换成功进去一次 再次 ...
要正确地切换到iframe,并确保操作后的元素找到正确,可以尝试下面的方法:
1. **等待iframe出现**:
确保iframe已经加载成功,之后再进行切换。
2. **明确地切换到iframe并操作**:
利用WebDriverWait等待元素,确保切换到iframe后再进行操作。
下面是一个示例代码,可以帮助你正确切换到iframe并进行登录操作:
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 费小牛 发表于 2024-9-27 18:26
哥哥,还是没法切换到哪个登录iframe登录框是我那个地方做错了吗
试下这样行不行
1. **定位iframe并切换**:首先,您需要确保您定位到了正确的iframe。您可以使用iframe的id、name或者WebElement对象来定位。例如,如果您知道iframe的id,您可以这样做:
```python
iframe = wd.find_element(By.ID, 'iframe_id')
wd.switch_to.frame(iframe)
```
如果没有id,您可以尝试使用其他属性或者XPath来定位iframe。例如:
```python
iframe = wd.find_element(By.XPATH, "//iframe")
wd.switch_to.frame(iframe)
```
2. **等待iframe加载**:有时候iframe可能还没有加载完成,您需要等待它变得可用。您可以使用`WebDriverWait`和`expected_conditions`来等待iframe的加载:
```python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
iframe = WebDriverWait(wd, 10).until(
EC.frame_to_be_available_and_switch_to_it((By.ID, 'iframe_id'))
)
```
3. **处理嵌套iframe**:如果iframe中还有iframe,您可能需要逐层切换。每次切换到新的iframe后,都要重新定位元素。
4. **切换回主文档**:在iframe中操作完成后,您需要切换回主文档来继续其他操作:
```python
wd.switch_to.default_content()
```
5. **使用JavaScript切换**:如果Selenium的常规方法不起作用,您可以尝试使用JavaScript来切换iframe:
```python
wd.execute_script("window.frames['iframe_id'].focus();")
```
最终解决后的代码,记得发一下
页:
[1]