2012-02-27 81 views
1

我正在用Python編寫一個程序,需要使用網站的高級搜索選項。具體而言,搜索頁面是 the NVC advanced search page。我知道需要搜索的項目和版本的名稱,所以理想情況下,程序將從下拉列表中選擇項目名稱和版本號,然後返回結果頁面。使用Python從網頁的Ajax調用返回數據

我完全不熟悉HTML和Javascript,而且我對Python相當陌生,所以我不知道是否有方法通過Python「點擊」這些下拉菜單,然後返回結果。由於我不能只加載頁面的源代碼並解析出項目名稱和版本列表,所以Javascript進行Ajax調用會使情況更加複雜化。

任何有Python/Javascript/Ajax經驗的人都可以讓我朝着正確的方向發展嗎?

一個例子使用此程序將是我開始了與項目「的glibc」和它的版本號‘2.3.6’該計劃將確保該組合在所有上市(這是不保證的) ,然後返回結果頁面(其中有大約13結果)。

+0

這個問題實際上在這裏經常被問到。 Python的答案,就像@GatorAlli在答案中提到的那樣,幾乎總是機械化。 – jdi 2012-02-27 21:08:55

+0

是的,只要我提出問題,我就看到其中一個提到的相關問題提到了機械化。但就我而言,事實證明並非必要。不過我會在將來記住它! – 2012-02-27 22:26:54

回答

0

如果人類用戶正在使用該搜索頁面,他們對產品鏈接之一,然後從另一個頁面加載的產品列表,如點擊:

http://web.nvd.nist.gov/view/vuln/cpe/cpe-chooser?index=0&component=Vendor

這個網頁是不幸的是沒有使用JSON,所以他們有一些自定義的JavaScript解析響應。然後,此響應的數據將顯示爲用戶的下拉列表。當用戶選擇產品時,瀏覽器會選擇正確的value,這樣當表單提交時,它將成爲查詢的一部分。例如: -

http://web.nvd.nist.gov/view/vuln/search-results?adv_search=true&cves=on&cpe_vendor=cpe%3A%2F%3Aa-a-s_application_access_server

在此,cpe_vendor=cpe%3A%2F%3Aa-a-s_application_access_server是重要的組成部分。 =符號前面的部分是字段名稱,後面的部分是選定的值(最初來自ajax請求)。有趣的%3A位是URL編碼。

因此,您實際上不需要與頁面進行交互,因爲您知道要搜索的供應商和產品的名稱;你只需要查看字段名稱(cpe_vendor供應商)和特定產品/供應商的價值(cpe:/:a-a-s_application_access_server爲我上​​面的示例),然後請求正常的搜索URL。

+0

我曾想到過這種方法,但不幸的是我沒有供應商的名稱,只是產品和版本。我想這主要是使這變得複雜的原因,因爲我看到要獲得供應商名稱的唯一方法是使用這些下拉菜單,當選擇產品時,它們將選擇適當的供應商名稱。 – 2012-02-27 21:34:22

+0

供應商不是強制性的,所以你應該能夠找到東西。否則,您可以對與我帖子中第一個表單具有相同表單的URL進行請求,並將其解析爲供應商列表。 – beerbajay 2012-02-27 22:12:27

+0

啊,我明白了。因此,我只需搜索產品名稱的「http://web.nvd.nist.gov/view/vuln/cpe/cpe-chooser?index = 0&component = Product」(以及其他索引爲1-9的頁面) ,並獲取相應的供應商名稱。謝謝beerbajay! – 2012-02-27 22:23:47

0

高級搜索選項頁面通過GET發送選項到結果頁面,爲您提供URL(linebreaks mine,使其更清晰):

http://web.nvd.nist.gov/view/vuln/search-results? 
adv_search=true& 
cves=on& 
cve_id=& 
query=& 
cwe_id=& 
cpe_vendor=cpe%3A%2F%3Aian_bezanson& 
cpe_product=cpe%3A%2Fa%3Aian_bezanson%3Adropbox& 
cpe_version=cpe%3A%2Fa%3Aian_bezanson%3Adropbox%3A0.0.3_beta& 
pub_date_start_month=0& 
pub_date_start_year=2005& 
pub_date_end_month=2& 
pub_date_end_year=2009& 
mod_date_start_month=2& 
mod_date_start_year=2007& 
mod_date_end_month=9& 
mod_date_end_year=2009& 
cvss_sev_base=&cvss_av=& 
cvss_ac=& 
cvss_au=& 
cvss_c=& 
cvss_i=& 
cvss_a= 

然後,它會花費一些調查來找出什麼位的網址是從窗體中的信息,但應該讓你只是颳了結果頁面。