2017-07-06 57 views
-2

每當我通過shell運行下面的腳本它的工作,但每當我通過python模塊或pycharm運行相同的腳本它不工作,它不提取數據。任何人都可以幫忙嗎?python:硒webscraping腳本不工作通過模塊

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
browser = webdriver.Firefox() 
site = browser.get("https://www.flipkart.com/") 
searchInput = browser.find_element_by_class_name("LM6RPg") 
searchInput.send_keys('Laptop') 
searchInput.send_keys(Keys.ENTER) 
titleResults = browser.find_elements_by_xpath("//div[@class='_3wU53n']") 
for title in titleResults: 
    print(title.text) 

回答

0

你應該browser = webdriver.Firefox()後置implicitly_wait,因爲當你在shell中運行的頁面將有時間來完全加載,當你運行它,就像你不等待頁面模塊加載所有所以它應該是:

browser = webdriver.Firefox() 
browser.implicitly_wait(10) 

這將等待最多10秒鐘才能發現異常將被拋出的元素。

替代品有:

browser.explicitly_wait(10) 

將等待10秒鐘之後,它會

sleep(5) 

之前點擊一個按鈕後,搜索元素搜索的元素。您可以調整秒數來查看哪個適合。並且不要忘記從time模塊輸入sleep模塊:from time import sleep

讓我知道這是否對您有幫助。

+0

非常感謝您的幫助,但是,其代碼仍然存在一些缺陷,無法獲取所有結果,在實際網站中,第一頁有18個結果,但是當我運行腳本時從18箇中獲得10個結果,網頁中的所有項目的類名都是相同的。請幫助我解決這個問題嗎? –

+0

是的,我測試了自己,我認爲並不是每個產品都在您搜索它們時加載,並且在搜索「Laptop」後等待了5秒鐘,並且我找到了18個產品,因此在文件開始時把'from time import sleep'和'searchInput.send_keys(Keys.ENTER)'放在'sleep(5)'之後'就可以了。如果它現在正在工作,請接受我的答案。 –

+0

謝謝你的工作 –

0

這裏是回答你的問題:

from selenium import webdriver 
    from selenium.webdriver.firefox.firefox_binary import FirefoxBinary 
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
    from selenium.webdriver.common.keys import Keys 
    from selenium.webdriver.support import expected_conditions as EC 
    from selenium.webdriver.common.by import By 
    from selenium.webdriver.support.ui import WebDriverWait 

    binary = FirefoxBinary('C:\\Program Files\\Mozilla Firefox\\firefox.exe') 
    caps = DesiredCapabilities().FIREFOX 
    caps["marionette"] = True 
    browser = webdriver.Firefox(capabilities=caps, firefox_binary=binary, executable_path="C:\\Utility\\BrowserDrivers\\geckodriver.exe") 

    site = browser.get("https://www.flipkart.com/") 
    searchInput = browser.find_element_by_xpath("//input[@class='LM6RPg']") 
    searchInput.send_keys('Laptop') 
    searchInput.send_keys(Keys.ENTER) 
    WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='container']//div[text()='Dell Inspiron Core i3 6th Gen - (4 GB/1 TB HDD/Windows 10 Home) 3467 Notebook']"))) 
    titleResults = browser.find_elements_by_xpath("//div[@class='_3wU53n']") 
    for title in titleResults: 
     print(title.text) 

讓我知道如果這個回答你的問題。

+0

非常感謝您的幫助,我在我的腳本中添加了browser.implicitly_wait,現在它的工作正常,還有一個幫助,請你給我推薦任何書或任何網站以瞭解更多信息關於webdriver和硒? –

+0

@sandipghoshal隱含地等待實現起來很簡單,但按照Jim和最近的Austin Selenium會議隱含地等待在Selenium 4.0中可能會被棄用。因此我的解決方案基於ExplicitlyWait。讓我知道你的想法。謝謝 – DebanjanB