12
返回列表 发新帖
楼主: xzykgc4mc3
收起左侧

[网络] selenium+firefox爬取网易云如何点击下一页按钮

[复制链接]
xzykgc4mc3
 楼主| 发表于 2018-8-18 23:40:59 | 显示全部楼层
B100D1E55 发表于 2018-8-18 23:23
n年没用selenium了……不能用id么,比如你可以用chrome的selenium插件比如katalon recorder录制一下点butto ...

next_page_button = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[contains(@class, "u-page")]/a[contains(@class, "znxt")]')))
next_page_button.click()
我感觉这么写也没错。也没报错。就是点击不了
B100D1E55
发表于 2018-8-19 00:05:44 | 显示全部楼层
xzykgc4mc3 发表于 2018-8-18 23:40
next_page_button = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[contains(@class, "u-pag ...

嗯我没看到什么问题,估计要实际写一下脚本才能发现问题在哪里
不过我觉得先获取id然后click对应id说不定可以,不妨换一个方法试试看
axiuluo000
发表于 2018-8-19 01:34:47 | 显示全部楼层
本帖最后由 axiuluo000 于 2018-8-19 01:55 编辑

不懂selenium,不能直接requests之类的爬取吗,不过的确很好奇这种页码不出现在url里的要怎么办。试试selenium能不能点第二页?

看了下,直接爬要params和encSecKey两个值去POST,这东西加密过,知乎有人解开了,不过挺烦的

评分

参与人数 1人气 +1 收起 理由
xzykgc4mc3 + 1 感谢解答: )

查看全部评分

xzykgc4mc3
 楼主| 发表于 2018-8-19 10:20:21 | 显示全部楼层
axiuluo000 发表于 2018-8-19 01:34
不懂selenium,不能直接requests之类的爬取吗,不过的确很好奇这种页码不出现在url里的要怎么办。试试selen ...

给个知乎链接看看。。我也有找到关于这个js解密的一些链接。想参考着看看
xzykgc4mc3
 楼主| 发表于 2018-8-19 19:25:28 | 显示全部楼层
本帖最后由 xzykgc4mc3 于 2018-8-19 19:27 编辑
B100D1E55 发表于 2018-8-19 00:05
嗯我没看到什么问题,估计要实际写一下脚本才能发现问题在哪里
不过我觉得先获取id然后click对应i ...

通过id来定位,好像不行。auto-id-l9RpbZW1ttIM4t8R这个后面的l9RpbZW1ttIM4t8R,貌似会变化。
见这两张图画



相反,我把代码保持原样。倒是可以定位到下一页按钮,并输出下一页按钮的文本。就是next_page_button.click()代码无效,依旧点击不了。
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.common.keys import Keys
  4. from selenium.webdriver.support.ui import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC

  6. browser = webdriver.Firefox()
  7. browser.get('https://music.163.com/')
  8. wait = WebDriverWait(browser, 10)
  9. input = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="srchbg"]//input[@id="srch"]')))
  10. input.clear()
  11. input.send_keys('神话')
  12. input.send_keys(Keys.ENTER)
  13. wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, '#g_iframe')))
  14. #browser.switch_to.frame('contentFrame')
  15. #等待搜索结果歌曲数量节点加载
  16. songs_num_node = wait.until(EC.presence_of_element_located((By.XPATH, '//div[contains(@class, "snote")]')))
  17. print(songs_num_node.text)
  18. #定位下一页按钮
  19. next_page_button = browser.find_element(By.XPATH, '//div[contains(@class, "u-page")]/a[contains(@class, "znxt")]')
  20. print(next_page_button.text)
  21. next_page_button.click()
复制代码
我想着定位第2页的按钮,换成这样,能正常执行print(next_page_button.text)。也没报错。不过也同样没有点击第2页。
  1. next_page_button = browser.find_element(By.XPATH, '//div[contains(@class, "u-page")]/a[text()=2]')
  2. print(next_page_button.text)
  3. next_page_button.click()
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
L.P.
发表于 2018-8-21 22:15:28 | 显示全部楼层
不知道我理解的对不对,我是这样的,等待搜索框DOM加载>输入关键字并回车>等待frame且switch进去(不然没法点单曲)>等待选项卡渲染进DOM树>点击单曲选项卡>等待下一页DOM渲染>滚屏>如果你在这里不滚屏不在可视范围好像点击下一页是不生效的,好了这时候点下一页,等待搜索结果,下一页,等待结果如此循环

很多地方不严谨如有错,纯属测试不严谨,请不要在意OOP部分,你可关注main部分,Wait很重要!

  1. import time
  2. import threading
  3. from selenium import webdriver
  4. from selenium.webdriver.common.keys import Keys
  5. from selenium.webdriver.chrome.options import Options
  6. from selenium.webdriver.support.wait import WebDriverWait
  7. from selenium.webdriver.support import expected_conditions as EC
  8. from selenium.webdriver.common.by import By
  9. from selenium.webdriver.common.action_chains import ActionChains


  10. class Singleton(object):
  11.     instance = None

  12.     def __new__(cls, base_url, browser='chrome'):
  13.         if cls.instance is None:
  14.             i = object.__new__(cls)
  15.             cls.instance = i
  16.             cls.base_url = base_url
  17.             cls.browser = browser
  18.             if browser == "firefox":
  19.                 # 创建一个单列的 Firefox driver
  20.                 cls.driver = webdriver.Firefox()
  21.             elif browser == "chrome":
  22.                 # 创建一个单列的 Chrome driver
  23.                 chrome_options = Options()
  24.                 # chrome_options.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug
  25.                 # chrome_options.add_argument('--disable-software-rasterizer')
  26.                 chrome_options.add_argument('blink-settings=imagesEnabled=false')  # 不加载图片, 提升速度
  27.                 cls.driver = webdriver.Chrome(chrome_options=chrome_options)
  28.             else:
  29.                 # 不在支持范围内.
  30.                 print("只支持 Firefox 或 Chrome!")
  31.         else:
  32.             i = cls.instance
  33.         return i


  34. class InstanceWebDriver(Singleton):

  35.     def __init__(self, base_url):
  36.         self.base_url = base_url

  37.     def webdriver_wait_until(self, timeout, poll_frequency, method, message='WebDriverWaitUntil超时!'):
  38.         value = None
  39.         try:
  40.             value = WebDriverWait(self.driver, timeout, poll_frequency).until(method, message)
  41.         except Exception as e:
  42.             print(e)
  43.             self.close()
  44.         finally:
  45.             return value

  46.     def webdriver_wait_until_not(self, timeout, poll_frequency, method, message='WebDriverWaitUntilNot超时!'):
  47.         value = None
  48.         try:
  49.             value = WebDriverWait(self.driver, timeout, poll_frequency).until_not(method, message)
  50.         except Exception as e:
  51.             print(e)
  52.             self.close()
  53.         finally:
  54.             return value

  55.     def implicitly_wait(self, seconds=60):
  56.         self.driver.implicitly_wait(seconds)

  57.     def get(self):
  58.         self.driver.get(self.base_url)

  59.     def find_element(self, locator, strategies):
  60.         return self.driver.find_element(locator, strategies)

  61.     def find_element_by_xpath(self, strategies):
  62.         return self.driver.find_element_by_xpath(strategies)

  63.     def find_element_by_css_selector(self, strategies):
  64.         return self.driver.find_element_by_css_selector(strategies)

  65.     def find_elements_by_class_name(self, strategies):
  66.         return self.driver.find_elements_by_class_name(strategies)

  67.     def find_element_by_id(self, id):
  68.         return self.driver.find_element_by_id(id)

  69.     def find_element_by_link_text(self, link_text):
  70.         return self.driver.find_element_by_link_text(link_text)

  71.     def actionchains_by_sendkeys(self, keys_to_send):
  72.         ActionChains(self.driver).send_keys(keys_to_send).perform()

  73.     def close(self):
  74.         if not self.driver is None:
  75.             self.driver.close()
  76.             self.driver.quit()


  77. def main():
  78.     instancewebdriver = InstanceWebDriver("https://music.163.com/#/search/m/?s=凉凉&type=100")
  79.     instancewebdriver.get()
  80.     instancewebdriver.webdriver_wait_until(60, 0.5, EC.presence_of_element_located((By.ID, 'srch')), "等待'搜索框'超时!")
  81.     srch = instancewebdriver.find_element_by_id('srch')
  82.     srch.clear()
  83.     srch.send_keys('神话')
  84.     srch.send_keys(Keys.ENTER)
  85.     instancewebdriver.webdriver_wait_until(60, 0.5, EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, '#g_iframe')),
  86.                                      "等待'搜索结果IFRAME'超时!")
  87.     instancewebdriver.webdriver_wait_until(60, 0.5, EC.presence_of_element_located((By.CLASS_NAME, 'fst')), "等待'选项卡单曲'超时!")

  88.     tab_type1 = instancewebdriver.find_element_by_css_selector("li.fst>a")
  89.     tab_type1.click()
  90.     instancewebdriver.webdriver_wait_until(60, 0.5, EC.presence_of_element_located((By.LINK_TEXT, '下一页')), "等待'下一页'DOM渲染超时!")
  91.     instancewebdriver.actionchains_by_sendkeys(Keys.END)
  92.     is_displayed = instancewebdriver.webdriver_wait_until(60, 0.5, EC.visibility_of_element_located((By.LINK_TEXT, '下一页')),
  93.                                                     "等待'下一页'可见状态超时!")
  94.     if is_displayed:
  95.         for i in range(17):
  96.             # 当前页数
  97.             number_page_btn = instancewebdriver.find_element_by_xpath("//a[contains(@class, 'js-selected')]")
  98.             print(number_page_btn.text)
  99.             nextpage_btn = instancewebdriver.find_element_by_link_text('下一页')
  100.             nextpage_btn.click()
  101.             print(nextpage_btn.text)
  102.             instancewebdriver.webdriver_wait_until(60, 2, EC.presence_of_element_located((By.CLASS_NAME, "sn")),
  103.                                              "等待'搜索结果列表'超时!")

  104. if __name__ == '__main__':
  105.     main()
复制代码



评分

参与人数 1人气 +3 收起 理由
xzykgc4mc3 + 3 先谢谢。后面再测试

查看全部评分

您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-11-17 13:39 , Processed in 0.103265 second(s), 15 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

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