【问题标题】:scraping data from a dynamic graph using python+beautifulSoup4使用 python+beautifulSoup4 从动态图中抓取数据
【发布时间】:2015-01-09 07:00:53
【问题描述】:

我需要实现数据抓取任务并从动态图中提取数据。该图表随时间更新,类似于您查看公司股票图表时会发现的情况。我在 python 中使用 requests 和 beautifulsoup4 库,但我只知道如何抓取文本和链接数据。似乎无法弄清楚如何将图形的值放入 csv 文件中

相关图表可在 -http://www.apptrace.com/app/instagram/id389801252/ranks/topfreeapplications/36

找到

【问题讨论】:

    标签: python graph web-scraping beautifulsoup python-requests


    【解决方案1】:

    您能否提供一个链接以供参考。这取决于图形的存储和显示方式。从它像股票行情一样动态来看,一些标签之间应该有一些文本,你可以在某个地方抓取。我已经查看了使用漂亮汤从网站获取图像和其他内容的示例,所以这并非不可能。

    昨天我正在将数据格式化为 CSV 格式,并很快得到了一些非常有用的回复。

    查看:How can I format every other line to be merged with the line before it? (In Python)

    我在这里学到的另外一点是,如果您需要经常收集这些数据,自动运行脚本的一个好方法是 CRON 作业。

    【讨论】:

    • 这是我要废弃的图表的链接。任何帮助,将不胜感激。我知道如何抓取文本和链接,但这是我第一次处理图表。
    • <path class="nv-path-142" d="M215.82660433496054,-10L215.82660433492515,280L248.20059498517463,280.0000000001164L248.20059498519092,-10.000000000116415Z"></path> 所有的坐标都像这样让我想到,因为它们可能是由某些服务器端脚本生成的复杂性。而不是将值存储为 5,10,15,20 以方便地代表数据的绘图点,它似乎有大量代表像素点的大数字。
    【解决方案2】:

    如果您拥有正确的 URL,则可以轻松获取图表中的数据。你可以很容易地找到这个地址,例如Firefox 中的“开发者工具”(检查 XHR 请求的“网络”选项卡)。

    您会看到正在拨打电话,例如:

    src = 'http://www.apptrace.com/api/app/389801252/rankings/country/?country=CAN&start_date=2014-08-08&end_date=&device=iphone&list_type=normal&chart_subtype=iphone'
    

    如果您调用它,您将收到一个 JSON 回复,您可以轻松地将其加载到 python 中:

    import json
    import urllib
    
    >>> data = urllib.urlopen(src).read()
    >>> reply = json.loads(data)
    >>> ranks = reply['rankings'][0]['ranks']
    >>> res = {'date': [], 'rank': []}
    >>> for d in ranks:
    ...     res['date'].append(d['date'])
    ...     res['rank'].append(d['rank'])
    ... 
    >>> res['date'][:3]
    [u'2014-08-08', u'2014-08-09', u'2014-08-10']
    >>> res['rank'][:3]
    [10, 14, 13]
    

    然后您可以使用 python 的内置 csv module 将数据存储到 csv 中。

    【讨论】:

      【解决方案3】:

      @Oliver W. 已经提供了一个很好的答案,但是使用 requests (link here) 可以避免注意网络调用,并且总体上比 urllib 更好。

      如果您想让代码更灵活一点,您可以编写一个函数来获取国家/地区名称以及开始和结束日期。

      import requests
      import pandas as pd
      import json
      
      def load_data(country='', start_date='2014-08-09', end_date='2014-11-1'):
          base = "http://www.apptrace.com/api/app/389801252/rankings/country/"
          extra = "?country={0}&start_date={1}&end_date={2}&device=iphone&list_type=normal&chart_subtype=iphone"
          addr = base + extra.format(country, start_date, end_date)
      
          page = requests.get(addr)
          json_data = page.json() #gets the json data from the page
          ranks = json_data['rankings'][0]['ranks']
          ranks = json.dumps(ranks)  #Ensures it has valid json format
          df = pd.read_json(ranks, orient='records')
          return df
      

      更改网页中的内容以查看您可以从国家/地区获得哪些其他值(例如,加拿大是“CAN”)。空字符串用于美国。

      df 是这样的

          date        rank
      0   2014-08-09  10
      1   2014-08-10  10
      2   2014-08-11  9
      3   2014-08-12  8
      4   2014-08-13  8
      5   2014-08-14  7
      6   2014-08-15  6
      7   2014-08-16  8
      

      有了 pandas 数据框,您可以导出到csv或在导出前合并多个数据框

      df = load_data()
      df.to_csv("file_name.csv")
      

      【讨论】:

      • 此外,一旦将数据框加载到 csv 中,它会将日期显示为日期时间对象,即 2014-08-09 0:00。我正在尝试使用 date 方法将其转换为仅日期,但无法访问该字段。而且我不需要索引如何删除它
      • 您可能需要阅读to_csv 文档。它还有一个您可以使用的关键字参数date_formatindex 参数,例如df.to_csv("file_name.csv", date_format='%Y-%m-%d', index=False)。另外,如果您的question was answered 满意,请不要忘记对有用的答案进行投票和/或接受对您最有帮助的答案。
      • @aamir23 该“静态”图表的工作方式完全相同。 JSON 数据在 this link 后面,您可以按照我之前描述的完全相同的方式找到它。
      • 感谢奥利弗的彻底回复。是的,我想通了。我现在正在尝试列出所有存在/可以从网站 [link]apptrace.com 找到的应用程序及其各自的开发人员。我的解决方案是重复更改搜索页面中的查询,该查询仅包含从 a-z 开始的单个字符并具有所有特殊字符和数字。有没有更好的方法?
      • @OliverW 对于上述问题,你有没有更好的方法来刮取所有应用名称和开发者名称。
      猜你喜欢
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      相关资源
      最近更新 更多