代码之家  ›  专栏  ›  技术社区  ›  maurobio

用urllib2而不是请求抓取谷歌学者

  •  0
  • maurobio  · 技术社区  · 7 年前

    我有一个简单的脚本,下面的脚本可以很好地从谷歌学者那里获取一个搜索感兴趣术语的文章列表。

    import urllib
    import urllib2
    import requests
    from bs4 import BeautifulSoup
    
    SEARCH_SCHOLAR_HOST = "https://scholar.google.com"
    SEARCH_SCHOLAR_URL = "/scholar"
    
    def searchScholar(searchStr, limit=10):
        """Search Google Scholar for articles and publications containing terms of interest"""
        url = SEARCH_SCHOLAR_HOST + SEARCH_SCHOLAR_URL + "?q=" + urllib.quote_plus(searchStr) + "&ie=UTF-8&oe=UTF-8&hl=en&btnG=Search"
        content = requests.get(url, verify=False).text
        page = BeautifulSoup(content, 'lxml')
        results = {}
        count = 0
        for entry in page.find_all("h3", attrs={"class": "gs_rt"}):
            if count < limit:
                try:
                    text = entry.a.text.encode("ascii", "ignore")
                    url = entry.a['href']
                    results[url] = text 
                    count += 1
                except:
                    pass
        return results
    
    queryStr = "Albert einstein"
    pubs = searchScholar(queryStr, 10)
    if len(pubs) == 0:
        print "No articles found"
    else:   
        for pub in pubs.keys():
            print pub + ' ' + pubs[pub]
    

    但是,我想在远程服务器上以CGI应用程序的形式运行这个脚本,而不需要访问控制台,因此我不能安装任何外部的python模块。(我通过将bs4目录复制到我的cgi-bin目录,成功地“安装”了漂亮的soup,而没有使用pip或easy-install,但是由于它有大量的依赖关系,这个技巧不适用于请求。)

    所以,我的问题是:是否可以使用内置的urlib2或httplib python模块,而不是请求获取google学者页面,然后将其传递给beautifulsoup?应该是,因为我发现了一些代码 here 这使得google学者只能使用标准的图书馆加上漂亮的汤,但它相当复杂。我更希望得到一个更简单的解决方案,只是调整我的脚本以使用标准库而不是请求。

    有人能帮我吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   SimonF    7 年前

    此代码足以使用 urllib2 :

    def get(url):
        req = urllib2.Request(url)
        req.add_header('User-Agent', 'Mozilla/2.0 (compatible; MSIE 5.5; Windows NT)')
        return urllib2.urlopen(req).read()
    

    如果您将来需要做一些更高级的事情,它将是更多的代码。请求所做的是简化标准libs的使用。

    推荐文章