鱼C论坛

 找回密码
 立即注册
查看: 1402|回复: 8

[已解决]用selenium自动登录虎牙账号

[复制链接]
发表于 2024-9-24 16:28:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. from random import choice
  2. from time import sleep
  3. from selenium import webdriver
  4. from selenium.webdriver import ActionChains
  5. from selenium.webdriver.common.by import By
  6. from selenium.webdriver.chrome.service import Service


  7. def parse_data(wd):
  8.     sleep(1)

  9.     room_list = wd.find_elements(By.XPATH,"/html/body/div[1]/div/div[2]/div/div/div[3]/ul/li")
  10.     print(len(room_list))

  11.     temp_list = []

  12.     for room in room_list:
  13.         temp = {}
  14.         try:
  15.             # temp["title"] = room.find_element(By.XPATH,"./a[2]/li[1]/a[2]").get_attribute("title")
  16.             temp["url"] = room.find_element(By.XPATH,"./a[1]").get_attribute("href")
  17.             temp["owner"] = room.find_element(By.XPATH,"./span[1]/span[1]/i").text
  18.             temp["type"] = room.find_element(By.XPATH,"./span[1]/span[2]/i[2]").text
  19.             # temp["num"] = room.find_element(By.XPATH,"./span[1]/span[3]/i[2]").text
  20.             temp_list.append(temp)
  21.         except:
  22.             continue
  23.         
  24.     return temp_list


  25. def save_data(temp_list):
  26.     count = 1
  27.     for temp in temp_list:
  28.         print(count,temp)
  29.         count += 1
  30. def HuyaDanmu(address,ua):
  31.     options = webdriver.ChromeOptions()            # 定义Chrome配置参数
  32.     options.add_argument('--ignore-certificate-errors')           # 忽略https证书错误
  33.     options.add_argument('user-agent=' + ua)                      # 设置user-agent,取消浏览器被识别出来
  34.     # options.add_argument('--headless')                            # 该‘浏览器不提供可视化页面’设置去掉
  35.     # options.add_argument('blink-settings=imagesEnabled=false')  # 添加不加载图片设置,提升速度

  36.     s = Service(address)                                            # 加载Chrome服务
  37.     wd = webdriver.Chrome(service=s, options=options)                 # 创建浏览器实例
  38.     wd.implicitly_wait(160)                                          # 让浏览器实例隐式等待60秒,方便浏览器加载完成后就可以获取页面的元素
  39.     # 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
  40.     wd.get('https://www.huya.com')
  41.     #点击登陆出现扫码登陆
  42.     # wd.find_element(By.LINK_TEXT, "登录").click()
  43.     #账号密码在记事本中,第一行账号,第二行密码
  44.     with open(r"G:\TDDOWNLOAD\qq自动化登录虎牙\LoginHuyaByQ\HY账号密码.txt", "r", encoding="utf-8") as g:
  45.         hypassword = g.readlines()
  46.         print(hypassword[0])
  47.         print(hypassword[1])
  48.     # wd.switch_to.frame("UDBSdkLgn_iframe")                          #定位第一个弹窗并关闭
  49.     # wd.find_element(By.ID, 'close-udbLogin').click()

  50.     action = ActionChains(wd)
  51.     denglu = wd.find_element(By.CLASS_NAME, "LoginHd--1Jf6S0CCU3DUkJdjVqVn3")   #定位悬停位置
  52.     action.move_to_element(denglu).perform()                                      #鼠标悬停

  53.     # wd.find_element(By.LINK_TEXT, "点我注册").click()
  54.     # wd.switch_to.frame("UDBSdkLgn_iframe")
  55.     # wd.find_element(By.CLASS_NAME, 'returnlogin-btn').click()
  56.     # # wd.find_element(By.XPATH, "//*[@id='account-login-form']/div[1]/input").send_keys(hypassword[0])
  57.     # wd.find_element(By.XPATH, "//*[@id=‘account-login-form’]/div[1]/input").send_keys(hypassword[0])
  58.     #
  59.     # # wd.find_element(By.XPATH, "//*[@id='account-login-form']/div[2]/input").send_keys(hypassword[1])
  60.     # wd.find_element(By.XPATH, "//*[@id=‘account-login-form’]/div[2]/input").send_keys(hypassword[1])
  61.     # wd.find_element(By.XPATH, "//*[@id='login-btn']").click()
  62.     sleep(10)



  63. #打印模拟器板块主播数量以及具体信息
  64.     wd.get("https://www.huya.com/g/3203#cate-1-4507-0")
  65.     temp_list_monq = parse_data(wd)
  66.     save_data(temp_list_monq)

  67.     wd.get("https://www.huya.com/g/3203")
  68.     temp_list = parse_data(wd)
  69.     save_data(temp_list)

  70.     while True:

  71.         for roomherf in temp_list:
  72.             wd.get(roomherf['url'])

  73.             f = open("G:\TDDOWNLOAD\qq自动化登录虎牙\LoginHuyaByQ\主播打招呼文本.txt", "r", encoding="UTF-8")  # 设置文件对象
  74.             lines = f.readlines()  # 将txt文件的所有内容读入到字符串str中
  75.             f.close()

  76.             messageBox = wd.find_element(By.XPATH, '//*[@id="pub_msg_input"]')  # 找到页面上的输入框,用于发送弹幕
  77.             messageBut = wd.find_element(By.XPATH, '//*[@id="msg_send_bt"]')  # 找到发送弹幕按钮
  78.             danmu = choice(lines).strip('\n')  # 随机从文件中读取一个弹幕
  79.             messageBox.send_keys(danmu)  # 在输入框中输入弹幕
  80.             sleep(1)
  81.             messageBut.click()  # 点击发送弹幕
  82.             sleep(20)
  83.         break
  84.             # try:
  85.             #     el_next = wd.find_element_by_xpath("//a[@class='laypage_next']")
  86.             #     wd.execute_script("scrollTo(0, 100000)")
  87.             #     el_next.click()
  88.             # except:
  89.             #     print("结束!")
  90.             # break





  91. if __name__ == '__main__':
  92.     # f = open("settings.txt", "r",encoding='utf-8')  # 设置文件对象
  93.     # lines = f.readlines()  # 将txt文件的所有内容读入到字符串str中
  94.     address="G:\TDDOWNLOAD\qq自动化登录虎牙\LoginHuyaByQ\chromedriver.exe"
  95.     ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
  96.     # f.close()

  97.     HuyaDanmu(address,ua)
  98.     input("输入任意键结束")
复制代码




现在这个网页怎么获取登录框信息,切换不到那个ifram框里,捣鼓半天没弄不好,想爬取每个网页信息 现在最多获取7个,还请各位大佬帮忙,谢谢了,代码让我改的烂摊子了
最佳答案
2024-9-28 17:20:33
费小牛 发表于 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[contains(@src, 'iframe_src')]")
   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();")
   ```

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-24 16:35:33 | 显示全部楼层
要用 Selenium 自动登录虎牙账号并爬取房间信息,可以按照以下步骤进行修改和完善代码:

1. **安装相关库(如果未安装):**
  
  1. pip install selenium
复制代码


2. **初始化 WebDriver 和登录功能:**
  
  1. from selenium import webdriver
  2.    from selenium.webdriver.common.by import By
  3.    from selenium.webdriver.chrome.service import Service
  4.    from time import sleep

  5.    def login_huya(wd, username, password):
  6.        # 打开虎牙登录页
  7.        wd.get("https://www.huya.com")

  8.        # 点击登录按钮
  9.        login_button = wd.find_element(By.LINK_TEXT, "登录")
  10.        login_button.click()

  11.        # 切换到账号登录方式
  12.        wd.switch_to.frame(wd.find_element(By.ID, 'UDBSdkLgn_iframe_content'))
  13.        account_login = wd.find_element(By.CSS_SELECTOR, ".udbsdk_udblogin_tab-item:nth-child(2)")
  14.        account_login.click()

  15.        # 输入用户名和密码
  16.        wd.find_element(By.ID, "account-login-accountName").send_keys(username)
  17.        wd.find_element(By.ID, "account-login-password").send_keys(password)

  18.        # 点击登录
  19.        wd.find_element(By.ID, "login-btn-submit").click()

  20.        # 确保登录成功,可以添加合适的等待时间
  21.        sleep(5)

  22.    def parse_data(wd):
  23.        sleep(1)
  24.        room_list = wd.find_elements(By.XPATH, "/html/body/div/div/div/div/div/div/ul/li")
  25.        temp_list = []

  26.        for room in room_list:
  27.            temp = {}
  28.            try:
  29.                temp['url'] = room.find_element(By.XPATH, "./a").get_attribute("href")
  30.                temp['title'] = room.find_element(By.XPATH, "./a").get_attribute("title")
  31.                temp['info'] = room.find_element(By.XPATH, "./span/span/i").text
  32.                temp_list.append(temp)
  33.            except Exception as e:
  34.                print(e)
  35.                continue

  36.        return temp_list

  37.    def save_data(temp_list):
  38.        count = 1
  39.        for temp in temp_list:
  40.            print(count, temp)
  41.            count += 1

  42.    def HuyaDanmu(address, ua, username, password):
  43.        options = webdriver.ChromeOptions()
  44.        options.add_argument('--ignore-certificate-errors')
  45.        options.add_argument('user-agent=' + ua)

  46.        s = Service(address)
  47.        wd = webdriver.Chrome(service=s, options=options)
  48.        wd.implicitly_wait(60)

  49.        login_huya(wd, username, password)

  50.        temp_list = parse_data(wd)
  51.        save_data(temp_list)
  52.        wd.quit()

  53.    # 示例调用
  54.    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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-26 17:26:08 | 显示全部楼层
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。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-9-27 18:26:59 | 显示全部楼层
FishC 发表于 2024-9-24 16:35
要用 Selenium 自动登录虎牙账号并爬取房间信息,可以按照以下步骤进行修改和完善代码:

1. **安装相关 ...

哥哥,还是没法切换到哪个登录iframe登录框是我那个地方做错了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-27 18:27:04 | 显示全部楼层
费小牛 发表于 2024-09-27 18:26
哥哥,还是没法切换到哪个登录iframe登录框 ...


我明白了,可能是因为 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-27 18:31:49 | 显示全部楼层
很cool的阳 发表于 2024-9-26 17:26
1. **等待元素可见**:使用`WebDriverWait`和`expected_conditions`来等待登录框的iframe可见。
2. **检查 ...

哥,您这个IFRAME对话框我就切换成功进去一次    再次运行 再也不成功了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-27 18:31:57 | 显示全部楼层
费小牛 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-28 17:20:33 | 显示全部楼层    本楼为最佳答案   
费小牛 发表于 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[contains(@src, 'iframe_src')]")
   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();")
   ```

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-27 22:15:38 | 显示全部楼层
最终解决后的代码,记得发一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-18 16:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表