最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Python的Django框架編寫從Google Adsense中獲得報(bào)表的應(yīng)用

 更新時(shí)間:2015年04月17日 09:54:58   投稿:goldensun  
這篇文章主要介紹了用Python的Django框架編寫從Google Adsense中獲得報(bào)表的應(yīng)用,主要利用了官方的Google Adsense API,需要的朋友可以參考下

 我完成了更新我們?cè)?Neutron的實(shí)時(shí)收入統(tǒng)計(jì)。在我花了一周的時(shí)間完成并且更新了我們的PHP腳本之后,我最終認(rèn)決定開始使用Python進(jìn)行抓取,這是值得我去花費(fèi)我的時(shí)間和精力的事情。我建立了一個(gè) Django程序,它可以從不同的來源存儲(chǔ)收入統(tǒng)計(jì),我可以用這些去簡(jiǎn)歷視圖和用于統(tǒng)計(jì)工具的API。

所以在過去的幾天里,我寫了一個(gè)腳本,它可以登入到其他的網(wǎng)頁(yè)并抓取數(shù)據(jù),或者,如果這些網(wǎng)頁(yè)有 API,可以直接訪問 API。我發(fā)現(xiàn)了一些事情。

1.requests >httplib2requests多于httplib2);

2.SOAP很糟糕,但它至少是一個(gè)API,Suds使SOAP好一點(diǎn)。我了解到SOAP是我說知道的API中,唯一一個(gè)完全基于.net開發(fā)的。

3.Beautiful Soup是一個(gè)很好的求助對(duì)象;

4.我確實(shí)十分驚訝,這么多企業(yè)能在如此蹩腳的技術(shù)中生存下來。
 

我拯救了 Google Adsense,他們將會(huì)擁有最好的API,并且因此成為最簡(jiǎn)單的實(shí)現(xiàn)。他有著比我預(yù)想的要多的挑戰(zhàn)。顯然你無法僅僅插入用戶名/密碼或是APIkey去獲取獲得進(jìn)入API的入口,你必須完成整個(gè)Oauth2的握手流程。

不幸的是,我發(fā)現(xiàn)文檔不如我希望過得那樣容易查詢。我發(fā)現(xiàn)了很多死鏈接。我認(rèn)為,在這方面Google的人應(yīng)該做的更好。例如,在他們的up to date developer docs文檔中,我發(fā)現(xiàn)他們指出了broken link to read more about authentication and authorization。(好的,多么奇怪,我盡快提交了這個(gè)問題,這個(gè)鏈接終于開始工作了,我猜你會(huì)感謝我。)


所以,這篇博客將嘗試記錄從Adsense獲取報(bào)表到我的Django應(yīng)用的過程。

為了使用Google的API來訪問Adsense報(bào)表,你需要使用Adsense Management API. 這個(gè)API只提供OAuth,所以你需要在瀏覽器中至少完成一次認(rèn)證過程,來獲取你的證書,然后你可以保存這些證書來進(jìn)行下一步操作。說實(shí)話,我已經(jīng)聽說過OAuth很多次了,但是直到現(xiàn)在,我在實(shí)踐中仍沒有需要來使用它。所以我是邊做邊學(xué),并歡迎大家留言指出我說的不對(duì)的地方。

就我所知,Google對(duì)于它的各種產(chǎn)品都擁有一個(gè)龐大的API。在研究Adsense之前,你需要在Google API 控制臺(tái)注冊(cè)你的應(yīng)用。我已經(jīng)成功注冊(cè)了我的應(yīng)用。因?yàn)槲疫€沒有一個(gè)可用的URL地址,我現(xiàn)在暫時(shí)使用我的開發(fā)URL(localhost:8000)。它運(yùn)作起來似乎正常。并使用提供的這個(gè)鏈接下載JSON文件。

還有,當(dāng)你管理你的APIs的時(shí)候,你需要打開服務(wù)選項(xiàng)卡,打開AdSense Management API選項(xiàng)。否則,當(dāng)你嘗試發(fā)送請(qǐng)求的時(shí)候,你會(huì)得到一個(gè)錯(cuò)誤消息“Access Not Configured”。


Google已經(jīng)創(chuàng)建了一個(gè)Python 客戶端庫(kù),你可以輕易的通過pip來安裝這個(gè)庫(kù)。它還包含一個(gè)Django樣例項(xiàng)目,這個(gè)項(xiàng)目使用這個(gè)庫(kù)實(shí)現(xiàn)OAuth2的握手過程。我想,它是使用Django 1.1編寫的(因?yàn)樵趯戇@個(gè)項(xiàng)目的時(shí)候,Django 1.5才剛剛發(fā)布),所以它可能有點(diǎn)過時(shí),但是它可是一個(gè)好的開始點(diǎn)。

我的應(yīng)用很簡(jiǎn)單。我只需要讀取指定日期的收益金額,并保存到我的本地?cái)?shù)據(jù)庫(kù)。

我在djaongo項(xiàng)目中創(chuàng)建了一個(gè)新的應(yīng)用,叫做“adsense”。并創(chuàng)建了一個(gè)models.py文件來存儲(chǔ)認(rèn)證證書。
 

from django.contrib.auth.models import User
from django.db import models
from oauth2client.django_orm import CredentialsField
 
class Credential(models.Model):
  id = models.ForeignKey(User, primary_key=True)
  credential = CredentialsField()
 
class Revenue(models.Model):
  date = models.DateField(unique=True)
  revenue = models.DecimalField(max_digits=7, decimal_places=2)
 
  def __unicode__(self):
    return '{0} ${1}'.format(self.date, self.revenue)


我把從API控制臺(tái)下載的JSON文件放到我的應(yīng)用的文件夾下面,并創(chuàng)建了一個(gè)views.py文件

 

import os
 
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.contrib.sites.models import Site
from django.http import HttpResponseBadRequest, HttpResponse
from django.http import HttpResponseRedirect
from oauth2client import xsrfutil
from oauth2client.client import flow_from_clientsecrets
from oauth2client.django_orm import Storage
 
from .models import Credential
 
CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json')
 
FLOW = flow_from_clientsecrets(
  CLIENT_SECRETS,
  scope='https://www.googleapis.com/auth/adsense.readonly',
  redirect_uri='http://{0}/adsense/oauth2callback/'.format(
    Site.objects.get_current().domain))
 
@login_required
def index(request):
  storage = Storage(Credential, 'id', request.user, 'credential')
  credential = storage.get()
  if credential is None or credential.invalid is True:
    FLOW.params['state'] = xsrfutil.generate_token(settings.SECRET_KEY,
                            request.user)
    authorize_url = FLOW.step1_get_authorize_url()
    return HttpResponseRedirect(authorize_url)
  else:
    return HttpResponse('Already validated.')
 
@login_required
def auth_return(request):
  if not xsrfutil.validate_token(settings.SECRET_KEY,
                  request.REQUEST['state'], request.user):
    return HttpResponseBadRequest()
  credential = FLOW.step2_exchange(request.REQUEST)
  storage = Storage(Credential, 'id', request.user, 'credential')
  storage.put(credential)
  return HttpResponseRedirect("/")

在 urls.py 文件中我包含了一個(gè)鏈接指向我的應(yīng)用的url文件

main urls.py:
 
from django.conf.urls import patterns, include, url
from django.contrib import admin
 
admin.autodiscover()
 
urlpatterns = patterns(
  '',
  url(r'^adsense/', include('adsense.urls', namespace='adsense')),
 
  url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
  url(r'^admin/', include(admin.site.urls)),
)

adsense/urls.py:
 
from django.conf.urls import patterns, url
 
urlpatterns = patterns(
  'adsense.views',
  url(r'^$', 'index', name='index'),
  url(r'^oauth2callback/$', 'auth_return', name='auth_return'),
)

最后,創(chuàng)建了一個(gè)通過給定日期調(diào)用API并獲取收益的類。它放在adsense/tasks.py,因?yàn)槲覝?zhǔn)備把它當(dāng)作任務(wù),鉤在 Celery/ RabbitMQ之上。
 

import datetime
import httplib2
 
from apiclient.discovery import build
from django.contrib.auth.models import User
from oauth2client.django_orm import Storage
 
from .models import Credential, Revenue
 
TODAY = datetime.date.today()
YESTERDAY = TODAY - datetime.timedelta(days=1)
 
class Scraper(object):
  def get_report(self, start_date=YESTERDAY, end_date=TODAY):
    user = User.objects.get(pk=1)
    storage = Storage(Credential, 'id', user, 'credential')
    credential = storage.get()
    if not credential is None or credential.invalid is False:
      http = httplib2.Http()
      http = credential.authorize(http)
      service = build('adsense', 'v1.2', http=http)
      reports = service.reports()
      report = reports.generate(
        startDate=start_date.strftime('%Y-%m-%d'),
        endDate=end_date.strftime('%Y-%m-%d'),
        dimension='DATE',
        metric='EARNINGS',
      )
      data = report.execute()
      for row in data['rows']:
        date = row[0]
        revenue = row[1]
 
        record = Revenue()
        try:
          r = Revenue.objects.get(date=date)
          pk = r.id
        except Revenue.DoesNotExist:
          pk = None
        record.id = pk
        record.date = date
        record.revenue = revenue
        record.save()

為了讓它能工作起來,我在瀏覽器打開http://localhost:8000/adsense/。這時(shí)候會(huì)要求我登錄Google帳號(hào)。我為我的應(yīng)用授權(quán)來訪問Adsense。然后,認(rèn)證證書就會(huì)保存在我的本地?cái)?shù)據(jù)庫(kù),然后我可以調(diào)用Scraper get_report() 方法。祝賀我吧!。它能順利工作了。

相關(guān)文章

  • 快速進(jìn)修Python指南之函數(shù)進(jìn)階

    快速進(jìn)修Python指南之函數(shù)進(jìn)階

    這篇文章主要為大家介紹了Java開發(fā)者快速進(jìn)修Python指南之函數(shù)進(jìn)階示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Python字典取值全攻略之高效、簡(jiǎn)潔地獲取字典值的多種技巧

    Python字典取值全攻略之高效、簡(jiǎn)潔地獲取字典值的多種技巧

    這篇文章主要給大家介紹了關(guān)于Python字典取值全攻略之高效、簡(jiǎn)潔地獲取字典值的多種技巧,dictionary(字典)是除列表以外Python之中最靈活的數(shù)據(jù)類型,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 用Python制作檢測(cè)Linux運(yùn)行信息的工具的教程

    用Python制作檢測(cè)Linux運(yùn)行信息的工具的教程

    這篇文章主要介紹了用Python制作檢測(cè)Linux運(yùn)行信息的工具的教程,主要是用CPython讀取運(yùn)行系統(tǒng)的硬件參數(shù)、網(wǎng)絡(luò)傳輸流量統(tǒng)計(jì)等,需要的朋友可以參考下
    2015-04-04
  • python基于plotly實(shí)現(xiàn)畫餅狀圖代碼實(shí)例

    python基于plotly實(shí)現(xiàn)畫餅狀圖代碼實(shí)例

    這篇文章主要介紹了python基于plotly實(shí)現(xiàn)畫餅狀圖代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 探討python??pandas.DataFrame.to_json?函數(shù)

    探討python??pandas.DataFrame.to_json?函數(shù)

    這篇文章主要介紹了python??pandas.DataFrame.to_json?函數(shù)示例詳解,to_json?函數(shù)提供了靈活的參數(shù)設(shè)置,使得?pandas?數(shù)據(jù)框能夠以多種格式導(dǎo)出為?JSON?文件,需要的朋友可以參考下
    2024-07-07
  • python 截取 取出一部分的字符串方法

    python 截取 取出一部分的字符串方法

    下面小編就為大家?guī)硪黄猵ython 截取 取出一部分的字符串方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 在Django中動(dòng)態(tài)地過濾查詢集的實(shí)現(xiàn)

    在Django中動(dòng)態(tài)地過濾查詢集的實(shí)現(xiàn)

    本文主要介紹了Django中動(dòng)態(tài)地過濾查詢集的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Dialog 按照順序彈窗的優(yōu)雅寫法

    Dialog 按照順序彈窗的優(yōu)雅寫法

    這篇文章主要介紹了Dialog 按照順序彈窗的寫法及示例,給大家介紹了DrawType的使用方式,需要的朋友可以參考下
    2021-09-09
  • Python設(shè)計(jì)模式優(yōu)雅構(gòu)建代碼全面教程示例

    Python設(shè)計(jì)模式優(yōu)雅構(gòu)建代碼全面教程示例

    Python作為一門多范式的編程語(yǔ)言,提供了豐富的設(shè)計(jì)模式應(yīng)用場(chǎng)景,在本文中,我們將詳細(xì)介紹 Python 中的各種設(shè)計(jì)模式,包括創(chuàng)建型、結(jié)構(gòu)型和行為型模式
    2023-11-11
  • PyCharm無代碼提示解決方案

    PyCharm無代碼提示解決方案

    最近發(fā)現(xiàn)在使用pycharm編寫python代碼的時(shí)候發(fā)現(xiàn)沒有了代碼提示的功能,下面這篇文章主要給大家介紹了關(guān)于PyCharm無代碼提示解決方案的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06

最新評(píng)論

屏南县| 绿春县| 偃师市| 芮城县| 盐山县| 永善县| 麻栗坡县| 迭部县| 广宁县| 凭祥市| 龙山县| 闽清县| 三河市| 黎川县| 青龙| 正安县| 和平区| 广昌县| 上思县| 大丰市| 民丰县| 郧西县| 博白县| 盈江县| 灵武市| 义马市| 塔城市| 涡阳县| 青阳县| 逊克县| 淮安市| 彰武县| 海林市| 龙游县| 七台河市| 杭锦后旗| 丹阳市| 鄂尔多斯市| 青州市| 库伦旗| 玉溪市|