使用python+;美丽之路4

使用python+;美丽之路4,python,graph,web-scraping,beautifulsoup,python-requests,Python,Graph,Web Scraping,Beautifulsoup,Python Requests,我需要实现一个数据抓取任务,并从动态图中提取数据。该图表随着时间的推移而更新,与查看公司股票图表时所发现的情况类似。我正在使用python中的requests和beautifulsoup4库,但我只知道如何刮取文本和链接数据。我似乎不知道如何将图形的值输入到csv文件中 有问题的图表可以在-找到。你能提供一个链接供参考吗。这取决于图形的存储和显示方式。从动态的角度来看,就像股票行情一样,在一些标签之间应该有一些文本,你可以在某个地方抓到。我看过使用BeautifulSoup从网站获取图像和其他内

我需要实现一个数据抓取任务,并从动态图中提取数据。该图表随着时间的推移而更新,与查看公司股票图表时所发现的情况类似。我正在使用python中的requests和beautifulsoup4库,但我只知道如何刮取文本和链接数据。我似乎不知道如何将图形的值输入到csv文件中


有问题的图表可以在-

找到。你能提供一个链接供参考吗。这取决于图形的存储和显示方式。从动态的角度来看,就像股票行情一样,在一些标签之间应该有一些文本,你可以在某个地方抓到。我看过使用BeautifulSoup从网站获取图像和其他内容的例子,所以这不是不可能的

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

请查看:


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

如果您有正确的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中。

@Oliver W.已经提供了一个很好的答案,但是使用
请求
()可以避免记录网络调用,总体而言,它是一个比
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
有了熊猫数据帧,您可以导出到
csv
,或者在导出之前合并多个数据帧

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

这是我试图删除的图表的链接。任何帮助都将不胜感激。我知道如何抓取文本和链接,但这是我第一次处理图表。
所有坐标都是这样,这让我想到,因为它们可能是由一些服务器端脚本生成的。数据框不是以5,10,15,20的形式存储在代表数据的方便绘图点中,而是以大量数字表示像素点。此外,一旦数据框加载到csv中,它将日期显示为日期时间对象,即2014-08-09 0:00。我试图使用date方法将其转换为仅日期,但无法访问该字段。我不需要索引我该如何删除你可能想阅读的文档。它还有一个可以使用的关键字参数
date\u format
,以及
index
参数,例如
df.to\u csv(“file\u name.csv”,date\u format='%Y-%m-%d',index=False)
。另外,不要忘记对有用的答案进行投票和/或接受对你最有帮助的答案,以防你的回答令人满意。@aamir23“静态”图表的工作方式与此完全相同。后面是JSON数据,您可以用与我之前描述的完全相同的方式找到它。感谢您的全面回复Oliver。是的,我知道了。我现在正试图列出所有应用程序以及它们各自的开发者,这些应用程序和开发者都可以在网站[link]上找到。我的解决方案是重复更改搜索页面中的查询,该查询只包含从a-z开始的单个字符,并且包含所有特殊字符和数字。有更好的方法吗?@OliverW对于上述问题,您有更好的方法来清除所有应用程序名和开发人员名吗。