2011-06-20 40 views
3

所以我對網絡抓取相當新穎。這個網站上有一個表格,表格的值由Javascript控制。這些值將決定我的瀏覽器通過Javascript請求的未來值的地址。這些新頁面具有JSON響應,腳本會在瀏覽器中更新表格。如何正確使用機械颳去AJAX網站

所以我想用一個機械化方法構建一個類,它接受一個url並吐出body響應,第一次是HTML,之後body響應將是JSON,用於剩餘的迭代。

我有一些工作,但我想知道如果我做對了或如果有更好的方法。數據已經從主網頁的HTML中提取後,通過這樣因爲在體內沒有迴應的JSON br.addheaders.append不運行第一次

class urlMaintain2:  
    def __init__(self): 

     self.first_append = 0 
     self.response = '' 

    def pageResponse(self,url): 
     import mechanize 
     import cookielib   

     br = mechanize.Browser() 

     #Cookie Jar 
     cj = cookielib.LWPCookieJar() 
     br.set_cookiejar(cj) 

     #Browser options 
     br.set_handle_equiv(True) 
     br.set_handle_gzip(False) 
     br.set_handle_redirect(True) 
     br.set_handle_referer(True) 
     br.set_handle_robots(False) 

     br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 

     br.addheaders = [('User-agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16'), 
           ('Accept-Encoding','gzip')] 
     if self.first_append == 1: 
      br.addheaders.append(['Accept', ' application/json, text/javascript, */*']) 
      br.addheaders.append(['Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8']) 
      br.addheaders.append(['X-Requested-With', 'XMLHttpRequest']) 
      br.addheaders.append(['User-agent','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16']) 
      br.addheaders.append(['If-Modified-Since', 'Thu, 1 Jan 1970 00:00:00 GMT']) 
      cj.add_cookie_header(br) 

     response = br.open(url) 
     headers = response.info() 

     if headers['Content-Encoding']=='gzip': 
      import gzip 
      gz = gzip.GzipFile(fileobj=response, mode='rb') 
      html = gz.read() 
      gz.close() 
      headers["Content-type"] = "text/html; charset=utf-8" 
      response.set_data(html) 
     br.close() 
     return response 

self.first_append變成正的,但所有其他身體反應都是JSON。這是做到這一點的正確方法嗎?有沒有更高效的方法?

self.first_append在從主頁面html中提取數據後變爲正值,所以br.addheaders.append不會在第一次運行,因爲body響應中沒有JSON,但所有其他身體響應是JSON。這是做到這一點的正確方法嗎?有沒有更高效的方法?是否有其他語言/庫更好地執行此操作?

運行後長時間我收到此錯誤信息:

File "C:\Users\Donkey\My Documents\Aptana Studio Workspace\UrlMaintain2\src\UrlMaintain2.py", line 55, in pageResponse response = br.open(url) 
File "C:\Python27\lib\mechanize_mechanize.py", line 203, in open return self._mech_open(url, data, timeout=timeout) 
File "C:\Python27\lib\mechanize_mechanize.py", line 230, in _mech_open response = UserAgentBase.open(self, request, data) 
File "C:\Python27\lib\mechanize_opener.py", line 193, in open response = urlopen(self, req, data) 
File "C:\Python27\lib\mechanize_urllib2_fork.py", line 344, in _open '_open', req) File "C:\Python27\lib\mechanize_urllib2_fork.py", line 332, in _call_chain result = func(*args) 
File "C:\Python27\lib\mechanize_urllib2_fork.py", line 1142, in http_open return self.do_open(httplib.HTTPConnection, req) 
File "C:\Python27\lib\mechanize_urllib2_fork.py", line 1118, in do_open raise URLError(err) urllib2.URLError: 

它種有我輸了,不知道爲什麼正在生成,但我需要噸迭代之前,我看到它。

回答

7

mechanize faq「機械化不提供任何對JavaScript的支持」,然後闡述你的選擇(選擇不是很好)。

如果你已經得到的東西的工作再大,但使用硒的webdriver是刮AJAX網站比機械化

+0

你碰巧知道硒任何教程,關於什麼我試圖做一個更好的解決方案?有沒有我應該使用硒的特定語言?我真的只是在嘗試這個項目時學會了python,並沒有真正的投入。儘管我喜歡我的Aptana Studio。 – Never

+0

@Never你可以在Selenium Webdriver中使用python和java。 Python是一門非常酷的語言,對於這個項目來說是一個很好的選擇。 教程並不多,因爲它非常簡單,這個http://seleniumhq.org/docs/03_webdriver.html#the-5-minute-getting-started-guide是在java和c#中,python一個將幾乎完全相同,但它只會使用python api。 如果您覺得這是正確的,請將我的答案標記爲正確。 – cerberos

+0

好的,謝謝你的幫助 – Never