我问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()
注意(以下由Mike Pennington回答): 由于谷歌搜索结果可能发生变化,因此它的Github的最新版本在默认情况下不起作用。工具主页上的这两个回复(a b)提供了一个解决方案,目前仍在使用此调整。但也许有一天,由于谷歌的改变/阻止,它可能会再次停止工作。
目前已知的资源:
对于抓取,Scrapy似乎是一个受欢迎的选择,名为ScraperWiki的网络应用程序非常有趣,并且another project提取它的库供离线/本地使用。 Mechanize在不同的讨论中也被提了好几次。
对于解析HTML,BeautifulSoup似乎是其中之一 流行的选择。当然。 lxml也是。{/ p>
答案 0 :(得分:11)
您可能会发现xgoogle很有用......您似乎要求的很多内容都是......
答案 1 :(得分:1)
有一个用于模拟浏览器的twill库。我有必要使用谷歌电子邮件帐户登录时使用它。虽然它是一个很棒的工具,但它很老,现在似乎缺乏支持(最新版本于2007年发布)。
如果要检索需要cookie处理或身份验证的结果,这可能很有用。可能twill
是用于此目的的最佳选择之一。
顺便说一下,它基于mechanize
。
至于解析,你是对的,BeautifulSoup
和Scrapy
都很棒。 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)
这是一个使用requests
和BeautifulSoup
抓取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。
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 工作。