2009-11-01 36 views
51

Tôi đang cố chạy truy vấn tìm kiếm của Google từ ứng dụng python. Có bất kỳ giao diện python ra khỏi đó mà sẽ cho phép tôi làm điều này? Nếu không có ai biết Google API nào sẽ cho phép tôi thực hiện việc này. Cảm ơn.Tìm kiếm của Google từ một ứng dụng Python

Trả lời

70

Có một ví dụ đơn giản here (đặc biệt thiếu một số dấu ngoặc kép ;-). Hầu hết những gì bạn sẽ thấy trên web là giao diện Python với API SOAP cũ, đã ngừng hoạt động - ví dụ tôi chỉ sử dụng API AJAX mới hơn và được hỗ trợ, đó chắc chắn là một trong những bạn muốn! -)

Sửa: đây là một hoàn chỉnh hơn Python 2.6 dụ với tất cả các dấu ngoặc kép cần thiết & c; -) ...:

#!/usr/bin/python 
import json 
import urllib 

def showsome(searchfor): 
    query = urllib.urlencode({'q': searchfor}) 
    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'] 
    print 'Total results: %s' % data['cursor']['estimatedResultCount'] 
    hits = data['results'] 
    print 'Top %d hits:' % len(hits) 
    for h in hits: print ' ', h['url'] 
    print 'For more results, see %s' % data['cursor']['moreResultsUrl'] 

showsome('ermanno olmi') 
+3

Đã thử trên máy Linux cục bộ của tôi và sau đó Google nghĩ rằng tôi là bot và mọi tìm kiếm từ trình duyệt của tôi đều là captcha 'ed! Tôi không nên cố gắng làm việc này, chỉ cần một người đứng đầu cho một người sử dụng này. Thêm tác nhân người dùng và liên kết giới thiệu để làm cho nó trông giống một yêu cầu chính hãng hơn! – ThinkCode

+11

Rất tiếc, [API tìm kiếm web của Google] (http://code.google.com/apis/websearch/) mà tùy thuộc vào điều này không được dùng nữa vào tháng 11 năm 2010. API tìm kiếm tùy chỉnh được cho là sẽ thay thế điều này, nhưng yêu cầu bạn định cấu hình danh sách các URL để tìm kiếm trên toàn bộ - không phải toàn bộ web. – Day

+3

tính đến ngày hôm nay (2014.06.10), điều này đang hoạt động ... trên IPython/Python2.7.6 – kmonsoor

17

Dưới đây là câu trả lời của Alex chuyển đến Python3

#!/usr/bin/python3 
import json 
import urllib.request, urllib.parse 

def showsome(searchfor): 
    query = urllib.parse.urlencode({'q': searchfor}) 
    url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' % query 
    search_response = urllib.request.urlopen(url) 
    search_results = search_response.read().decode("utf8") 
    results = json.loads(search_results) 
    data = results['responseData'] 
    print('Total results: %s' % data['cursor']['estimatedResultCount']) 
    hits = data['results'] 
    print('Top %d hits:' % len(hits)) 
    for h in hits: print(' ', h['url']) 
    print('For more results, see %s' % data['cursor']['moreResultsUrl']) 

showsome('ermanno olmi') 
+0

Lợi thế của việc sử dụng Python 3 trên câu trả lời của Alex là gì? –

+1

@Phill, không chắc chắn ý của bạn là "lợi thế". Nếu dự án của bạn sử dụng Python2 bạn sử dụng câu trả lời của Alex. Nếu dự án sử dụng Python3, bạn có thể sử dụng câu trả lời này.Thật không may là nó không thực sự thiết thực để viết hàm này theo cách như vậy để sử dụng cùng mã với cả hai phiên bản của Python –

+0

Tôi đoán câu hỏi của tôi là tại sao lại sử dụng Python3 trên Python2? Những lợi ích là gì? Mới với Python, đến từ nền PHP. Những thứ được chính thức hóa hơn? –

11

Dưới đây là cách tiếp cận của tôi để này : http://breakingcode.wordpress.com/2010/06/29/google-search-python/

Một vài đoạn mã ví dụ:

# Get the first 20 hits for: "Breaking Code" WordPress blog 
    from google import search 
    for url in search('"Breaking Code" WordPress blog', stop=20): 
     print(url) 

    # Get the first 20 hits for "Mariposa botnet" in Google Spain 
    from google import search 
    for url in search('Mariposa botnet', tld='es', lang='es', stop=20): 
     print(url) 

Lưu ý rằng mã này KHÔNG sử dụng API của Google, và vẫn đang làm việc cho đến nay (tháng 1 năm 2012).

+0

HI Mario, tôi đã cố gắng sử dụng kịch bản của bạn và tuyệt vời của nó. Tôi đang phải đối mặt với chỉ một vấn đề - ngay cả khi tôi sử dụng .COM như TLD Tôi nhận được kết quả mà đi vào .CO.IN. Bạn có thể vui lòng giúp đỡ. –

+0

Lưu ý rằng điều này có thể xảy ra bất cứ lúc nào vì nó không sử dụng API chính thức nhưng lại cào trang kết quả của Google, ví dụ: nếu Google thay đổi cách kết quả được trả về. – stracktracer

6

Tôi mới ở python và tôi đã điều tra cách thực hiện việc này. Không có ví dụ nào được cung cấp đang hoạt động đúng với tôi. Một số bị chặn bởi google nếu bạn thực hiện nhiều yêu cầu (vài), một số đã lỗi thời. Phân tích cú pháp html tìm kiếm của google (thêm tiêu đề trong yêu cầu) sẽ hoạt động cho đến khi google thay đổi cấu trúc html lần nữa. Bạn có thể sử dụng cùng một logic để tìm kiếm trong bất kỳ công cụ tìm kiếm nào khác, nhìn vào html (view-source).

import urllib2 

def getgoogleurl(search,siteurl=False): 
    if siteurl==False: 
     return 'http://www.google.com/search?q='+urllib2.quote(search) 
    else: 
     return 'http://www.google.com/search?q=site:'+urllib2.quote(siteurl)+'%20'+urllib2.quote(search) 

def getgooglelinks(search,siteurl=False): 
    #google returns 403 without user agent 
    headers = {'User-agent':'Mozilla/11.0'} 
    req = urllib2.Request(getgoogleurl(search,siteurl),None,headers) 
    site = urllib2.urlopen(req) 
    data = site.read() 
    site.close() 

    #no beatifulsoup because google html is generated with javascript 
    start = data.find('<div id="res">') 
    end = data.find('<div id="foot">') 
    if data[start:end]=='': 
     #error, no links to find 
     return False 
    else: 
     links =[] 
     data = data[start:end] 
     start = 0 
     end = 0   
     while start>-1 and end>-1: 
      #get only results of the provided site 
      if siteurl==False: 
      start = data.find('<a href="/url?q=') 
      else: 
      start = data.find('<a href="/url?q='+str(siteurl)) 
      data = data[start+len('<a href="/url?q='):] 
      end = data.find('&amp;sa=U&amp;ei=') 
      if start>-1 and end>-1: 
       link = urllib2.unquote(data[0:end]) 
       data = data[end:len(data)] 
       if link.find('http')==0: 
        links.append(link) 
     return links 

Cách sử dụng:

links = getgooglelinks('python','http://www.stackoverflow.com/') 
for link in links: 
     print link 

(Chỉnh sửa 1: Thêm một tham số để thu hẹp tìm kiếm google đến một trang web cụ thể)

(Chỉnh sửa 2: Khi tôi nói thêm câu trả lời này tôi đã mã hóa một Tôi đã tải nó lên Github: Subseek)

+0

Tôi quan tâm đến lý do tại sao không có ví dụ nào phù hợp với bạn, đặc biệt là chút ít về BeautifulSoup không hoạt động vì HTML được tạo bởi JavaScript ... Tôi đã thử bản thân ngay bây giờ và nó hoạt động: http: //breakingcode.wordpress .com/2010/06/29/google-search-python/ – MarioVilas

+0

Trong trường hợp của tôi, tôi không thể sử dụng BeautifulSoup. Tôi đã thử nghiệm nó và có vẻ như là google đã tạo ra các phản ứng html với các khối javascript, vì vậy tôi đã không tìm thấy một cách để có được các liên kết với các lớp BS. Tôi chỉ tìm thấy các liên kết trong phản hồi bằng cách sử dụng chức năng "tìm". –

+0

Có thể URL đến Google đang trỏ đến API mới hơn sử dụng JavaScript thay vì API cũ sử dụng HTML trống. Tôi tin rằng việc thêm "& btnG = Google + Tìm kiếm" vào truy vấn của bạn khiến cho nó sử dụng HTML API, hoặc ít nhất đó là sự khác biệt duy nhất tôi thấy. – MarioVilas

Các vấn đề liên quan