网页使用BeautifulSoup搜索Google搜索结果

时间:2015-08-28 14:52:26

标签: python web-scraping beautifulsoup information-retrieval

我的目标是使用BeautifulSoup网页搜索Google搜索结果。我正在使用Anaconda Python并使用Ipython作为IDE控制台。为什么在运行以下命令时没有得到ouptput?

def google_scrape(query):
    address = "http://www.google.com/search?q=%s&num=100&hl=en&start=0" % (urllib.quote_plus(query))
    request = urllib2.Request(address, None, {'User-Agent':'Mosilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11'})
    urlfile = urllib2.urlopen(request)
    page = urlfile.read()
    soup = BeautifulSoup(page)

    linkdictionary = {}

    for li in soup.findAll('li', attrs={'class':'g'}):
        sLink = li.find('a')
        print sLink['href']
        sSpan = li.find('span', attrs={'class':'st'})
        print sSpan

    return linkdictionary

if __name__ == '__main__':
    links = google_scrape('english')

2 个答案:

答案 0 :(得分:0)

您永远不会向linkedDictionary

添加任何内容
def google_scrape(query):
    address = "http://www.google.com/search?q=%s&num=100&hl=en&start=0" % (urllib.quote_plus(query))
    request = urllib2.Request(address, None, {'User-Agent':'Mosilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11'})
    urlfile = urllib2.urlopen(request)
    page = urlfile.read()
    soup = BeautifulSoup(page)

    linkdictionary = {}

    for li in soup.findAll('li', attrs={'class':'g'}):
        sLink = li.find('a')
        sSpan = li.find('span', attrs={'class':'st'})

        linkeDictionary['href'] = sLink['href']
        linkedDictionary['sSpan'] = sSpan

    return linkdictionary

if __name__ == '__main__':
    links = google_scrape('english')

答案 1 :(得分:0)

Cody Bouche 提到的问题是没有向 dict() 添加任何内容。 在我看来,如果您没有将 {}(dict) 更改为 [](array),您将很难更新您的 dict。

附加到数组要简单得多(注意:我在这里可能是错的,这只是以前经验的个人意见)。

要使其以简单的方式工作,您需要将 dict 更改为 array {} --> [],然后使用 .append({}) 附加到 { {1}}

online IDE 中的代码和示例:

list()

如果您仍然想附加到 def google_scrape(query): html = requests.get(f'https://www.google.com/search?q={query}', headers=headers).text soup = BeautifulSoup(html, 'lxml') data = [] for container in soup.findAll('div', class_='tF2Cxc'): title = container.select_one('.DKV0Md').text link = container.find('a')['href'] data.append({ 'title': title, 'link': link, }) print(f'{title}\n{link}') print(json.dumps(data, indent=2)) google_scrape('english') # part of the outputs: ''' English language - Wikipedia https://en.wikipedia.org/wiki/English_language [ { "title": "English language - Wikipedia", "link": "https://en.wikipedia.org/wiki/English_language" }, ] ''' ,那么这是解决此问题的方法之一(仅显示 for 循环的一部分):

dict()

要立即获得 dict 输出,您可以使用来自 SerpApi 的 Google Search Engine Results API 做同样的事情。这是一个付费 API,可免费试用 5,000 次搜索。

本质上,它和上面的代码做同样的事情,但你不需要弄清楚如何做某些事情或试图了解如何抓取某些元素,它已经为最终用户完成了 {{ 1}} 输出,因此唯一需要做的就是迭代 for container in soup.findAll('div', class_='tF2Cxc'): data_dict = {} title = container.select_one('.DKV0Md').text link = container.find('a')['href'] # creates title key and assigns title value data_dict['title'] = title # creates link key and assigns link value data_dict['link'] = link print(json.dumps(data_dict, indent = 2)) # part of the output: ''' { "title": "Minecraft Official Site | Minecraft", "link": "https://www.minecraft.net/en-us/" } ''' 并获得所需的输出。

要集成的代码:

JSON
<块引用>

免责声明,我为 SerpApi 工作。