当前位置: 首页 > 面试题库 >

如何正确使用机械化刮AJAX网站

吴城
2023-03-14
问题内容

因此,我对网络抓取还很陌生。该站点上有一个表,该表的值由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网站的解决方案



 类似资料:
  • 问题内容: 我想知道是否有类似Java的Perl / Python机械化的东西。 谢谢! 问题答案: 看看HtmlUnit。它类似于Perl的WWW :: Mechanize 。还有一个Perl版本,名为WWW :: HtmlUnit (它使用Inline :: Java 将Java库的方法公开给Perl)。

  • 问题内容: 我试图登录到http://www.magickartenmarkt.de网站,并在会员区域(https://www.magickartenmarkt.de/?mainPage=showWants)进行一些分析。我看到了其他示例,但是我不明白为什么我的方法行不通。我为第一种方法确定了正确的形式,但尚不清楚它是否有效。在第二种方法中,重播网页向我显示我无权访问会员区。 我很乐意提供任何帮助

  • 问题内容: 我有一个带有按钮的表单,希望能够单击它。 我已经尝试过,但是会出现以下错误: 也不起作用,因为它的类型是按钮并且不提交。 有任何想法吗?谢谢。 问题答案: 单击在 纯HTML 的形式什么都不做。为了执行任何操作,必须包含 javascript 。 并且不运行 javascript 。 因此,您的选择是: 自己阅读JavaScript并模拟其效果 使用运行JavaScript代码 我会做

  • 问题内容: 我只想检索UserAccount类中的某些列,所以我有以下代码: 我得到了空值作为回报。但是,如果我注释掉setProjections,我将获得具有所有属性的用户。在这种情况下,如何正确使用setProjection? 问题答案: 它返回一个Object数组,因此代码应为:

  • 问题内容: 我不知道我在哪里错了:/。当我运行这段代码时,我得到的只是一个空白元素。我似乎无法让insertRule方法执行任何操作(甚至不会产生错误)。我想念什么吗? 问题答案: 这有点令人困惑,但是您的代码确实可以工作,只是您看不到返回的XML树中插入的规则。 为了验证您的代码是否有效,您可以执行两个测试: 运行上面的代码片段,您可以看到CSS规则确实适用。并且属性也在控制台中更改。 当浏览器

  • 问题内容: 如何使用从类路径中查找递归资源? 例如 在“目录”中查找所有资源:想象一下 不幸的是,这只会检索到恰好该“目录”。 所有资源都已命名(递归) 但这返回一个空。 还有一个额外的问题:与有什么不同? 问题答案: 没有办法递归搜索类路径。您需要知道资源的完整路径名才能以这种方式检索它。该资源可能位于文件系统中的目录中,也可能位于jar文件中,因此它不像执行“类路径”的目录列表那样简单。您将需