2013-07-18 1 views
1

Google에서 문자열 집합을 검색하고 결과의 "예상되는"양을 반환하려면 여기에서 찾은 일부 코드를 사용하고 있습니다. 그 코드는 다음과 같습니다.파이썬으로 Google 검색이 산발적으로 정확하지 않으며 유형 오류가 있습니다.

for a in months: 
    for b in range(1, daysInMonth[a] + 1): 

     #Code 

     if not myString: 
      googleStats.append(None) 
     else: 
      try: 
      query = urllib.urlencode({'q': myString}) 
      url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' % query 
      search_response = urllib.urlopen(url) 
      search_results = search_response.read() 
      results = json.loads(search_results) 
      data = results['responseData']   
      googleStats.append(data['cursor']['estimatedResultCount']) 
     except TypeError: 
      googleStats.append(None) 
for x in range(0, len(googleStats)): 
    if googleStats[x] != None: 
     finalGoogleStats.append(googleStats[x]) 

두 가지 문제점이있을 수 있습니다. len (finalGoogleStats)을 반환하면 항상 다릅니다. 그것은 37의 한 시간, 그것은 더 (240)

같이해야한다, 그러나 (12)의 형식 오류 내가 꺼낼 때받을 이쪽 시도/제외 : 라인에서 발생

TypeError: 'NoneType' object has no attribute '__getitem__' 

googleStats.append(data['cursor']['estimatedResultCount']) 

그래서 Google에서는 항상 googleStats의 Nones 수가 변경되는 이유를 알 수 없습니다. 누구든지 아이디어가 있다면, 나는 그 (것)들을 듣고 싶다 감사합니다!

나는 모든 나는 나는 제구 시과의 톤과 ​​매우 몇 가지 실제 JSON 사전을 얻을 찾고 있어요 생각에 대한 데이터를 인쇄하려고 UPDATE. 내가 얻은 사전은 모든 검색에 걸쳐 퍼져 나왔고, 나는 아무 것도없고 어떤 것이 없는지 패턴을 보지 못했습니다. 그래서 문제는 다른 것보다 GoogleAPI와 더 관련이있는 것처럼 보입니다.

+2

왜 캐치'TypeError'을 다음? –

+1

코드를 조금 더 게시해야합니다. 나는이 부분이 루프 안에있을 것으로 기대한다. 그렇지 않으면'len (googleStats)'이 0 또는 1이 될 것이다. 때때로'data [ 'cursor'] [ 'estimatedResultCount']'는'None'이된다 – furins

+0

나는 더 많은 코드를 추가했다. 도움이됩니다. @MartijnPieters, 나는 그것을 처음으로 달렸을 때 생겨 났기 때문에 나는 그것을 잡았다, 나는 그것이 한 두 번만 일어날 것이라고 생각했다. 그러나 그것은 약 400/420 번 일어난다. –

답변

1

대답은 내가 무엇 당신의 수 TypeError의 데모로

, 여기 내 추측이다 잠시 두려워하지만, 도우 려했던 모든 사람 덕분에, 나는 누군가가 유용했다면 당신을지지했다.

그래서 Google은 무언가를 탐색하고 있다는 사실에 놀란 것처럼 보입니다. 그들이 내게주는 오류는 다음과 같습니다.

Suspected Terms of Service Abuse ...... responseStatus:403 

따라서 나는 그들이 검색 할 수있는 양에 제한을 두는 것으로 생각합니다. 여전히 이상한 것은 있지만, 그것은 항상 발생하지 않는다는 것입니다. 나는 여전히 오류 바다에서 산발적 인 성공적인 검색을합니다. 그것은 여전히 ​​수수께끼입니다 ...

+1

이 API 엔드 포인트의 속도가 제한되었을 수 있습니까? HTTP를 통해 타사 API와 상호 작용하려면 응답 코드 및 오류 메시지를 진단하는 것이 유용합니다 (또한 처리 할 수있는 try..except도 유용합니다). 오류 응답을 기반으로, 나는 그것이 신비가 아니라고 말할 것입니다. 그것은 실제로 "속도 제한"입니다. http://en.wikipedia.org/wiki/Rate_limiting – woozyking

1

먼저, try..except 절을 제거하고 정확히 어디에 문제가 있는지 확인하십시오. 그런 다음 일반적인 유용한 방법으로 사전 요소 레이어에 액세스 할 때 더 나은 제어를 위해 .get() 메서드를 사용하십시오.

>>> a = {} 
>>> a['lol'] = None 
>>> a['lol']['teemo'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object has no attribute '__getitem__' 
>>> 

간단한 데모에 대한 .get()를 사용하는 방법이 있습니다 :

>>> a = {} 
>>> b = a.get('lol') # will return None 
>>> if type(b) is dict: # determine type 
...  print b.get('teemo') # same technique if b is indeed of type dict 
... 
>>> 
+0

네, 방금 추가했습니다. 그것이 올바른 오류입니다. .get()은 어떻게 사용합니까? –

+0

@AlexChumbley가'.get()'사용법을 위해 업데이트되었습니다. – woozyking

+0

그래, 불행히도 같은 문제를 시도해 보았습니다. –