2015-07-18 51 views
1

我正在嘗試使用Mechanize & BS4來抓取網上食品訂購網站。我面臨的問題是,該網站有一個表單,將位置作爲由Google提供支持的輸入。當我嘗試使用此方法填充它時:在Google抓取Google提供的值時提交價值

from bs4 import BeautifulSoup as bs 
import requests, lxml, mechanize 

url = raw_input("Enter URL: ") 
browser = mechanize.Browser() 
browser.open(url) 

# 'placeSelectionForm' is the name of the input-field 
browser.select_form(name='placeSelectionForm') 
control1 = browser.form.controls[0] 
control1._value = 'Koramangala' 
browser.submit() 
soup = bs(browser.response().read(), "lxml") 
print soup.prettify() 

該腳本適用於我製作的正常django表單。但這裏的問題是,谷歌驅動的形式使用自動完整的API是這樣的:

enter image description here

所以,當我鍵入一些位置的縮寫,也有自動完成建議,一旦我選擇一個選項表單自動提交,我被帶到一個新的URL。

現在,新頁面的URL的問題是,無論我在表單中選擇了什麼選項,URL都保持不變,並且響應中的值隨着我在上一次選擇的選項頁。

如何使用Mechanize或BS4等工具填寫此表單(由Google Maps API支持)?

+0

它看起來像網站使用了大量的Javascript,所以你可能會發現很難使用Mechanize(它不能執行Javascript)。您可以使用瀏覽器的開發人員工具查看發送的GET/POST請求,然後嘗試使用[請求](http://docs.python-requests.org/en/latest/)來模擬這些請求。這可能也很困難,因此使用[Selenium](https://selenium-python.readthedocs.org/)可能會更容易。 –

回答

1

這是一個相當Javascript的「重」網站,您可能會發現難以使用mechanize實現自動化。這裏是你怎麼做進行搜索,選擇其中一條建議,並等待結果與selenium加載:

# -*- coding: utf-8 -*- 
from selenium.webdriver.common.by import By 
from selenium import webdriver 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 


driver = webdriver.Firefox() 
driver.maximize_window() 
driver.get('http://www.swiggy.com/bangalore') 

# wait for input to appear and make a search 
wait = WebDriverWait(driver, 10) 
wait.until(EC.visibility_of_element_located((By.ID, "pac-input"))).send_keys("Koramangala") 

# wait for suggestions to appear 
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.pac-container div.pac-item"))) 

# choose the first suggestion 
suggestions = driver.find_elements_by_css_selector("div.pac-container div.pac-item") 
suggestions[0].click() 

# wait for results to load 
wait.until(EC.visibility_of_element_located((By.ID, "restaurants"))) 

# TODO: extract results 

我已經添加評論把事情說清楚。讓我知道你是否希望我擴展代碼的任何部分。

+0

它工作得很好。 您是如何決定網絡驅動器等待時間的10號? – vanguard69

+2

@ vanguard69這只是我認爲的一種實用價值。請注意,它會等待* 10秒,每500毫秒檢查一次預期條件。 – alecxe

+0

聽起來不錯,不知道關於500ms的EC檢查。 BTW Selenium就像一種魅力。 – vanguard69