2016-12-14 3 views
0

Ich habe mir schon seit einiger Zeit den Kopf darüber zerbrochen, wie ich dieses Dilemma der Minen angehen kann. Ich habe eine Adresse Spalte in meiner CSV-Datei, die Liste der Adressen enthält. Ich möchte Python anweisen können, die unten angegebene Website mit den einzelnen Adresswerten in der CSV-Datei zu durchsuchen und die Ergebnisse in einer neuen CSV-Datei zu speichern.Durchsuchen Sie die Website nach Adresswerten

import csv 
import requests 

with open('C:/Users/thefirstcolumn.csv') as csvfile: 
    reader = csv.DictReader(csvfile) 
    for row in reader: 
     print(row['Address']) 

website = requests.get('https://etrakit.friscotexas.gov/Search/permit.aspx') 

writer = csv.writer(open('thematchingresults.csv', 'w')) 

print website.content 

Zum Beispiel:

Einer der Adresswert I in der CSV-Datei haben:

6525 Mountain Sky Rd 

kehrt drei Reihen von Daten, wenn ich die Adresse manuell in das Suchfeld einfügen. Wie kann ich Python anweisen, nach jeder der Adressen in der CSV-Datei auf der Website zu suchen und die Ergebnisse für jede der Adressen in einer neuen CSV-Datei zu speichern. Wie kann ich diese bergige Aufgabe erfüllen?

+0

Was können Sie nicht tun? –

+0

Ich brauche Hilfe, wie man Python anweist, nach jedem einzelnen der Adressspaltenwerte einzeln zu suchen. Wie kann ich das machen? –

Antwort

3

Das Anfragemodul lädt statische HTML-Seiten von der Website herunter. Sie können nicht in Wechselwirkung treten mit Javascript

Sie müssen Selenium verwenden, um mit der Website

Für

Beispiel
from selenium import webdriver 
from bs4 import BeautifulSoup 
import time 
driver = webdriver.Firefox() 
driver.get('https://etrakit.friscotexas.gov/Search/permit.aspx') 
#read in addresses 
with open('file.csv','r') as f: 
    adresses = f.readlines() 

# use css selectors to locate search field 
for address in adresses: 
    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() 
    time.sleep(5) 
    # JS injected HTML 
    soup = BeautifulSoup(driver.page_source) 
    # extract relavant info from the soup 
    # and save to your new csv here 
+0

Dank Tobey habe ich Selenium versucht, aber Selenium öffnet nach meinem Verständnis nur einen Browser und automatisiert es. Ich glaube nicht, dass es tatsächlich jeden der Adressspaltenwerte einzeln im Suchfeld suchen kann. –

+0

Ich werde meine Antwort zu erklären, um – Tobey

+0

Dank Tobey, dieses Skript macht einen Job, aber es speichert nicht die Ergebnisse für die Adressen in der CSV-Datei. Wie kann das implementiert werden? –

2

Sie benötigen würde zu interagieren eine POST Anfrage zu tun, für jeden Wert, den Sie in der CSV-Datei haben. Um beispielsweise nach "6525 Mountain Sky Rd" unter https://etrakit.friscotexas.gov/Search/permit.aspx zu suchen, können Sie in der Entwicklerkonsole nachsehen, welche POST-Parameter angegeben werden. Zum Beispiel:

enter image description here

können Sie so etwas wie requests verwenden und die Header-Werte und Formulardaten übergeben, oder man könnte so etwas wie casper oder selenium zu emulieren den Browser verwenden.

+0

Wie kann Selen hier lebensfähig sein? Ich habe es in der Vergangenheit benutzt und, nach meinem Verständnis, automatisiert es einen Web-Scraping-Prozess. –

+0

@PLearner die andere Antwort gibt eine sehr gute Erklärung davon. Lassen Sie mich wissen, ob das Ihr Problem nicht löst. – David542

+0

Das Skript macht einen Job, aber es speichert nicht die Ergebnisse für die Adressen in der CSV-Datei. Wie kann das implementiert werden? –

Verwandte Themen