私は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()
は、返される検索結果の品質を向上させる私のヘッダパラメータにMSEDGEの詳細を含む場合BINGのAPIの専門家に依頼する募集し、少ないとの結果が得られます行うことができない何かがあるかどう重複します。 10,000件の検索結果が含まれていますが、そのうちの900/10000程度がユニーク(10%未満)でした。いくつかの検索結果は800回も繰り返されました。 –
私は同意することができます、私は同じ問題があります。ますますページが増えていくにつれ、より多くのダブがありますが、時には新しいアイテムがあります。私は、重複したデータを取得するためのAPIコールをたくさん無駄にしています。 –