【问题标题】:How to properly use mechanize to scrape AJAX sites如何正确使用 mechanize 抓取 AJAX 网站
【发布时间】:2011-09-19 01:19:53
【问题描述】:

所以我对网络抓取相当陌生。这个网站上有一个表格,表格的值由Javascript控制。这些值将确定我的浏览器被告知从 Javascript 请求的未来值的地址。这些新页面包含脚本在我的浏览器中更新表格的 JSON 响应。

所以我想用一个 mechanize 方法构建一个类,该方法接受一个 url 并吐出 body 响应,第一次是 HTML,之后,body 响应将是 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

self.first_append 在从主页 html 提取数据后变为正数,因此 br.addheaders.append 不会第一次运行,因为正文响应中没有 JSON,但所有其他正文响应是 JSON。这是正确的方法吗?有没有更有效的方法?

self.first_append 在从主页 html 提取数据后变为正数,因此 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: 

我有点迷失了,不知道为什么会生成它,但我需要进行大量迭代才能看到它。

【问题讨论】:

    标签: javascript python json mechanize scrape


    【解决方案1】:

    mechanize faq“mechanize 不提供对 JavaScript 的任何支持”开始,它详细说明了您的选择(选择不是很好)。

    如果你有一些工作很好,但使用 selenium webdriver 是一个比机械化更好的抓取 ajax 网站的解决方案

    【讨论】:

    • 你会不会碰巧知道任何关于硒的教程,关于我想要做什么?我应该与硒一起使用一种特定的语言吗?我真的只是在尝试这个项目时学习了 python,并且对它没有真正的投入。不过我确实喜欢我的 Aptana Studio。
    • @Never 您可以将 python 和 java 与 Selenium Webdriver 一起使用。 Python 是一种非常酷的学习语言,对于这个项目来说是一个很好的选择。教程的方式并不多,因为它非常简单,这个seleniumhq.org/docs/… 在java 和c# 中,python 几乎完全相同,但它只会使用python api。如果您认为是正确的,请将我的答案标记为正确。
    • 你也可以试试使用 PhantomJS 的 PhearJS (github.com/Tomtomgo/phearjs)。
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2011-09-14
    相关资源
    最近更新 更多