0

我想编写一个 python 脚本,在其中输入一个问题,作为答案,我从 google 自定义搜索 api 或 Bing 或任何其他搜索 api(任何一个)得到答复。我尝试使用谷歌自定义搜索 API,但它给了我这个脚本:

<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>

由于我没有使用任何 html 页面,只需要在 python 控制台中回答,我该怎么做?除了 API 调用之外,还有其他方法吗?

4

1 回答 1

0

要进行 google 搜索,有许多模块,例如googleGoogle-Search-API。但是如果你想做很多搜索并且有很多请求,谷歌会阻止你,你会得到错误 503。之前可以选择使用其他 API,但像 Bing 和 Yahoo,但它们都不再是免费的了。唯一可以进行互联网搜索的免费 API 是FAROO API。但是仍然有一种选择可以使用selenium webdriver进行谷歌搜索。Selenium 用于模拟浏览器的使用,它可以选择使用 Firefox、Chrome、Edge 或 Safari 网络驱动程序(它实际上会打开 Chrome 并进行搜索),但这很烦人,因为您实际上并不想看到浏览器。但是你可以使用这个解决方案幻影JS。从这里下载。提取出来看看下面的例子如何使用(我写了一个简单的类,你可以使用,你只需要改变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()
于 2017-08-28T13:57:47.393 回答