2017-03-31 95 views
2

我試圖用scrapy和硒刮這個頁面:http://www.newyorkerfiction.com/Pieces.aspx。我需要點擊不同的頁面,但我找不到方法。我的腳本是:點擊java元素scrapy + selenium

def __init__(self): 
    self.driver = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs') 
    self.driver.set_window_size(1920, 1080); #Size 

def parse(self, response): 
    self.driver.get(response.url) 
    element = self.driver.find_element(By.XPATH, '//div[@class="rgWrap rgNumPart"]//a[contains(@href, "javascript:__doPostBack")]') 
    self.driver.execute_script("arguments[0].click();", element) 
    self.driver.save_screenshot('screenshot.png') 
    for sel in response.xpath('//body'): 
     item = NyfictionItem() 
     item["title"] = sel.xpath('//td[@class="title"]').extract() 
     yield item 
    self.driver.close() 

我不明白是什麼錯,因爲我明白,execute_script使硒與javascript中的元素進行交互。我測試了xpath,它看起來是正確的。

任何想法?

感謝

回答

3

的一個問題是,你的定位點在分頁欄的所有環節和,因爲你得到的第一個,你實際上是試圖點擊「1」的鏈接,但是,相反,你打算點擊「下一頁」鏈接,該鏈接可以通過input.rgPageNext CSS選擇器找到。

你,不過,需要wait for it to be visible and clickable,使過程更加可靠:

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


driver = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs') 
driver.set_window_size(1920, 1080) 

driver.get("http://www.newyorkerfiction.com/Pieces.aspx") 

wait = WebDriverWait(driver, 10) 
next_link = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.rgPageNext"))) 
next_link.click() 

driver.save_screenshot('screenshot.png') 

driver.close() 

請注意,您可能雖然需要點擊「下一頁」後的另一個等待鏈接,讓新的頁面結果被加載。

而且,您還需要一些額外的邏輯才能在最後一頁停下來。

+1

它的工作!非常感謝。是的,現在我必須加入更多的邏輯。 –