2016-08-29 1 views
1

私はpython 2.7 BING SEARCH APIを作成しました。これはページあたり50カウントを返し、オフセット値を毎回50ずつ変更することによってページを区切ります。結果はJSONファイルに書き込まれます。BING SEARCH APIを使用する場合、重複した結果をどのようにして除外しますか?

私のAPI呼び出しのヘッダーにUser-AgentとX-Search-ClientIPを指定しています。また、ウェブページのresponseFilterと、 'en-us'のmkt値も指定しています。

複数の検索結果が重複しているため、私は心配です。私が10回ページすると(したがって、50 X 10 = 500の結果を検索する)、これらのうち約17%は重複レコードです。私は強制的に非重複値を返すように強制することができる方法はありますか?一意の値のみを取得することに近づくために、私が取るべき推奨する追加ステップは何ですか?

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import httplib, urllib, base64, json, re, os, sys, codecs, locale, time 

pull_count = 50       ## Var used to control # of hits per pull 
offset = 0         ## Var used to push pagination counter to http get 
num_paginations = 10      ## Var used to control max # of paginations 
local_counter = 1       ## Helps Write commas to json file for all but last run 
timer_counter = 1       ## Variable used to make system wait after 5 pulls 
dump_file = 'BingDump.json'    ## Name of local file where results are written to 
api_domain = 'api.cognitive.microsoft.com' 
query = 'Bill Gates' 
user_agent = 'Mozilla/5.0 (MAC OSX, Educational Usage Only)' 
x_search = '199.99.99.99' 

#Request Headers, open connection, open file write to output file 
headers = { 
    'Ocp-Apim-Subscription-Key': 'MYSUBSCRIPTIONKEY', 
    'User-Agent' : user_agent, 
    'X-Search-ClientIP': x_search, 
} 
conn = httplib.HTTPSConnection(api_domain) 
fhand = open(dump_file,'w') 

#Function to build URL for API PULL 
def scraper() : 
    pull_count_str = str(pull_count) 
    offset_str = str(offset) 
    params = urllib.urlencode({ 
     'q': query, 
     'count': pull_count_str, 
     'offset': offset_str, 
     'mkt': 'en-us', 
     'safesearch': 'Moderate', 
     'responseFilter': 'webpages', #controls whether pull scrapes from web/image/news etc 
    }) 
    return(params) 

#Function set to wait 4 seconds after 5 pulls 
def holdup(entry) : 
    if entry != 5 : 
     entry += 1 
    else: 
     entry = 1 
     time.sleep(4) 
    return(entry) 

#Function that establishes http get, and writes data to json file 
def getwrite(entry1, entry2) : 
    conn.request("GET", "/bing/v5.0/search?%s" % entry1, "{body}", entry2) 
    response = conn.getresponse() 
    data = response.read() 
    json_data = json.loads(data) 
    fhand.write(json.dumps(json_data, indent=4)) 

#Main Code - Pulls data iteratively and writes it to json file 
fhand.write('{') 

for i in range(num_paginations) : 

    dict_load = '"' + str(local_counter) + '"' + ' : ' 
    fhand.write(dict_load) 
    try: 
     link_params = scraper()  
     print('Retrieving: ' + api_domain + '/bing/v5.0/search?' + link_params) 
     getwrite(link_params, headers) 
    except Exception as e: 
     print("[Errno {0}] {1}".format(e.errno, e.strerror)) 
     fhand.write('"Error. Could not pull data"')   
    offset += pull_count 
    if local_counter != num_paginations : fhand.write(', ') 
    local_counter += 1 
    timer_counter = holdup(timer_counter) 

fhand.write('}') 
fhand.close() 
conn.close() 
+0

は、返される検索結果の品質を向上させる私のヘッダパラメータにMSEDGEの詳細を含む場合BINGのAPIの専門家に依頼する募集し、少ないとの結果が得られます行うことができない何かがあるかどう重複します。 10,000件の検索結果が含まれていますが、そのうちの900/10000程度がユニーク(10%未満)でした。いくつかの検索結果は800回も繰り返されました。 –

+0

私は同意することができます、私は同じ問題があります。ますますページが増えていくにつれ、より多くのダブがありますが、時には新しいアイテムがあります。私は、重複したデータを取得するためのAPIコールをたくさん無駄にしています。 –

答えて

0

ありがとうございます。

ページ設定が10に設定されていることがわかりました。 num_paginations = 10 ##最大ページ数を制御するために使用される数値です。

おかげで、 パトリック

+0

ありがとうございます。私は、num_paginationsを使用して、Bingに対してHTTP REQUESTSを実行する回数を定義しています。だから私は10の要求を実行する場合は、私はそのvarを10に設定します。私は、(私は50)PERの要求を検索結果の数を設定するために 'pull_count'を使用します。私のコードが生成するURLは、http要求ごとに異なるオフセット#を持っています。 私のリクエストURLはすべて&count = 50です。最初のリクエストURLについては、&offset = 0、次に&offset = 50、&offset = 100を使用します。理論的には、私が書類/フォーラムで読んだことのすべてから、私は行かなくてはなりません。私がやるべきことが他にもありますか? –

関連する問題