所以我對網絡抓取相當新穎。這個網站上有一個表格,表格的值由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:
它種有我輸了,不知道爲什麼正在生成,但我需要噸迭代之前,我看到它。
你碰巧知道硒任何教程,關於什麼我試圖做一個更好的解決方案?有沒有我應該使用硒的特定語言?我真的只是在嘗試這個項目時學會了python,並沒有真正的投入。儘管我喜歡我的Aptana Studio。 – Never
@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
好的,謝謝你的幫助 – Never