私は少し前に Python を使って検索エンジンの結果をクロールする方法を研究していましたが、その実装過程で遭遇したすべての問題を記録しました。将来同じ問題に遭遇する人たちに役立つことを願っています。もう寄り道はしません。
1. 検索エンジンの選択
適切な検索エンジンを選択すると、より正確な検索結果が得られます。私が使用した検索エンジンは、Google、Bing、Baidu、Yahoo! の 4 つです。 プログラマーとして、Google が私の第一選択です。しかし、お気に入りの Google から返ってきたのは大量の JS コードだけで、望んでいた検索結果はまったくありませんでした。そこで、Bing キャンプに切り替えました。しばらく使ってみたところ、Bing から返される検索結果は私の問題にとって理想的ではないことがわかりました。絶望しそうになったとき、Google が私を救ってくれました。ブラウザでの js の使用を禁止しているユーザーに対処するために、Google は次の検索 URL を参照してください:
https://www.google.com.hk/search ?hl=ja&q=hello
hlは検索する言語を指定し、qは検索したいキーワードを指定します。 Google のおかげで、検索結果ページにはクロールしたいコンテンツが含まれています。
PS: Python を使用して Google 検索結果をクロールするインターネット上の多くのメソッドは、 https://ajax.googleapis.com/ajax/services/search/web... です。この方法は Google によって推奨されていないことに注意してください。https://developers.google.com/web-search/docs/ を参照してください。 Google は現在、カスタム検索 API を提供していますが、この API は 1 日あたり 100 リクエストに制限されており、それ以上必要な場合は料金を支払う必要があります。
2. Python は Web ページをクロールして分析します
Python を使用して Web ページをクロールすると非常に便利です。コードを参照してください:
def search(self, queryStr): queryStr = urllib2.quote(queryStr) url = 'https://www.google.com.hk/search?hl=en&q=%s' % queryStr request = urllib2.Request(url) response = urllib2.urlopen(request) html = response.read() results = self.extractSearchResults(html)
6 行目の html は検索結果ページのソース コードです。私たちは這いました。 Python を使用したことのある学生は、Python が urllib と urllib2 という 2 つのモジュールを提供していることに気づくでしょう。どちらも URL リクエストに関連していますが、urllib は URL を受け取ることしかできず、urllib2 は Request クラスのインスタンスを受け入れることができます。 URL リクエストのヘッダーを設定します。これは、ユーザー エージェントなどを偽装できることを意味します (以下で使用します)。
Python を使用して Web ページをクロールして保存できるようになったので、ソース コード ページから必要な検索結果を抽出できます。 Python には htmlparser モジュールが用意されていますが、使用するのは比較的面倒です。ここでは、非常に便利な Web ページ分析パッケージである BeautifulSoup を推奨します。BeautifulSoup の使い方については、裁判官の Web サイトに詳しく説明されているので、ここでは詳しく説明しません。
上記のコードを使用すると、少数のクエリには比較的問題ありませんが、数千のクエリを実行する場合、Google がマシンを使用すると、上記の方法は効果的ではなくなります。頻繁にクロールして Google の検索結果を取得します。すぐに Google があなたの IP をブロックし、503 エラー ページを返します。これは私たちが望む結果ではないので、引き続き探索する必要があります
前述したように、urllib2 を使用すると、URL リクエストのヘッダーを設定し、ユーザー エージェントを偽装できます。簡単に言えば、ユーザー エージェントは、クライアント ブラウザーなどのアプリケーションによって使用される特別なネットワーク プロトコルであり、ブラウザー (電子メール クライアント/検索エンジン スパイダー) が HTTP リクエストを行うたびにサーバーに送信され、サーバーはユーザーを認識します。 (メールクライアント/検索エンジンスパイダー)を利用してアクセスします。 場合によっては、いくつかの目的を達成するために、サーバーを誠実に欺き、あなたへのアクセスにマシンを使用していないことをサーバーに伝える必要があります。
したがって、私たちのコードは次のようになります:
user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0', \ 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0', \ 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ \ (KHTML, like Gecko) Element Browser 5.0', \ 'IBM WebExplorer /v0.94', 'Galaxy/1.0 [en] (Mac OS X 10.5.6; U; en)', \ 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)', \ 'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14', \ 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) \ Version/6.0 Mobile/10A5355d Safari/8536.25', \ 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \ Chrome/28.0.1468.0 Safari/537.36', \ 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld)'] def search(self, queryStr): queryStr = urllib2.quote(queryStr) url = 'https://www.google.com.hk/search?hl=en&q=%s' % queryStr request = urllib2.Request(url) index = random.randint(0, 9) user_agent = user_agents[index] request.add_header('User-agent', user_agent) response = urllib2.urlopen(request) html = response.read() results = self.extractSearchResults(html)
user_agents リストを怖がらないでください。実際には 10 個のユーザー エージェント文字列です。これにより、さらに多くのユーザー エージェントが必要な場合は、を参照してください。ここにUserAgentString。
行 17 ~ 19 は、ユーザー エージェント文字列をランダムに選択し、リクエストの add_header メソッドを使用してユーザー エージェントを偽装することを示しています。
ユーザーエージェントを偽装することで、検索エンジンの結果をクロールし続けることができます。これが機能しない場合は、2 つのクエリごとに一定期間ランダムにスリープすることをお勧めします。これはクロール速度に影響しますが、これにより可能になります。結果をより継続的に取得するには、複数の IP がある場合、クロール速度も向上します。