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()
本当にありがとうございました、シッダールタ!エラーの原因を発見し、30行目にoptionsList = optionsList [1:len(optionsList)]を追加しないようにしました。あなたは正しいですが、明示的な待機を実装する文はありませんでした。しかし、あなたが提案したコード行を実装します。また、CSSセレクタよりもXpathを使うことをお勧めします。 Xパスが優れていると思えば、私は変更を行います。 Best、Dave –
xpathsを使用すると、それはもっと習慣に似ています。私は個人的に実装して見つけるのが簡単です。実際にはCSSのセレクタは速く、人の好みにまでこだわります。 –