Python 学習 Web クローラーは主に、クローリング、分析、ストレージの3 つの主要なセクションに分かれています。
さらに、より一般的に使用されているクローラー フレームワーク Scrapy については、最後に詳しく紹介します。
まず、Web クローラーを使い始めるために必要な基本概念とスキルをカバーする、私がまとめた関連記事のリストを示します。 Ning Ge の Small Station - Web Crawler
ブラウザに URL を入力して Enter キーを押すと、バックグラウンドで何が起こっているのでしょうか?たとえば、http://www.lining0806.com/ と入力すると、寧兄弟の Web サイトのホームページが表示されます。
簡単に言えば、このプロセスは次の 4 つのステップで行われます。
Web クローラーが行うべきことは、簡単に言えば、ブラウザーの機能を実装することです。 URL を指定すると、ユーザーが必要とするデータが直接返されます。ブラウザを手動で操作して段階的に取得する必要はありません。
このステップでは、どのようなコンテンツを取得したいのかを明確にする必要がありますか? HTMLのソースコードなのか、Json形式の文字列なのかなど。
クロールのほとんどはgetリクエスト、つまり相手のサーバーから直接データを取得するケースです。
まず、Python には urllib と urllib2 という 2 つのモジュールが付属しており、基本的に一般的なページ クローリングに対応できます。また、requests も非常に便利なパッケージで、これと同様に httplib2 などがあります。
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
また、クエリ フィールドを含む URL の場合、get リクエストは通常、リクエストされたデータを URL に追加して URL を分割し、複数のパラメータを & で接続します。
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
関連資料: NetEase ニュース ランキング クロールのレビュー
参考プロジェクト: Web クローラーの中で最も基本的なクローラー: NetEase ニュース ランキングのクロール
2.1 フォームを使用してログインする
この状況はポストリクエストです。つまり、フォームデータが最初にサーバーに送信され、サーバーは返された Cookie をローカルに保存します。
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 Cookieを使用したログイン
Cookie を使用してログインすると、サーバーはあなたがログインしているユーザーであると認識し、ログインしたコンテンツを返します。したがって、検証コードが必要な場合は、検証コードを含むログイン Cookie を使用して問題を解決できます。
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
検証コードがある場合、現時点では、response = request_session.post(url=url_login, data=data) を使用することはできません。メソッドは次のようになります。
response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
関連資料: Web クローラー検証コード・ログイン
参照プロジェクト: Web クローラーのユーザー名、パスワード、および検証コードのログイン: Zhihu Web サイトのクローリング
3.1 プロキシの使用
該当する状況: IP アドレスを制限すると、「頻繁なクリック」によってログインに確認コードの入力が必要になる問題も解決できます。
この場合、最善の方法はプロキシ IP プールを維持することです。インターネット上には無料のプロキシ IP が多数あり、スクリーニングによって使用できるものを見つけることができます。 「頻繁なクリック」については、クローラーが Web サイトを訪問する頻度を制限することで、Web サイトからのアクセス禁止を回避することもできます。
proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
Urllib2:
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
3.2 時刻設定
該当する状況: 周波数が制限されている状況。
Requests と Urllib2 の両方で、時間ライブラリの sleep() 関数を使用できます。
import time
time.sleep(1)
3.3 ブラウザを偽装する、または「アンチホットリンク」と戦う
一部の Web サイトでは、実際にブラウザーを介してアクセスしているか、それとも機械によって自動的にアクセスされているかを確認します。この場合、User-Agent を加えて、ブラウザ経由でアクセスしていることを示します。場合によっては、リファラー情報が含まれているかどうか、およびリファラーが合法であるかどうか (通常はリファラーに加えて) もチェックされます。
headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
Urllib2:
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
あまり言うことはありません。
def multi_session(session, *arg):
retryTimes = 20
while retryTimes>0:
try:
return session.post(*arg)
except:
print '.',
retryTimes -= 1
または
def multi_open(opener, *arg):
retryTimes = 20
while retryTimes>0:
try:
return opener.open(*arg)
except:
print '.',
retryTimes -= 1
このようにして、multi_session または multi_open を使用して、クローラーによってキャプチャされたセッションまたはオープナーを維持できます。
これは、ウォール街ニュースの並列クロールの実験的な比較です: Python マルチプロセス クロールと Java シングルスレッドおよびマルチスレッド クロール
関連資料: Python と Java におけるマルチプロセスおよびマルチスレッドのコンピューティング手法の比較
「さらに読み込み」の場合は、Ajax を使用して大量のデータを転送します。
その仕組みは、Web ページの URL から Web ページのソース コードをロードした後、JavaScript プログラムがブラウザで実行されます。これらのプログラムは、より多くのコンテンツを読み込み、Web ページに「追加」します。 Web ページ自体の URL を直接クロールしても、ページの実際のコンテンツが見つからないのはこのためです。
ここで、Google Chrome を使用して「リクエスト」に対応するリンクを分析すると (方法: 右クリック → 要素の検査 → ネットワーク → クリアし、「さらに読み込む」をクリックすると、対応する GET リンクが表示され、テキストのタイプを探します/ html、クリックしてパラメータを取得またはリクエストURLをコピー)を表示し、ループ処理を行います。
Selenium は自動テスト ツールです。文字の塗りつぶし、マウスのクリック、要素の取得、ページの切り替えと一連の操作を含むブラウザを制御できます。つまり、Selenium はブラウザでできることはすべて実行できます。
ここにリストされているのは、Selenium を使用して、指定された都市リストの後に Qunar.com から運賃情報を動的に取得するコードです。
参照プロジェクト: Web クローラー Selenium はプロキシ ログインを使用します: Crawl Qunar Web サイト
Web サイトに確認コードがある場合、次の 3 つの方法があります。
プロキシの使用と Cookie を使用したログインについては以前に説明しました。次に、確認コードの識別について説明します。
オープン ソースの Tesseract-OCR システムを使用して、検証コード イメージをダウンロードして認識し、認識された文字をクローラー システムに転送してシミュレートされたログインを行うことができます。もちろん、識別のために検証コード画像をコーディング プラットフォームにアップロードすることもできます。失敗した場合は、成功するまで確認コード ID を再度更新できます。
参考プロジェクト:認証コード識別プロジェクト バージョン1:Captcha1
クロール時に注意する必要がある問題が 2 つあります。
クロール後、クロールされたコンテンツが分析され、必要なコンテンツから関連するコンテンツを抽出できます。
一般的な分析ツールには、正規表現、BeautifulSoup、lxml などが含まれます。
必要なものを分析したら、次のステップはそれを保存することです。
テキスト ファイル、MySQL、MongoDB データベースなどに保存することを選択できます。
保管する際には次の 2 つの点に注意する必要があります。
Scrapy は、業界で広く使用されている Twisted をベースにしたオープンソースの Python クローラー フレームワークです。
関連コンテンツについては、Scrapy に基づく Web クローラーの構築を参照することができます。同時に、この記事で紹介されている WeChat 検索クローリング プロジェクトのコードも学習の参考として提供されます。
参照プロジェクト: Scrapy または Requests を使用して WeChat 検索結果を再帰的にクロールする
優れた Web クローラーは、まずロボット プロトコルに準拠する必要があります。ロボット プロトコル (クローラー プロトコル、ロボット プロトコルなどとも呼ばれます) の正式名は、「ロボット排除プロトコル」です。Web サイトはロボット プロトコルを使用して、どのページがクロール可能でどのページがクロールできないかを検索エンジンに伝えます。
robots.txt テキスト ファイル (https://www.taabao.com/robots.txt など) を Web サイトのルート ディレクトリに配置し、さまざまな Web クローラーがアクセスできるページとアクセスできるページを指定できます。指定されたページは、式の表現によって決定されます。 Web クローラーはこの Web サイトを収集する前に、まず robots.txt テキスト ファイルを取得し、そのファイル内のルールを解析し、ルールに従って Web サイト データを収集します。
User-agent: 指定对哪些爬虫生效
Disallow: 指定不允许访问的网址
Allow: 指定允许访问的网址
注: 英語の単語は大文字にする必要があります。コロンの後には Web サイト全体を表します。
禁止所有机器人访问
User-agent: *
Disallow: /
允许所有机器人访问
User-agent: *
Disallow:
禁止特定机器人访问
User-agent: BadBot
Disallow: /
允许特定机器人访问
User-agent: GoodBot
Disallow:
禁止访问特定目录
User-agent: *
Disallow: /images/
仅允许访问特定目录
User-agent: *
Allow: /images/
Disallow: /
禁止访问特定文件
User-agent: *
Disallow: /*.html$
仅允许访问特定文件
User-agent: *
Allow: /*.html$
Disallow: /