2016-12-15 4 views
0

Ich verwende Selen und der Automatisierungsteil arbeitet effizient, aber die Daten werden in der CSV ungenau gespeichert. Obwohl ich vier Adressen in meiner f (CSV-Datei) habe, gibt es nur die Daten von der ersten Adresse redundant aufgeführt. Es bringt die Daten für die erste Adresse in der CSV-Datei immer wieder zurück. Wie kann ich Python sagen, dass es nur eine Überschrift für alle Spalten hat, nicht Permit, Address, Street Name, etc ... jedes Mal, wenn es den Prozess iteriert. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.Web Scraping und Speichern in CSV-Datei

import pandas as pd 
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 
import csv 


driver = webdriver.Chrome("C:\Python27\Scripts\chromedriver.exe") 
chrome = driver.get('https://etrakit.friscotexas.gov/Search/permit.aspx') 


wait = WebDriverWait(driver, 10) 

with open('C:/Users/list.csv','r') as f: 
addresses = f.readlines() 

for address in addresses: 
    driver.find_element_by_css_selector('#cplMain_txtSearchString').clear()  
    driver.find_element_by_css_selector('#cplMain_txtSearchString').send_keys(address) 
    driver.find_element_by_css_selector('#cplMain_btnSearch').click() 

    table = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_cplMain_rgSearchRslts_ctl00"))) 

    df = pd.read_html(table.get_attribute("outerHTML"))[0] 

    with open('thematchingresults.csv', 'a') as f: 
     df.to_csv(f) 

Die vier Adressen den ich versuche zu analysieren für:

6525 Mountain Sky Rd 
6543 Mountain Sky Rd 
6561 Mountain Sky Rd 
6579 Mountain Sky Rd 

Wie die Daten in CSV-Datei wird eingespeist:

Permit Number Address     Street Name  Applicant Name  Contractor Name SITE_SUBDIVISION RECORDID 
0 B13-2169 6525 MOUNTAIN SKY RD MOUNTAIN SKY RD SHADDOCK HOMES LTD SHADDOCK HOMES LTD PCR - SHERIDAN MAC:1306181017281473 
1 L13-3451 6525 MOUNTAIN SKY RD MOUNTAIN SKY RD TDS IRRIGATION TDS IRRIGATION SHERIDAN ECON:131115094522681 
2 ROW13-6260 6525 Mountain Sky Rd Mountain Sky Rd AT&T Broadband & Internet Serv Housley Group  SSW:1312030140165722 
Permit Number Address     Street Name  Applicant Name Contractor Name SITE_SUBDIVISION RECORDID 
0 B13-2169 6525 MOUNTAIN SKY RD MOUNTAIN SKY RD SHADDOCK HOMES LTD SHADDOCK HOMES LTD PCR - SHERIDAN MAC:1306181017281473 
1 L13-3451 6525 MOUNTAIN SKY RD MOUNTAIN SKY RD TDS IRRIGATION TDS IRRIGATION SHERIDAN ECON:131115094522681 
2 ROW13-6260 6525 Mountain Sky Rd Mountain Sky Rd AT&T Broadband & Internet Serv Housley Group  SSW:1312030140165722 

Antwort

1

Ihr Code fast perfekt funktioniert, aber Ihre wait.until() scheint unmittelbar vor der Aktualisierung der Seite zufrieden zu sein. Einfach das Hinzufügen einer Verzögerung von einer Sekunde vor dem wait.until() zum Beispiel gearbeitet, obwohl Sie einen strengeren Ansatz untersuchen müssen:

time.sleep(2) 

Das gab mir die folgende CSV-Ausgabedatei:

,Permit Number,Address,Street Name,Applicant Name,Contractor Name,SITE_SUBDIVISION,RECORDID 
0,B13-2169,6525 MOUNTAIN SKY RD,MOUNTAIN SKY RD,SHADDOCK HOMES LTD,SHADDOCK HOMES LTD,PCR - SHERIDAN,MAC:1306181017281473 
1,L13-3451,6525 MOUNTAIN SKY RD,MOUNTAIN SKY RD,TDS IRRIGATION,TDS IRRIGATION,SHERIDAN,ECON:131115094522681 
2,ROW13-6260,6525 Mountain Sky Rd,Mountain Sky Rd,AT&T Broadband & Internet Serv,Housley Group,,SSW:1312030140165722 
,Permit Number,Address,Street Name,Applicant Name,Contractor Name,SITE_SUBDIVISION,RECORDID 
0,B14-0771,6543 MOUNTAIN SKY RD,MOUNTAIN SKY RD,DREES CUSTOM HOMES,DREES CUSTOM HOMES,PCR - SHERIDAN,LWE:1403121043033654 
1,L14-2401,6543 MOUNTAIN SKY RD,MOUNTAIN SKY RD,DFW SITE DESIGN,DFW SITE DESIGN,SHERIDAN,ECON:140711080345627 
2,ROW15-4097,6543 MOUNTAIN SKY RD,MOUNTAIN SKY RD,HOUSLEY GROUP,HOUSLEY GROUP,,TLW:1507220204411002 
,Permit Number,Address,Street Name,Applicant Name,Contractor Name,SITE_SUBDIVISION,RECORDID 
0,B13-2364,6561 MOUNTAIN SKY RD,MOUNTAIN SKY RD,DREES CUSTOM HOMES,DREES CUSTOM HOMES,PCR - SHERIDAN,MAC:1307030929232194 
1,L14-1500,6561 MOUNTAIN SKY RD,MOUNTAIN SKY RD,DFW SITE DESIGN,DFW SITE DESIGN,SHERIDAN,ECON:140424040055127 
2,P15-0073,6561 MOUNTAIN SKY RD,MOUNTAIN SKY RD,RIVERBEND/SANDLER POOLS,,SHERIDAN,HC:1502160438345148 
,Permit Number,Address,Street Name,Applicant Name,Contractor Name,SITE_SUBDIVISION,RECORDID 
0,B13-2809,6579 MOUNTAIN SKY RD,MOUNTAIN SKY RD,SHADDOCK HOMES LTD,SHADDOCK HOMES LTD,PCR - SHERIDAN,MAC:1308050328358768 
1,B13-4096,6579 MOUNTAIN SKY RD,MOUNTAIN SKY RD,MIRAGE CUSTOM POOLS,MIRAGE CUSTOM POOLS,PCR - SHERIDAN,MAC:1312030307087756 
2,L14-1640,6579 MOUNTAIN SKY RD,MOUNTAIN SKY RD,TDS IRRIGATION,TDS IRRIGATION,SHERIDAN,ECON:140506012624706 
3,P14-0018,6579 MOUNTAIN SKY RD,MOUNTAIN SKY RD,MIRAGE CUSTOM POOLS,,SHERIDAN,LCR:1401130949212891 
4,ROW14-3205,6579 MOUNTAIN SKY RD,MOUNTAIN SKY RD,Housley Group,Housley Group,,TLW:1406190424422330 

Wie Bei einem alternativen Ansatz könnten Sie die Tabelle so lange abfragen, bis neue Daten geladen sind:

import pandas as pd 
import selenium 
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 
import csv 


driver = webdriver.Chrome(r"C:\Python27\chromedriver.exe") 
chrome = driver.get('https://etrakit.friscotexas.gov/Search/permit.aspx') 
wait = WebDriverWait(driver, 10) 

with open('C:/Users/list.csv','r') as f: 
    addresses = f.readlines() 

old_table_html = [] 

for address in addresses: 
    print address 
    driver.find_element_by_css_selector('#cplMain_txtSearchString').clear()  
    driver.find_element_by_css_selector('#cplMain_txtSearchString').send_keys(address) 
    driver.find_element_by_css_selector('#cplMain_btnSearch').click() 

    while True: 
     try: 
      table = wait.until(EC.visibility_of_element_located((By.ID, "ctl00_cplMain_rgSearchRslts_ctl00"))) 
      table_html = table.get_attribute("outerHTML") 

      if table_html != old_table_html: 
       break 
     except selenium.common.exceptions.StaleElementReferenceException: 
      pass 

    old_table_html = table_html 
    df = pd.read_html(table_html)[0] 

    with open('thematchingresults.csv', 'a') as f: 
     df.to_csv(f)