2016-01-13 127 views
0

我已經閱讀了一些相關的帖子,但無法找到答案。使用AJAX的刮臉網站

我想抓取一個網頁與評論。當訪問網站時,首先只有10條評論,並且用戶應當按下「顯示更多」以獲得10條更多評論(其還將#add10添加到網站地址的末尾),每當他滾動到結束時評論列表。實際上,用戶可以通過將#add1000(其中1000是額外的評論數)添加到網站地址的末尾來獲得完整的評論列表。問題是,我得到使用SITE_URL#add1000我只蜘蛛前10條評論中,正如與SITE_URL所以這種方法是行不通的。

我也無法找到一種方法來製作一個適當的請求模仿網站的原點。產地AJAX URL的形式爲 '域/ ajaxlst PAR1 = X & PAR2 = Y?' 和我想這一切:

Request(url='domain/ajaxlst?par1=x&par2=y', callback=self.parse_all) 
Request(url='domain/ajaxlst?par1=x&par2=y', callback=self.parse_all, 
     headers={all_headers}) 
Request(url='domain/ajaxlst?par1=x&par2=y', callback=self.parse_all, 
     headers={all_headers}, cookies={all_cookies}) 

但每次我得到一個404錯誤。任何人都可以解釋我做錯了什麼?

回答

1

你需要的是一個無頭瀏覽器,因爲請求模塊無法很好地處理AJAX。

其中一個這樣的無頭瀏覽器是selenium

即)

driver.find_element_by_id("show more").click() # This is just an example case 
+0

那麼,我以前使用硒+ phantomjs,但它相對較慢。你確定這不是一個更好的方法嗎? –

+0

@AlexK。還有其他的方式看到這個http://stackoverflow.com/questions/16390257/scraping-ajax-pages-using-python,但我不知道導航和所有。 – Steve

+0

謝謝。我在代碼中發現了一個錯誤 - 實際上,我錯過了'x-requested-with':'XMLHttpRequest'在我的頭文件中,並且noboby可能會注意到它,因爲我沒有提供這部分代碼...既然你的答案建議另一種解決問題的恰當方法,我將其標記爲解決方案。 –

1

通常,當你向下滾動頁面,阿賈克斯將發送請求到服務器,然後服務器會響應JSON/XML文件恢復到您的瀏覽器刷新頁面。

你需要找出鏈接到這個json/xml文件的url。通常情況下,你可以打開你的Firefox瀏覽器並打開工具/ web dev/web控制檯。監視網絡活動,你可以很容易地捕捉到這個json/xml文件。

一旦你找到這個文件,那麼你可以直接解析從他們的評論(我建議Python模塊請求和BS4做這項工作),並減少了大量的時間量。請記住使用一些不同的客戶端和IP。對服務器很好,它不會阻止你。

+0

謝謝!你能告訴我如何組織我的計劃嗎? –

+0

現在很簡單。腳本每天一次完整地解析網站(所有鏈接和頁面)以獲得最新評論。但我意識到這不是最好的方式:1)我得到新的評論,延遲一天; 2.)可能每次解析站點上的所有信息是不必要的。 現在我正在考慮每小時發送一次頭文件請求到第一個網站的頁面,只解析第一個頁面,並且只有當它們被更改時。這是一個好方法嗎?我的頭會不會請求打擾網站太多?有更好的方法嗎?謝謝! –

+0

我認爲它會起作用,因爲你不會發送太多請求。 –