【问题标题】:Using python to take advantage of web page functions使用python利用网页功能
【发布时间】:2014-08-16 10:46:01
【问题描述】:

我想了解这个web site 是如何工作的。有一个输入表单,您可以在其中提供 url。此表单返回从另一个站点 (Youtube) 检索到的信息。所以:

  1. 我的第一个也是更有趣的问题是,是否有人知道该站点如何检索整个语句语料库?

  2. 或者,因为现在我使用以下代码:

    from BeautifulSoup import BeautifulSoup
    import json
    
    urlstr = 'http://www.sandracires.com/en/client/youtube/comments.php?v=' + videoId + '&page=' + str(npage)
    url = urllib2.urlopen(urlstr)
    content = url.read()
    soup = BeautifulSoup(content)
    #parse json
    newDictionary=json.loads(str(soup)) 
    
    #print example
    print newDictionary['list'][1]['username']
    

    但是,我无法在所有页面中进行迭代(当我手动访问时不会发生这种情况)。我已将timer.sleep(30) 放在 json 下面但没有成功。为什么会这样?

谢谢!

Python 2.7.8

【问题讨论】:

    标签: php python selenium web-scraping zend-dom-query


    【解决方案1】:
    1. 可能使用Google Youtube data API。请注意,(目前)cmets 只能使用 API 的第 2 版检索 - 该 API 已弃用。显然 V3 中还没有支持。 Python 客户端库可用,请参阅https://developers.google.com/youtube/code#Python

    2. 响应已经是 JSON,不需要 BS。 Web 服务器似乎需要 cookie,所以我建议使用requests module,尤其是它的会话管理:

      import requests
      
      videoId = 'ZSzeFFsKEt4'
      results = []
      npage = 1
      session = requests.session()
      while True:
          urlstr = 'http://www.sandracires.com/en/client/youtube/comments.php'
          print "Getting page ", npage
          response = session.get(urlstr, params={'v': videoId, 'page': npage})
          content = response.json()
          if len(content['list']) > 1:
              results.append(content)
          else:
              break
          npage += 1
      
      print results
      

    【讨论】:

    • 感谢您的回复。遗憾的是,YouTube API 不会返回所有 cmets,因为它们施加了限制。
    • 再次感谢您的关注。当使用videoId=ZSzeFFsKEt4 时,脚本在第 2 页后停止。手动执行此操作可以更进一步。这是因为 python 还是因为 site 施加的限制?有什么建议么?再次感谢。
    • 他们的服务器似乎需要 cookie。我已经更新了我的答案,改为使用 requests.session。现在它应该检索 34 页。
    • 我不确定通过 API 可检索的 cmets 数量的限制。默认情况下,每个请求 25 cmets,您需要点击“下一个”链接访问所有结果。但是有一个问题,API返回的“下一个”链接会增加大小,直到它太长。这可能是限制因素?
    • 嗨@mhawke 谢谢你的回答。对于您的最后一条评论,您是对的,下一页令牌变得非常大(提示:您必须在 gdata 网址中使用 orderby=published)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    相关资源
    最近更新 更多