クローラーを使用してデータをクロールするタイミングを知っているかどうかはわかりません。独自のクロール防止メカニズムを備えたWebサイトが増えています。以前ほどデータをクロールするのは簡単ではありません。現在、一般的なクロール防止メカニズムです。主に以下を含みます:
- Weibo、Toutiao、StationBなどのデータは動的に読み込まれます
- ログインする必要があり、鉄道12306、淘宝網、Jingdongなどの確認コードが必要です
- リクエストの数が多く、同時にIPアドレスにアクセスする回数が多すぎるため、IPがブロックされます。
- アクセスされたデータなどのデータシールド方法はソースコードになく、データは今日の共有、ステーションbなどのjsに隠されています
Webサイトにクロール防止メカニズムが必要なのはなぜですか?2つの理由があります。1つはWebサイトのセキュリティを保護し、サーバーの負荷を軽減すること、もう1つはWebサイトのデータセキュリティを保護することです。
爬虫類の技術者や登山防止技術者は、常に左手と右手のようでした。登山防止メカニズムがあれば、私は登山防止技術を持っています。それを見るとすぐに登ることができます。
本日は、ウェブサイトのクロール防止メカニズムと実用的な対処方法を詳しくご紹介します。一般的に、ウェブサイトは次の3つの側面からクロール防止機能を備えています。
1.ユーザーから要求されたヘッダー
2.ユーザーの行動
3.ウェブサイトのディレクトリとデータの読み込み方法
最初の2つは比較的簡単に検出でき、ほとんどのWebサイトはこれらの観点からクローラー対策です。ajaxを使用する3番目のタイプのWebサイトが使用されます。これにより、クロールの難易度が高くなります(静的クローラーがajaxテクノロジーを使用してページを動的にロードするのを防ぐため)。
1.ユーザーが要求したヘッダーからのアンチクローラー。
これは最も一般的なクロール防止メカニズムです。特定のWebサイトにアクセスする場合、Webサイトは通常、訪問がクローラーであるかどうかを識別するヘッダーファイルがあるかどうかを判断します。これは、クロール防止戦略として使用されます。
次に、ヘッダーを偽装する必要があります。多くのWebサイトはヘッダーのユーザーエージェントを検出し、一部のWebサイトはリファラーを検出します(一部のリソースWebサイトのアンチリーチはリファラーを検出することです)。
このようなクローラー防止メカニズムに遭遇した場合は、ヘッダーをクローラーに直接追加するか、ブラウザーのUser-Agentをクローラーのヘッダーにコピーするか、Referer値をターゲットのWebサイトドメイン名に変更できます。
多くの場合、無視されがちです。リクエストのパケットキャプチャ分析を通じて、リファラーが決定され、プログラム内のシミュレートされたアクセスリクエストのヘッダーに追加されます。
ヘッダーを検出するアンチクローラーの場合、クローラーでのヘッダーの変更または追加は回避できます。
たとえば、捜狐のホームページを開き、最初にChromeのヘッダー情報を確認します(F12は開発者モードを開きます)。
図に示すように、ブラウザとシステムの情報がアクセスヘッダー情報に表示されます(ヘッダーには多くの情報が含まれていますが、User-AgentはユーザーのブラウザIDの一種であり、クエリを実行できます。自分で)
Pythonのurllibのリクエストモジュールは、ブラウザアクセスをシミュレートする機能を提供します。コードは次のとおりです。
from urllib import request
url = http://www. baidu.com
# page= requestRequest (url)
# page add header (' User-Agent',' Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebki
headers ={
'User-Agent': ' Mozilla/5.0(Windows NT 10.0; Win64; x64) AppleWebkit/537. 36'}
page = request Request(url, headersheaders)
page_info = request urlopen(page). read().decode('utf-8')
print(page_info)
add_header(key, value)
アクセスは、URLとともに、パラメータの形式で、または直接要求できます。
urllib.request Request()
urllib.request Request(url, data=None, headers={
}, origin req host=None, unverifiable )
ヘッダーが辞書である場合、このようにして、クローラーをブラウザーとしてシミュレートしてWebサイトにアクセスできます。
2.ユーザーの行動に基づくアンチクローラー
同じIPが短期間に同じページに複数回アクセスしたり、同じアカウントが短期間に同じ操作を何度も実行したりするなど、ユーザーの行動を検出するWebサイトもあります。
この種のアンチクライミングには、それに対処するのに十分なIPが必要です。
(1)ほとんどのウェブサイトは前者の場合であり、この場合、IPプロキシを使用することで解決できます。インターネット上で公開されているプロキシIPをクロールするためのクローラーを特別に作成し、検出後にすべてを保存することができます。プロキシIPの数が多い場合、1つのIPを数回ごとに変更できます。これは、リクエストまたはurllibで簡単に行うことができるため、最初のアンチクローラーを簡単にバイパスできます。
クローラーエージェントを作成します。
ステップ:
1.パラメータは辞書です{'type':'proxy ip:port number'}
proxy_support = urllib.request.ProxyHandler({})
2.カスタマイズしてオープナーを作成します
opener = urllib.request.build_opener(proxy_support)
3。オープナーのインストール
urllib.request.install_opener(opener)
4.オープナー
opener.open(url)を呼び出します
アンチクローラーに対処するために、多数のプロキシを持つターゲットWebサイトをランダムに要求します
import urllib request
import random
import re
url='http://www. whatismyip. com. tw '
iplist=['121.193.143.249:88',"112.126.65.193:88',122.96.59.184:82',115.29.98.139:9]
proxy_support = urllib. request Proxyhandler({
'httP': random choice(iplist)})
opener = urllib.request.build_opener(proxy_suppor)
opener.addheaders=[(' User-Agent, ' Mozilla/5.0(X11; Linux x86-64) AppleWebkit/537.36'
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
html = response.read().decode(' utf-8)
pattern = re.compile('<h1>(.*?)</h1>.*?<h2>(,*?)</h2>')
iterms=re.findall(pattern, html)
for item in iterms:
print(item[0]+:"+item[1])
(2)2番目のケースでは、次のリクエストは、各リクエストの後に数秒のランダムな間隔で行うことができます。論理的な抜け穴のあるWebサイトの中には、同じアカウントが短期間に同じリクエストを複数回行うことができないという制限を回避するために、複数回リクエストし、ログアウトし、再度ログインして、リクエストを続行することができます。
アカウントのクロール防止の制限に対処することは一般に困難であり、ランダムに数秒間のリクエストがブロックされることがよくあります。
3.動的ページのアンチクローラー
上記の状況のほとんどは静的ページに表示され、一部のWebサイトもあります。クロールする必要のあるデータは、ajaxリクエストを介して取得されるか、Javaを介して生成されます。
解決策:Selenium + PhantomJS
Selenium:実際のブラウザー環境を完全にシミュレートし、基本的にすべてのユーザーアクションを完全にシミュレートする自動化されたWebテストソリューション
PhantomJS:GUIのないブラウザ
たとえば、淘宝網の個人情報アドレスを取得するには、次のようにします。
from selenium import webdriver
import time
import re
drive = webdriver.PhantomJs(executable_path = ' phantomjs-21.1-linux-x86 64/bin/phanto drive.get('https://mm. taobaocom/self/modelinfohtm? userid=189942305& iscoment=fal)
time. sleep(5)
pattern = re.compile(r'<div. *? mm-p-domain-info>*? class="mm-p-info-cell clearfix">.
html = drive.page_source.encode(' utf-8,' ignore')
items=re.findall(pattern, html)
for item in items:
print(item[0], 'http':+item[1])
drive.close()
4.まとめ
最後に、前述のクライミング防止メカニズムの対処戦略(クライミング防止)を要約します。
-
カモフラージュブラウザ
-
プロキシIPを使用する
-
パケットキャプチャ分析の画期的な非同期ロード/セレン自動テストツール
-
クッキーを追加する
最後に、爬虫類の世界は本当に興味深く、テクノロジーは無実で、学習は可能ですが、実際の操作で十分であり、法の境界に触れないようにする必要があります。
私の記事を真剣に読んで、途中でファンの台頭と注目を集めているすべての人に感謝します。常に礼儀正しい交換が必要です。
①2000を超えるPython電子書籍(主流および古典的な書籍が利用可能である必要があります)
②Python標準ライブラリ情報(最も完全な中国語版)
③プロジェクトのソースコード(40〜50の興味深い古典的なトレーニングプロジェクトとソースコード)
④Python、クローラー、Web開発、ビッグデータ分析の基本的な紹介のビデオ(初心者の学習に適しています)
⑤Python学習ロードマップ(経験の浅い学習に別れを告げる)
あまり価値のないものですが、使えれば直接持ち帰ることができます。私のQQ技術交流グループ(技術交流やリソース共有、広告が入って足が邪魔になります)では、グループ番号は1044939456です。