1
저는 웹 사이트를 긁어서 파이썬과 셀레늄을 사용하여 정보를 저장하려고합니다. 스크래핑은 간단하며 두 개의 드롭 다운 메뉴에서 주와 구/군 /시를 선택하고 제출 버튼을 클릭하고 csv에 테이블을 읽고 쓰는 작업 만 필요합니다.셀레늄 스크래핑 프로그램에 대기를 어떻게 추가합니까?
패키지가 올바르게 설치되어 있고 프로그램이 작동한다고 확신하지만 시간 만 있습니다. 내 생각 엔 적절한 css_selector를 찾을 수 없기 때문에 적절한 셀렌 드라이버 '대기'가 없으면 프로그램이 중단되는 것입니다. 아래에이 프로그램을 게시 할 예정이며 Selenium driver 'waits'를 올바르게 통합하는 방법에 대한 제안이 있으면 누구나 도움을 주시면 감사하겠습니다. 여기
정말 고마워요, 그리고 프로그램의 :
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를 사용하는 것이 좋습니다. Xpaths가 우월하다고 생각한다면 나는 변화를 만들 것이다. Best, Dave –
xpaths를 사용하면 잘 습관과 같습니다. 필자는 개인적으로 쉽게 구현하고 찾을 수 있습니다. 사실 CSS 선택기는 더 빠르며 사람의 기호에 따라 선택됩니다. –