2017-03-31 185 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

它的工作!非常感谢。是的,现在我必须加入更多的逻辑。 –

相关问题