Google 使用 Python 搜索网页抓取
Google Search Web Scraping with Python
我最近学习了很多 python 来处理工作中的一些项目。
目前我需要对 google 搜索结果进行一些网络扫描aping。我找到了几个演示如何使用 ajax google api 进行搜索的站点,但是在尝试使用它之后,它似乎不再受支持。有什么建议么?
我一直在寻找一种方法,但似乎找不到任何目前有效的解决方案。
您始终可以直接抓取 Google 结果。为此,您可以使用 URL https://google.com/search?q=<Query>
这将 return 排名前 10 的搜索结果。
然后你可以使用lxml来解析页面。根据您使用的内容,您可以通过 CSS-Selector (.r a
) 或使用 XPath-Selector (//h3[@class="r"]/a
)
查询生成的节点树
在某些情况下,结果 URL 将重定向到 Google。通常它包含一个查询参数 q
,它将包含实际请求 URL。
使用 lxml 和请求的示例代码:
from urllib.parse import urlencode, urlparse, parse_qs
from lxml.html import fromstring
from requests import get
raw = get("https://www.google.com/search?q=Whosebug").text
page = fromstring(raw)
for result in page.cssselect(".r a"):
url = result.get("href")
if url.startswith("/url?"):
url = parse_qs(urlparse(url).query)['q']
print(url[0])
A note on google banning your IP: In my experience, google only bans
if you start spamming google with search requests. It will respond
with a 503 if Google thinks you are bot.
您还可以使用第三方服务,例如 Serp API - 我写了 运行 这个工具 - 这是付费的 Google 搜索引擎结果 API。解决了被屏蔽的问题,不用租代理,自己解析结果。
很容易与Python集成:
from lib.google_search_results import GoogleSearchResults
params = {
"q" : "Coffee",
"location" : "Austin, Texas, United States",
"hl" : "en",
"gl" : "us",
"google_domain" : "google.com",
"api_key" : "demo",
}
query = GoogleSearchResults(params)
dictionary_results = query.get_dictionary()
GitHub: https://github.com/serpapi/google-search-results-python
这是另一个可用于抓取 SERP 的服务 (https://zenserp.com),它不需要客户端并且更便宜。
这是一个 python 代码示例:
import requests
headers = {
'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)
你有2个选项。自己构建或使用 SERP API.
SERP API 将 return Google 搜索结果作为格式化的 JSON 响应。
我会推荐一个 SERP API,因为它更容易使用,而且你不必担心被 Google 阻止。
1. SERP API
我对 scraperbox serp api 有很好的经验。
您可以使用以下代码调用API。确保将 YOUR_API_TOKEN
替换为您的 scraperbox API 令牌。
import urllib.parse
import urllib.request
import ssl
import json
ssl._create_default_https_context = ssl._create_unverified_context
# Urlencode the query string
q = urllib.parse.quote_plus("Where can I get the best coffee")
# Create the query URL.
query = "https://api.scraperbox.com/google"
query += "?token=%s" % "YOUR_API_TOKEN"
query += "&q=%s" % q
query += "&proxy_location=gb"
# Call the API.
request = urllib.request.Request(query)
raw_response = urllib.request.urlopen(request).read()
raw_json = raw_response.decode("utf-8")
response = json.loads(raw_json)
# Print the first result title
print(response["organic_results"][0]["title"])
2。构建您自己的 Python 抓取工具
我最近在 how to scrape search results with Python 上写了一篇 in-depth 博客 post。
这里是一个简短的总结。
首先你应该得到 Google 搜索结果页面的 HTML 内容。
import urllib.request
url = 'https://google.com/search?q=Where+can+I+get+the+best+coffee'
# Perform the request
request = urllib.request.Request(url)
# Set a normal User Agent header, otherwise Google will block the request.
request.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36')
raw_response = urllib.request.urlopen(request).read()
# Read the repsonse as a utf-8 string
html = raw_response.decode("utf-8")
然后您可以使用BeautifulSoup提取搜索结果。
比如下面的代码会得到所有的标题。
from bs4 import BeautifulSoup
# The code to get the html contents here.
soup = BeautifulSoup(html, 'html.parser')
# Find all the search result divs
divs = soup.select("#search div.g")
for div in divs:
# Search for a h3 tag
results = div.select("h3")
# Check if we have found a result
if (len(results) >= 1):
# Print the title
h3 = results[0]
print(h3.get_text())
您可以扩展此代码以提取搜索结果网址和说明。
我最近学习了很多 python 来处理工作中的一些项目。
目前我需要对 google 搜索结果进行一些网络扫描aping。我找到了几个演示如何使用 ajax google api 进行搜索的站点,但是在尝试使用它之后,它似乎不再受支持。有什么建议么?
我一直在寻找一种方法,但似乎找不到任何目前有效的解决方案。
您始终可以直接抓取 Google 结果。为此,您可以使用 URL https://google.com/search?q=<Query>
这将 return 排名前 10 的搜索结果。
然后你可以使用lxml来解析页面。根据您使用的内容,您可以通过 CSS-Selector (.r a
) 或使用 XPath-Selector (//h3[@class="r"]/a
)
在某些情况下,结果 URL 将重定向到 Google。通常它包含一个查询参数 q
,它将包含实际请求 URL。
使用 lxml 和请求的示例代码:
from urllib.parse import urlencode, urlparse, parse_qs
from lxml.html import fromstring
from requests import get
raw = get("https://www.google.com/search?q=Whosebug").text
page = fromstring(raw)
for result in page.cssselect(".r a"):
url = result.get("href")
if url.startswith("/url?"):
url = parse_qs(urlparse(url).query)['q']
print(url[0])
A note on google banning your IP: In my experience, google only bans if you start spamming google with search requests. It will respond with a 503 if Google thinks you are bot.
您还可以使用第三方服务,例如 Serp API - 我写了 运行 这个工具 - 这是付费的 Google 搜索引擎结果 API。解决了被屏蔽的问题,不用租代理,自己解析结果。
很容易与Python集成:
from lib.google_search_results import GoogleSearchResults
params = {
"q" : "Coffee",
"location" : "Austin, Texas, United States",
"hl" : "en",
"gl" : "us",
"google_domain" : "google.com",
"api_key" : "demo",
}
query = GoogleSearchResults(params)
dictionary_results = query.get_dictionary()
GitHub: https://github.com/serpapi/google-search-results-python
这是另一个可用于抓取 SERP 的服务 (https://zenserp.com),它不需要客户端并且更便宜。
这是一个 python 代码示例:
import requests
headers = {
'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)
你有2个选项。自己构建或使用 SERP API.
SERP API 将 return Google 搜索结果作为格式化的 JSON 响应。
我会推荐一个 SERP API,因为它更容易使用,而且你不必担心被 Google 阻止。
1. SERP API
我对 scraperbox serp api 有很好的经验。
您可以使用以下代码调用API。确保将 YOUR_API_TOKEN
替换为您的 scraperbox API 令牌。
import urllib.parse
import urllib.request
import ssl
import json
ssl._create_default_https_context = ssl._create_unverified_context
# Urlencode the query string
q = urllib.parse.quote_plus("Where can I get the best coffee")
# Create the query URL.
query = "https://api.scraperbox.com/google"
query += "?token=%s" % "YOUR_API_TOKEN"
query += "&q=%s" % q
query += "&proxy_location=gb"
# Call the API.
request = urllib.request.Request(query)
raw_response = urllib.request.urlopen(request).read()
raw_json = raw_response.decode("utf-8")
response = json.loads(raw_json)
# Print the first result title
print(response["organic_results"][0]["title"])
2。构建您自己的 Python 抓取工具
我最近在 how to scrape search results with Python 上写了一篇 in-depth 博客 post。
这里是一个简短的总结。
首先你应该得到 Google 搜索结果页面的 HTML 内容。
import urllib.request
url = 'https://google.com/search?q=Where+can+I+get+the+best+coffee'
# Perform the request
request = urllib.request.Request(url)
# Set a normal User Agent header, otherwise Google will block the request.
request.add_header('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36')
raw_response = urllib.request.urlopen(request).read()
# Read the repsonse as a utf-8 string
html = raw_response.decode("utf-8")
然后您可以使用BeautifulSoup提取搜索结果。 比如下面的代码会得到所有的标题。
from bs4 import BeautifulSoup
# The code to get the html contents here.
soup = BeautifulSoup(html, 'html.parser')
# Find all the search result divs
divs = soup.select("#search div.g")
for div in divs:
# Search for a h3 tag
results = div.select("h3")
# Check if we have found a result
if (len(results) >= 1):
# Print the title
h3 = results[0]
print(h3.get_text())
您可以扩展此代码以提取搜索结果网址和说明。