因此,我对网络抓取还很陌生。该站点上有一个表,该表的值由Javascript控制。这些值将确定告诉我的浏览器从Javascript请求的将来值的地址。这些新页面具有JSON响应,脚本会使用该JSON更新浏览器中的表。
因此,我想用一个机械化的方法来构建一个类,该方法接受一个url并吐出主体响应,而对于HTML而言,这是第一次,对于其余的迭代,主体响应将为JSON。
我有一些有效的方法,但是我想知道我是否做对了或者是否有更好的方法。
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
从主页html提取数据后,self.first_append变为正数,因此br.addheaders.append不会第一次运行,因为主体响应中没有JSON,但其他主体响应均为JSON 。这是正确的方法吗?有没有更有效的方法?
从主页html提取数据后,self.first_append变为正数,因此br.addheaders.append不会第一次运行,因为主体响应中没有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:
我有点迷失了自己,不知道为什么会生成它,但是我需要经过大量的迭代才能看到它。
从mechanize常见问题解答 “ mechanize不提供对JavaScript的任何支持”开始,然后详细说明了您的选择(选择不是很好)。
如果您有工作的话,那很好,但是使用硒webdriver是比机械化更好的刮除ajax网站的解决方案