使用Python抓取和解析Google搜索结果
我问了一个关于实现抓取和保存网页的一般想法的问题。 原始问题的一部分是:如何从互联网上抓取和保存大量“关于”的页面 通过进一步的研究,我得到了一些关于抓取和解析的选择(列在底部) 今天,我遇到了另一个关于如何从谷歌搜索结果中获取信息的问题。这为我的问题提供了一个很好的替代方案,可以节省爬行部分的所有工作 新的问题是:在Python中,要抓取给定关键字的谷歌搜索结果,在本例中为“About”,最后获取链接以进行进一步解析。 方法和库的最佳选择是什么?(以易于学习和易于实施为衡量标准) p、 在美国,同样的事情也被实施了,但是关闭了,并要求更多的结果。如果没有开源软件,我宁愿自己动手,同时学习更多Python 哦,顺便说一句,如果有的话,建议解析搜索结果中的链接会很好。尽管如此,它还是易于学习和实施。刚开始学习PythonP使用Python抓取和解析Google搜索结果,python,screen-scraping,web-scraping,google-search-api,Python,Screen Scraping,Web Scraping,Google Search Api,我问了一个关于实现抓取和保存网页的一般想法的问题。 原始问题的一部分是:如何从互联网上抓取和保存大量“关于”的页面 通过进一步的研究,我得到了一些关于抓取和解析的选择(列在底部) 今天,我遇到了另一个关于如何从谷歌搜索结果中获取信息的问题。这为我的问题提供了一个很好的替代方案,可以节省爬行部分的所有工作 新的问题是:在Python中,要抓取给定关键字的谷歌搜索结果,在本例中为“About”,最后获取链接以进行进一步解析。 方法和库的最佳选择是什么?(以易于学习和易于实施为衡量标准) 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的最新版本在默认情况下已经不起作用了。该工具主页上的这两个回复()给出了一个解决方案,目前仍在使用此调整。但也许有一天,由于谷歌的改变/封锁,它可能会再次停止工作
迄今已知的资源:
- 对于抓取,这似乎是一个流行的选择,一个名为的webapp非常有趣,并且有一个extract-it库供离线/本地使用。在不同的讨论中也被多次提到
- 对于解析HTML,似乎是最重要的 受欢迎的选择。当然也是
- 您可能会发现。。。您似乎要求的大部分内容都在那里…有一个用于模拟浏览器的库。我使用它时,有必要登录谷歌电子邮件帐户。虽然它是一个很好的工具,有一个很好的想法,但它很旧,现在似乎缺乏支持(最新版本于2007年发布)。
如果您想要检索需要cookie处理或身份验证的结果,那么它可能很有用。因此,
twill
可能是最佳选择之一。
顺便说一句,它基于mechanize
至于解析,你是对的,
BeautifulSoup
和Scrapy
都很棒。BeautifulSoup
背后的一个很酷的东西是它可以处理无效的HTML(例如,与之不同)。看看这个很棒的web抓取URL库包装器
这应该很方便…有关更多信息,请访问-
这一款适合目前使用。如果进行了任何搜索,刮板可以通过浏览几页来获取该搜索的100个项目。我试图使用函数完美地完成代码,但ipv4问题出现了,页面被重定向到带有captcha的页面。仍然不明白为什么这个可以工作,但如果它被包装在函数中,那么它就不再工作了。顺便说一句,刮板看起来有点笨拙,因为我在刮板中使用了两次相同的for循环,所以它不能跳过第一页的内容
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)
使用Python抓取Google搜索结果的另一个选项是one by 我喜欢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)
下面是一个Python脚本,它使用
请求
和美化组
来抓取Google结果
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)
要从谷歌搜索结果的多个页面中提取链接,您可以使用。这是一个免费试用的付费API
导入操作系统
#Python包:https://pypi.org/project/google-search-results
从serpapi导入谷歌搜索
参数={
“引擎”:“谷歌”,
“q”:“关于”,
“api_键”:os.getenv(“api_键”),
}
搜索=谷歌搜索(参数)
pages=search.pagination()
对于结果页:
打印(f“当前页面:{result['serpapi_pagination']['Current']}\n”)
对于结果中的有机结果[“有机结果”]:
印刷品(
f“标题:{organic_结果['Title']}\n链接:{organic_结果['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工作。你走的是对的,但是如果谷歌阻止你,或者如果你太咄咄逼人,开始抛出CAPTCHA,不要感到惊讶。@jathanism哦。。是 啊正确的。。我已经考虑过了。谢谢你的提示。希望我能在被谷歌抓到之前得到我的结果。你为什么不使用谷歌的真实数据呢?@DanielRoseman,不错的一个。现在我来看看。它只打印了2页的搜索结果,而谷歌的搜索结果显示超过数千页。不管怎样,我能把所有的url都抓取到底吗?仔细看,似乎正是我要找的东西。这是谷歌首次推出“谷歌刮python”。仅搜索stackoverflow和pypi…仅支付有限的免费访问
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/
...