クロールしてWebページを保存する一般的なアイデアを実現するための 質問 を依頼しました。元の質問の一部は、インターネットから多くの「About」ページをクロールして保存する方法です。
さらに調査を重ねた結果、スクレイピングと解析の両方を進めるための選択肢がいくつかありました(下部にリストされています)。
今日、私は別の Rubyの議論 に出会い、Googleの検索結果からスクレイピングする方法について知りました。これは、クロール部分のすべての労力を節約する私の問題に対する優れた代替手段を提供します。
新しいquestionは、Pythonでは、scrapeGoogle検索結果特定のキーワード、この場合は「About」、最後にさらに解析するためのリンクを取得します。進むべき方法とライブラリの最良の選択は何ですか? (学習しやすく、実装しやすいという尺度で)。
追伸 このウェブサイト では、まったく同じものが実装されていますが、閉じられ、より多くの結果を得るためにお金を要求しています。オープンソースが利用できない場合は自分でやりたいと思いますが、その間はもっと詳しく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で) 。ツールのホームページにあるこれらの2つの応答( ab )は解決策を提供し、現在もこのTweakで動作しています。ただし、Googleの変更/ブロックにより、いつかは再び動作しなくなる可能性があります。
これまでに知られているリソース:
スクレイピングについては、 Scrapy が人気のある選択肢であるようで、 ScraperWiki と呼ばれるwebappは非常に興味深く、 別のプロジェクト オフライン/ローカルで使用するためにライブラリを抽出します。 Mechanize もさまざまな議論で何度も取り上げられました。
HTMLの解析では、 BeautifulSoup が最も一般的な選択肢の1つであるようです。もちろん。 lxml も。
xgoogle 役に立つかもしれません...あなたが求めていると思われるものの多くはそこにあります...
これはこの瞬間に有効です。検索が行われた場合、スクレーパーは複数のページを検索することにより、その検索の100アイテムを取得できます。関数を使用してコードを完璧に完了しようとしましたが、ipv4の問題が発生し、ページはcaptchaのあるページにリダイレクトされます。なぜこれが機能するのかまだ混乱していますが、関数内にラップされている場合、それはもう機能しません。ちなみに、スクレーパーは少し厄介に見えるので、スクレーパーで同じforループを2回使用したため、最初のページのコンテンツをスキップできません。
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検索結果を取得する別のオプションは、 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": []
}
A 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)
ブラウザをエミュレートするための twill libがあります。 Googleメールアカウントでログインする必要があるときに使用しました。それは素晴らしいアイデアを備えた素晴らしいツールですが、かなり古く、現在サポートが不足しているようです(最新バージョンは2007年にリリースされています)。 Cookieの処理または認証を必要とする結果を取得する場合に役立ちます。おそらく、twill
はその目的に最適な選択肢の1つです。ところで、それはmechanize
に基づいています。
解析に関しては、BeautifulSoup
とScrapy
は素晴らしいです。 BeautifulSoup
の背後にあるクールなことの1つは、無効なHTMLを処理できることです(たとえば、 Genshi とは異なります)。
Webスクレイピング用のこの素晴らしいurllibラッパーをご覧ください https://github.com/mattseh/python-web/blob/master/web.py
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