1

私はウェブサイトを掻き集め、PythonとSeleniumを使って情報を保存しようとしています。スクレイプは単純で、2つのドロップダウンメニューで州と地区を選択し、送信ボタンをクリックし、csvにテーブルを読み書きするだけです。Seleniumスクレイピングプログラムに待ち時間を追加するにはどうすればよいですか?

私のパッケージが正しくインストールされていると確信しています。私のプログラムは動作しますが、ほんの一部です。私の推測では、適切なcss_selectorが見つからないため、適切なSeleniumドライバ 'wait'がなければ、プログラムがクラッシュすることになります。私は以下のプログラムを投稿します。誰かがセレンドライバーのウェイトを正しく組み込む方法について提案があれば、助けていただければ幸いです。

ありがとう、とここでプログラムです:

import time 
import re 
import string 
import urllib.parse 
import pandas 
import numpy 
import os 
import csv 

from selenium import webdriver 
from selenium.webdriver.support.ui import Select 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.common.exceptions import NoSuchElementException 
from selenium.webdriver.support import expected_conditions as EC 
from bs4 import BeautifulSoup 

driver = webdriver.Chrome('C:/chromedriver_win32/chromedriver.exe') 
url = "https://myhpgas.in/myHPGas/HPGas/LocateDistributor.aspx" 
driver.set_window_size(1120, 550) 
driver.get(url); 
time.sleep(5) 
stateList = driver.find_element_by_css_selector("#ContentPlaceHolder1_ddlState") 
options = stateList.find_elements_by_tag_name("option") 

optionsList = [] 

for option in options: 
    optionsList.append(option.get_attribute("value")) 

optionsList[1:len(optionsList)] 
for optionValue in optionsList: 

    select = Select(driver.find_element_by_css_selector("#ContentPlaceHolder1_ddlState")) 
    select.select_by_value(optionValue) 
    districtList = driver.find_element_by_css_selector("#ContentPlaceHolder1_ddlDistrict") 
    distOptions = districtList.find_elements_by_tag_name("option") 

    distOptionsList = [] 

    for distOption in distOptions: #iterate over the options, place attribute value in list 
     distOptionsList.append(distOption.get_attribute("value")) 

    for distOptionValue in distOptionsList[1:len(distOptionsList)]: 

     distSelect = Select(driver.find_element_by_css_selector("#ContentPlaceHolder1_ddlDistrict")) 
     distSelect.select_by_value(distOptionValue) 
     driver.find_element_by_css_selector('#ContentPlaceHolder1_btnShowList').click() 
     data = []      
     for tr in driver.find_elements_by_css_selector('#ContentPlaceHolder1_gvDistributor'): 
      tds = tr.find_elements_by_tag_name('td') 
      if tds: 
       data.append([td.text for td in tds]) 
     print(data) 
     dataRows = int(numpy.array(data).size/7) 
     rowsTimesColumns = (dataRows * 7) -1 
     newArray = numpy.array(data) 
     outArray = newArray[0:rowsTimesColumns] 
     test = pandas.DataFrame(outArray.reshape(dataRows,7), columns=['no', 'distributor', 'address','contact1', 'contact2', 'contact3', 'map']) 

     file_path = 'Users/outpath' + '_' + optionValue + '_' + distOptionValue + '.csv' 
     test.to_csv(file_path, sep=',') 
     driver.back() 
    driver.back() 

答えて

0

あなたがエラーを返した行を教えてもらえます!また、xpathsの使用についてはどうですか?

私は明示的に待機

を実装するために文を見ることができなかった
WebDriverWait(driver, 30).until(EC.presence_of_element_located_by(By.CSS_SELECTOR,*your css selector*)) 
+0

本当にありがとうございました、シッダールタ!エラーの原因を発見し、30行目にoptionsList = optionsList [1:len(optionsList)]を追加しないようにしました。あなたは正しいですが、明示的な待機を実装する文はありませんでした。しかし、あなたが提案したコード行を実装します。また、CSSセレクタよりもXpathを使うことをお勧めします。 Xパスが優れていると思えば、私は変更を行います。 Best、Dave –

+0

xpathsを使用すると、それはもっと習慣に似ています。私は個人的に実装して見つけるのが簡単です。実際にはCSSのセレクタは速く、人の好みにまでこだわります。 –

関連する問題