使用Python刮取和解析Google搜索结果

时间:2011-10-12 21:28:46

标签: python screen-scraping web-scraping google-search-api

我问question实现抓取和保存网页的一般想法。 原始问题的一部分是:如何从Internet抓取并保存大量“关于”页面。

通过一些进一步的研究,我有一些选择可以继续进行刮擦和解析(在下面列出)。

今天,我遇到了另一个关于如何从Google搜索结果中删除的Ruby discussion。这为我的问题提供了一个很好的选择,可以节省爬行部分的所有工作量。

新的问题是:在Python中,抓取给定关键字的Google搜索结果,在本例中为“关于”,最后获取进一步解析的链接。 有哪些方法和库的最佳选择? (以易于学习和易于实施的方式衡量)。

P.S。在this website中,完全相同的事情已实施,但已关闭并要求获得更多结果的资金。如果没有可用的开源资源,我宁愿自己做,并且同时学习更多的Python。

哦,顺便说一句,从搜索结果中解析链接的建议会很好,如果有的话。仍然,易于学习和易于实施。刚开始学习Python。 :P


最终更新,问题解决了。使用xgoogle的代码,请阅读以下部分中的说明,以使xgoogle正常运行。

import time, random
from xgoogle.search import GoogleSearch, SearchError

f = open('a.txt','wb')

for i in range(0,2):
    wt = random.uniform(2, 5)
    gs = GoogleSearch("about")
    gs.results_per_page = 10
    gs.page = i
    results = gs.get_results()
    #Try not to annnoy Google, with a random short wait
    time.sleep(wt)
    print 'This is the %dth iteration and waited %f seconds' % (i, wt)
    for res in results:
        f.write(res.url.encode("utf8"))
        f.write("\n")

print "Done"
f.close()

xgoogle上的

注意(以下由Mike Pennington回答): 由于谷歌搜索结果可能发生变化,因此它的Github的最新版本在默认情况下不起作用。工具主页上的这两个回复(a b)提供了一个解决方案,目前仍在使用此调整。但也许有一天,由于谷歌的改变/阻止,它可能会再次停止工作。


目前已知的资源:

  • 对于抓取,Scrapy似乎是一个受欢迎的选择,名为ScraperWiki的网络应用程序非常有趣,并且another project提取它的库供离线/本地使用。 Mechanize在不同的讨论中也被提了好几次。

  • 对于解析HTML,BeautifulSoup似乎是其中之一 流行的选择。当然。 lxml也是。{/ p>

8 个答案:

答案 0 :(得分:11)

您可能会发现xgoogle很有用......您似乎要求的很多内容都是......

答案 1 :(得分:1)

有一个用于模拟浏览器的twill库。我有必要使用谷歌电子邮件帐户登录时使用它。虽然它是一个很棒的工具,但它很老,现在似乎缺乏支持(最新版本于2007年发布)。 如果要检索需要cookie处理或身份验证的结果,这可能很有用。可能twill是用于此目的的最佳选择之一。 顺便说一下,它基于mechanize

至于解析,你是对的,BeautifulSoupScrapy都很棒。 BeautifulSoup背后的一个很酷的事情是,它可以处理无效的HTML(例如,与Genshi不同。)

答案 2 :(得分:1)

看看这个用于网页抓取的真棒urllib包装https://github.com/mattseh/python-web/blob/master/web.py

答案 3 :(得分:1)

这一点适合这一刻。如果进行了任何搜索,则刮刀可以通过浏览多个页面来获取该搜索的100个项目。我尝试使用函数完美地完成代码但是ipv4问题出现了,页面被重定向到带有验证码的页面。仍然困惑为什么这个工作,但如果它包含在功能内,那么它不再工作了。顺便说一句,刮刀看起来有点尴尬,因为我在刮刀中使用了相同的两次循环,因此它不能跳过第一页的内容。

import requests ; from bs4 import BeautifulSoup

search_item = "excel"
base = "http://www.google.de"
url = "http://www.google.de/search?q="+ search_item

response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
for item in soup.select(".r a"):
    print(item.text)
for next_page in soup.select(".fl"):
    res = requests.get(base + next_page.get('href'))
    soup = BeautifulSoup(res.text,"lxml")
    for item in soup.select(".r a"):
        print(item.text)

答案 4 :(得分:1)

另一种使用Python抓取Google搜索结果的选项是ZenSERP

我喜欢易于使用的API优先方法,并且可以将JSON结果轻松集成到我们的解决方案中。

以下是curl请求的示例:

curl "https://app.zenserp.com/api/search" -F "q=Pied Piper" -F "location=United States" -F "search_engine=google.com" -F "language=English" -H "apikey: APIKEY"

响应:

{
  "q": "Pied Piper",
  "domain": "google.com",
  "location": "United States",
  "language": "English",
  "url": "https://www.google.com/search?q=Pied%20Piper&num=100&hl=en&gl=US&gws_rd=cr&ie=UTF-8&oe=UTF-8&uule=w+CAIQIFISCQs2MuSEtepUEUK33kOSuTsc",
  "total_results": 17100000,
  "auto_correct": "",
  "auto_correct_type": "",
  "results": []
}

例如Python代码:

import requests

headers = {
    'apikey': 'APIKEY',
}

params = (
    ('q', 'Pied Piper'),
    ('location', 'United States'),
    ('search_engine', 'google.com'),
    ('language', 'English'),
)

response = requests.get('https://app.zenserp.com/api/search', headers=headers, params=params)

答案 5 :(得分:0)

from urllib.request import urlopen
from bs4 import BeautifulSoup
import urllib.request
import re

import numpy as np
count=0
query=input("query>>")
query=query.strip().split()
query="+".join(query)

html = "https://www.google.co.in/search?site=&source=hp&q="+query+"&gws_rd=ssl"
req = urllib.request.Request(html, headers={'User-Agent': 'Mozilla/5.0'})

soup = BeautifulSoup(urlopen(req).read(),"html.parser")

#Regex
reg=re.compile(".*&sa=")

links = []
#Parsing web urls
for item in soup.find_all('h3', attrs={'class' : 'r'}):
    line = (reg.match(item.a['href'][7:]).group())
    links.append(line[:-4])

print(links)

这应该很方便....更多去 -   的 https://github.com/goyal15rajat/Crawl-google-search.git

答案 6 :(得分:0)

这是一个使用requestsBeautifulSoup抓取Google结果的Python脚本。

import urllib
import requests
from bs4 import BeautifulSoup

# desktop user-agent
USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0"
# mobile user-agent
MOBILE_USER_AGENT = "Mozilla/5.0 (Linux; Android 7.0; SM-G930V Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36"

query = "hackernoon How To Scrape Google With Python"
query = query.replace(' ', '+')
URL = f"https://google.com/search?q={query}"

headers = {"user-agent": USER_AGENT}
resp = requests.get(URL, headers=headers)

if resp.status_code == 200:
    soup = BeautifulSoup(resp.content, "html.parser")
    results = []
    for g in soup.find_all('div', class_='r'):
        anchors = g.find_all('a')
        if anchors:
            link = anchors[0]['href']
            title = g.find('h3').text
            item = {
                "title": title,
                "link": link
            }
            results.append(item)
    print(results)

如果您有兴趣,指南How To Scrape Google With Python会详细介绍该代码。 repo到代码。

答案 7 :(得分:0)

要从 Google 搜索结果的多个页面中提取链接,您可以使用 SerpApi。这是一个免费试用的付费 API。

Full example

import os

# Python package: https://pypi.org/project/google-search-results
from serpapi import GoogleSearch

params = {
    "engine": "google",
    "q": "about",
    "api_key": os.getenv("API_KEY"),
}

search = GoogleSearch(params)

pages = search.pagination()

for result in pages:
    print(f"Current page: {result['serpapi_pagination']['current']}\n")

    for organic_result in result["organic_results"]:
        print(
            f"Title: {organic_result['title']}\nLink: {organic_result['link']}\n"
        )

输出

Current page: 12
URL: https://fi.google.com/
URL: https://www.mayoclinic.org/about-mayo-clinic

...

Current page: 18
URL: https://igem.org/About
URL: https://www.ieee.org/
URL: https://www.cancer.org/

...

免责声明:我在 SerpApi 工作。