【问题标题】:Web scraper unable to click pagination button网页爬虫无法点击分页按钮
【发布时间】:2019-09-13 15:27:36
【问题描述】:

我正在使用 selenium 和 geckodriver(在 Firefox 上)来抓取 eBay。我的操作系统是 Ubuntu 16.04。

我只想点击下一步!我究竟做错了什么?我已经评论了两个不起作用的按钮分配实例......

# import libraries
import urllib.request
from bs4 import BeautifulSoup
from selenium import webdriver
import time
import pandas as pd 
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

# specify the url

urlpage = 'https://www.ebay.com/b/Nike-Athletic-Apparel-for-Women/185082/bn_648725?rt=nc&LH_Sold=1' 
print(urlpage)

# run firefox webdriver from executable path of your choice 
driver = webdriver.Firefox()

# get web page
driver.get(urlpage)


for page_num in range(0, 2):
    parentElement = driver.find_element_by_class_name("s-item")
    results = parentElement.find_elements_by_css_selector("*") # all children by CSS
    #button = driver.find_elements_by_class_name('ebayui-pagination__control') # not working
    #button = driver.find_elements_by_xpath('//html/body/div[3]/div[3]/div[4]/section[1]/div[2]/nav/a[2]/span/svg[2]/use') # not working
    button.click()

    print('Number of results', len(results))
    for r in results:
        print(r.text)

df = pd.DataFrame(results)
df.head()
df.to_csv('eBay_scrape.csv')

driver.quit()

收到错误:

https://www.ebay.com/b/Nike-Athletic-Apparel-for-Women/185082/bn_648725?rt=nc&LH_Sold=1

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-2-58b4e0e554fc> in <module>
     19     #results = parentElement.find_elements_by_tag_name("li") # not working...
     20     #results = driver.find_elements_by_class_name("vip") # 50 results per page. But useless...
---> 21     button = driver.find_elements_by_class_name('ebayui-pagination__control')
     22     #button = driver.find_elements_by_xpath('//html/body/div[3]/div[3]/div[4]/section[1]/div[2]/nav/a[2]/span/svg[2]/use')

IndexError: list index out of range

【问题讨论】:

  • “不工作”到底是什么意思?
  • @FiddleStix - 添加了上面的错误消息。我在抓取方面还比较陌生,所以我希望上面显示我缺乏经验。
  • 我认为find_elements() 函数返回一个列表,find_element() 函数返回单个值,如果找不到则引发错误。因此,您可能需要button = driver.find_elements_by_somehow('something')[0]button=driver.find_element_by_somehow('something)。我建议对这种事情使用调试器,因为您很快就会看到正在返回一个列表。

标签: python selenium selenium-webdriver web-scraping


【解决方案1】:

driver.find_elements_by_class_name('ebayui-pagination__control') 返回一个列表

该页面上有 2 个带有该类的按钮 - 要检查,请在 Firefox 控制台中输入:$$('.ebayui-pagination__control')

所以你需要: button = driver.find_elements_by_class_name('ebayui-pagination__control')[1] 获取第二个按钮。

第二种方法(find_elements_by_xpath)对于那个长 xpath 看起来超级脆弱,只需要一个数组在该路径中发生变化,即使你一开始就让它工作,它也将不再工作。

【讨论】:

  • 这很好用。我同意 re: xpath,我很高兴现在这似乎有效。
【解决方案2】:

你可以诱导WebDriverWaitelement_to_be_clickable并关注xpath

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//a[@class='ebayui-pagination__control'][@rel='next']"))).click()

【讨论】:

    【解决方案3】:

    您可以更新您的抓取网址,而不是通过代码单击下一页按钮。

    如果您注意到,&amp;_pgn=&lt;page_number&gt; 会附加到后续页面的 url 字符串中。您可以简单地抓取一个页面并增加页码,直到没有剩余的有效页码。

    【讨论】:

      最近更新 更多