APIを使用してデータをクロールする方法、それとWebクローラーの違いは何ですか?

背景

多くのインターネット企業はユーザー情報を保存するデータベースを持っていることが多く、データベースのデータは基本的にエンジニアリング部門によってクリーンアップされます(クローラーテクノロジーの使用または基礎となるデータ分析は主に開発部門またはデータ収集エンジニアリング部門の仕事です)。多くのビジネスデータアナリストは、HSQLなどのツールを使用して、必要な大量のデータを簡単に取得できます。

ただし、市場には中小B2B企業がいくつかあり、B2C企業とは異なり、製品の反復またはビジネスの成長のために独自のユーザー情報に依存しています。彼らは主にエンジニアリング部門に依存してサードパーティのデータを解析し、その結果をビジネスプラットフォームの構築と視覚化のために製品開発部門に送信します。サードパーティのデータを取得するプロセスでは、サードパーティのAPIインターフェースを使用する必要があります。そのため、これらの企業は、API呼び出しの経験を持つために複数のポジションに応募した求職者を必要としています。クロールと並べ替えを選択した結果、データベースに必要なデータがないというジレンマに直面する可能性があります。現時点では、同様の方法を使用して自分でデータを収集する必要があります。
ここに画像の説明を挿入

APIの紹介

APIを呼び出すプロセスも、一種のクローラーです。クローラーでは、通常、APIが言及されている場所が2つあります。1つはライブラリAPIで、も​​う1つはデータAPIです。

ライブラリAPI

Library APIは通常、ライブラリ(pythonライブラリなど)を開発し、ユーザーがこのライブラリを呼び出すためのインターフェイスを提供している開発者を指します。これは、宅配便で宅配便を受け取る場合は、正しい情報を入力して宅配便を受け取る必要があるようです。この情報は、このライブラリを正確に見つけて呼び出すためのAPIインターフェースです。

データAPI

製品開発またはWeb開発では、データAPIはバックエンドからフロントエンドに渡されるデータラインのようなものです。バックエンドスタッフは、表示するデータを分類し、このデータラインをフロントエンド開発者に送信するだけで、フロントエンドは必要に応じてデータを視覚化できます。また、このインターフェースは外部の世界でも使用できます。

Webクローラーとは異なり、データAPIの設計はよりシンプルで効率的です。このインターフェイスは、誰もが必要とするデータをすでに格納しており、Webページを解析するために多くのエネルギーを費やす必要はありません。また、ウェブページデータのクロールはサーバーに負荷をかけることが多く、コードが人間のようなウェブページの閲覧頻度で設定されていない場合、IPがブロックされるリスクがあります。

ただし、データAPIにはいくつかの欠点もあります。市場には外の世界で使用できる多くのAPI製品がありますが、無料のインターフェースの多くは、クロールの量に大きな制限があります。クロールのニーズが大きい場合は、支払う必要があります。

シンプルなAPIクローラーの例

以下では、Facebook Graph APIを使用して、一般的なデータAPI呼び出しプロセスを大まかに記録する例としてデータをクロールします。

  1. 呼び出しインターフェース情報:API呼び出しアドレス(通常はURL形式)を提供します。このアドレスは、取得するストレージキャビネットの行と列を特定するのに役立ちます。
  2. データ取得のリクエスト:HTTPプロトコルを使用してデータ転送をリクエストします。通常は、Pythonのリクエストパッケージでget関数を呼び出します。
  3. リクエストパラメータを設定する:リクエストパラメータを提供する必要があります。つまり、取得する情報の種類をAPIインターフェースに通知する必要があります。たとえば、この場合、created_time(ポスト時間)、post_id(post_id)などの情報が必要です。

Facebook Graph API紹介ドキュメント

get関数はHTTPプロトコル要求の実装に役立ちますが、多くの場合、このURLを要求するにはID認証が必要です。たとえば、次のコードはエラーを報告します。

import requests
r = requests.get('https://facebook.com/user_id')
r.json()

そして戻る:アイデンティティ許可が必要です。したがって、APIインターフェースを使用する場合は、事前にWebサイトの使用法のドキュメントを読んで、リクエストプロトコルで必要な特定の情報を確認することをお勧めします。

{'documentation_url': ''https://facebook.com/user_id/#get-the-access-token',
 'message': 'Requires authentication'}

Facebook APIの公式ユーザーマニュアルでも確認できます。Facebookアカウントのpo情報を取得するには、このアカウントのトークンを取得する必要があります。自分以外のアカウント情報を取得したい場合は、事前にトークンを取得する必要があります。トークンを取得するための対応する紹介があります-> Facebookアカウントのアクセストークンを取得する方法

トークンを取得したら、上記のコードをテストして次の結果を取得します。
ここに画像の説明を挿入

コード例

目的:2020.03.01から2020.03.07までの各ビデオブログのビュー数、各国、各性別、各年齢層の視聴時間を取得し、このブロガーのビデオコンテンツの今週のパフォーマンスを分析します。

1. 首先我需要拿到3.1至3.7之间每条博文的ID(post_id)
2. 筛选出仅为视频的博文ID
3. 需要获取每条视频博文的观看次数,各个国家的观看时长
4. 将json格式的数据整理成dataframe格式 
5. 将观看时长可视化

1. 导入所需的包

import pandas as pd
import json, datetime, requests
from datetime import date, timedelta, datetime
import numpy as np
from pandas.core.frame import DataFrame

2.创建爬取数据的函数

def get_list_of_fb_post_ids(fb_page_id, fb_token, START, END):
    
    ''' 
    Function to get all the post_ids from a given facebook page during certain time range
    '''
    
    posts=[]  #用来存储所有博文的post_id
    graph_output = requests.get('https://graph.facebook.com/'+fb_page_id+'?fields=posts.limit(10){created_time}',params=fb_token).json()
    posts+=graph_output['posts']['data'] 

    graph_output = requests.get(graph_output['posts']['paging']['next']).json()
    posts+=graph_output['data'] 

    while True: #一直读取next_page,直到某次读取的记录的时间小于你设置的开始时间
        try:
            graph_output = requests.get(graph_output['paging']['next']).json()
            posts+=graph_output['data']
            if graph_output['data'][-1]['created_time']<=START:
                break
        except KeyError:
            break
            
    df_posts=pd.DataFrame(posts)
    df_posts=df_posts[(df_posts.created_time>=START)&(df_posts.created_time<=(datetime.strptime(END, "%Y-%m-%d")+timedelta(days=1)).isoformat())]
    df_posts.columns = ["timestamp", "post_id"]
    return df_posts 

3.给变量赋值,抓取post_id

fb='EAAIkwQUa1WoBAFWmq90xbMfLHecpRga****************'
fb_token = {'access_token': fb}
user_id='1404******'
output=get_list_of_fb_post_ids(user_id,fb_token,'2020-03-01','2020-03-07')

結果は次のとおりです。
ここに画像の説明を挿入

4.获取每条视频博文的相关数据

## 设定好想要获取的每条视频博文的信息
Fields = '?metric='+'post_video_views,post_video_view_time_by_region_id'
list_metrics=[ 'post_video_views','post_video_view_time_by_region_id']
def get_video_insights(output,fb_token):
   final_output=pd.DataFrame()
   for i in output.index.values:
       post_id = output['post_id'][i]
       Type = requests.get('https://graph.facebook.com/'+post_id+'?fields=type',params=fb_token).json()
       if Type['type'] == 'video': #筛选出仅为视频的博文记录
           try:
               insights_output = requests.get('https://graph.facebook.com/'+post_id+'/insights{}&period=lifetime'.format(Fields),params=fb_token).json()
               list1=list_metrics
               metrics=[]
               for j in range(0,len(list_metrics)):
                   metrics.append(insights_output['data'][j]['values'][0]['value'])
               #print("metrics get")
               metrics=DataFrame(metrics).T
               metrics.columns=list1
               col_name = metrics.columns.tolist()
               col_name.insert(col_name.index('post_video_view_time_by_region_id'),'timestamp')
               col_name.insert(col_name.index('timestamp'),'post_id')
               metrics=metrics.reindex(columns=col_name).reset_index()
               metrics['post_id']=output['post_id'][i]
               metrics['timestamp']=output['timestamp'][i]
               final_output=final_output.append(metrics)
           except:
               pass
   return final_output

出力は次のとおりです。
ここに画像の説明を挿入

5.将json格式的数据整理成dataframe格式
上記の結果から、ブロガーは今週中に合計6件のビデオブログ投稿を公開し、そのうち最も再生されたのは3.3の1つであり、40万回を超えています。ただし、さまざまな地域での総再生時間インジケーターの形式はjson形式であり、個別に処理する必要があります。

まず、地域列のデータ構造を確認します。
ここに画像の説明を挿入

上記の結果からわかるように、列の各行をトラバースし、新しいデータフレームを生成し、各国を列として使用して、対応する値を1つずつ格納する必要があります。

#遍历 post_video_view_time_by_region_id 这一列的每一行
Region=pd.DataFrame()
metrics.index=range(len(metrics)) #重新定义index
metrics['post_video_view_time_by_region_id']=metrics['post_video_view_time_by_region_id'].astype('str')
for j in metrics.index.values:
    e=eval(metrics['post_video_view_time_by_region_id'][j]) #返回字符串内的值,直接返回一个dict
    single_graph = []
    for i in e.keys():
        single_graph.append(e[i])
    single=pd.DataFrame(single_graph).T
    single.columns=list(e.keys())
    Region=Region.append(single)

結果は次のとおりです。
ここに画像の説明を挿入

6. 将观看时长可视化
まず、Regionテーブルのデータを処理し、各列名を国と都市に分割する必要があります。これは、上記のデータをより簡単に米国の地図にマッピングし、どの州のユーザーがブロガーのビデオコンテンツを好むかを視覚的に判断するために行われます。

o=Region.mean().to_dict() #算出每个城市的平均观看时长
dataset=pd.DataFrame(pd.Series(o),columns=['view time'])
dataset=dataset.reset_index().rename(columns={'index':'region'})
dataset['state']=dataset['region'].map(lambda x: x.split('-')[0]) #将列名分为国家和地区
dataset['country']=dataset['region'].map(lambda x: x.split('-')[1])#将列名分为国家和地区

処理された結果は次のとおりです。
ここに画像の説明を挿入

最後に、米国の地域を除外して、データを米国の地図に変換するだけで済みます。
ここに画像の説明を挿入

ここに画像の説明を挿入

地図から、ブロガーの動画がテキサスとカリフォルニアの人々に愛されていることを分析できます。これら2つの州のユーザーの動画戦略に常に応えようとすることに加えて、他の州の理由をさらに調査する必要がありますビデオのうち、それらよりもはるかに短い。上記の情報に基づいて、ブロガーは、それを後のビデオ制作でより地理的に特徴的なものにすることができ、ブロガーがFacebookの地域配信機能を使用して、より効率的に提供するためにビデオコンテンツのさまざまな特性をさまざまな地域に配信することを推奨しますユーザーの趣味や趣味は、自分のメディアマーケティング業務を最適化します。

上記は、Facebook Graph APIを使用してデータをクロールする手順です。不十分または不適切な説明がある場合は、友達に批判して修正するよう依頼してください。:)

元の記事2件を公開 賞賛された2件 訪問988件

おすすめ

転載: blog.csdn.net/weixin_43944997/article/details/105502469