2017-03-09 5 views
0

Je veux écrire un script python dans lequel j'écris une question et, en guise de réponse, je reçois une réponse de google custom search api ou de Bing ou de toute autre API de recherche (toute personne). J'ai essayé d'utiliser Google API de recherche personnalisée, mais il m'a donné ce script:Recherche Google en script Python

<script> 
    (function() { 
    var cx = 'someurl'; 
    var gcse = document.createElement('script'); 
    gcse.type = 'text/javascript'; 
    gcse.async = true; 
    gcse.src = 'someurl' + cx; 
    var s = document.getElementsByTagName('script')[0]; 
    s.parentNode.insertBefore(gcse, s); 
    })(); 
</script> 

Depuis que je ne suis pas en utilisant une page html et juste requiers réponse dans la console python comment puis-je cela? Existe-t-il une méthode pour faire autre chose que l'appel API?

Répondre

0

Pour faire des recherches google il existe de nombreux modules comme google ou Google-Search-API. Mais si vous voulez faire beaucoup de recherches et avoir beaucoup de requêtes, google vous bloquera et vous obtiendrez l'erreur 503. Avant il y avait l'option d'utiliser d'autres API mais comme Bing et Yahoo, mais aucun d'entre eux n'est plus gratuit. Seule l'API gratuite effectuant des recherches sur Internet est FAROO API. Mais il y a encore une option pour faire de la recherche google en utilisant selenium webdriver. Selenium est utilisé pour imiter l'utilisation du navigateur et il a options pour utiliser Firefox, Chrome, Edge ou Safari webdrivers (il ouvre réellement Chrome et fait votre recherche), mais c'est ennuyeux parce que vous ne voulez pas vraiment voir le navigateur. Mais il existe une solution pour cela, vous pouvez utiliser PhantomJS. Télécharger à partir de here. Extrait et voir comment l'utiliser dans l'exemple ci-dessous (j'ai écrit une classe simple que vous pouvez utiliser, vous avez juste besoin de changer le chemin vers PhantomJS):

import time 
from urllib.parse import quote_plus 
from selenium import webdriver 


class Browser: 

    def __init__(self, path, initiate=True, implicit_wait_time = 10, explicit_wait_time = 2): 
     self.path = path 
     self.implicit_wait_time = implicit_wait_time # http://www.aptuz.com/blog/selenium-implicit-vs-explicit-waits/ 
     self.explicit_wait_time = explicit_wait_time # http://www.aptuz.com/blog/selenium-implicit-vs-explicit-waits/ 
     if initiate: 
      self.start() 
     return 

    def start(self): 
     self.driver = webdriver.PhantomJS(path) 
     self.driver.implicitly_wait(self.implicit_wait_time) 
     return 

    def end(self): 
     self.driver.quit() 
     return 

    def go_to_url(self, url, wait_time = None): 
     if wait_time is None: 
      wait_time = self.explicit_wait_time 
     self.driver.get(url) 
     print('[*] Fetching results from: {}'.format(url)) 
     time.sleep(wait_time) 
     return 

    def get_search_url(self, query, page_num=0, per_page=10, lang='en'): 
     query = quote_plus(query) 
     url = 'https://www.google.hr/search?q={}&num={}&start={}&nl={}'.format(query, per_page, page_num*per_page, lang) 
     return url 

    def scrape(self): 
     #xpath migth change in future 
     links = self.driver.find_elements_by_xpath("//h3[@class='r']/a[@href]") # searches for all links insede h3 tags with class "r" 
     results = [] 
     for link in links: 
      d = {'url': link.get_attribute('href'), 
       'title': link.text} 
      results.append(d) 
     return results 

    def search(self, query, page_num=0, per_page=10, lang='en', wait_time = None): 
     if wait_time is None: 
      wait_time = self.explicit_wait_time 
     url = self.get_search_url(query, page_num, per_page, lang) 
     self.go_to_url(url, wait_time) 
     results = self.scrape() 
     return results 




path = '<YOUR PATH TO PHANTOMJS>/phantomjs-2.1.1-windows/bin/phantomjs.exe' ## SET YOU PATH TO phantomjs 
br = Browser(path) 
results = br.search('Python') 
for r in results: 
    print(r) 

br.end()