python爬虫チュートリアル:pythonはウェブサイトの反爬虫戦略の総括を解決します

3716 ワード

本文はウェブサイトの反爬虫策略を詳しく紹介して、ここで私が爬虫以来出会った各種の反爬虫策略と対応方法を総括します.機能的に言えば、爬虫類は一般的にデータ収集、処理、貯蔵の3つの部分に分けられる.ここではデータ収集部分だけを議論します.
一般的なWebサイトは、ユーザーが要求したHeaders、ユーザーの動作、Webサイトのディレクトリ、データのロード方法の3つの側面から反爬虫類しています.最初の2つは比較的出会いやすく、多くのサイトはこれらの角度から爬虫類に反対しています.3つ目のajaxを適用するWebサイトでは、ajaxテクノロジーを使用してページを動的にロードする静的爬虫類を防止するために、爬虫類の難易度が向上します.
1、ユーザーから要求されたHeadersアンチ爬虫類は最も一般的なアンチ爬虫類戦略である.ヘッドを偽装する.多くのサイトではHeadersのUser-Agentが検出され、一部のサイトではReferが検出されます(一部のリソースサイトの防犯チェーンはReferが検出されます).このような逆爬虫機構に遭遇した場合、直接爬虫類にHeadersを追加し、ブラウザのUser-Agentを爬虫類のHeadersにコピーすることができる.あるいはRefer値をターゲットサイトドメイン名に変更する[コメント:無視されがちで、リクエストのパケット分析によりreferを特定し、プログラム内でアクセスリクエストヘッダに追加する].Headersを検出する逆爬虫類については,爬虫類にHeadersを修正したり添加したりすることでうまく迂回できる.
2、ユーザーの行為に基づいて、虫に逆らう
また、一部のウェブサイトでは、同じIPで短時間で同じページに複数回アクセスしたり、同じアカウントで短時間で複数回同じ操作を行ったりするなど、ユーザーの行動を検出しています.[このような登り止めには、十分なipが必要です]
(1)、ほとんどのサイトは前のケースであり、この場合はIPエージェントを使えば解決できる.爬虫類を専門に書いて、ネット上で公開されているエージェントipを這い取り、検出してすべて保存することができます.大量のエージェントipがあれば、リクエストごとにipを何回か交換することができ、requestsやurllibでは簡単にでき、最初の反爬虫類を迂回することができます.
爬虫類エージェントの作成:
手順:1.パラメータは辞書{'タイプ':'プロキシip:ポート番号'}proxy_support=urllib.request.ProxyHandler({}) 2.Opener opener=urllibをカスタマイズ、作成するrequest.build_opener(proxy_support) 3a.Opener urllibをインストールします.request.install_opener(opener) 3b.Opener Openerを呼び出します.open(url)
大量のエージェントでランダムにターゲットサイトをリクエストし、反爬虫類に対応
#! /usr/bin/env python3.4
#-*- coding:utf-8 -*-
#__author__ == "tyomcat"
 
 
import urllib.request
import random
import re
 
url='http://www.whatismyip.com.tw'
iplist=['121.193.143.249:80','112.126.65.193:80','122.96.59.104:82','115.29.98.139:9999','117.131.216.214:80','116.226.243.166:8118','101.81.22.21:8118','122.96.59.107:843']
 
proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener=urllib.request.build_opener(proxy_support)
opener.addheaders=[('User-Agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36')]
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
 
pattern = re.compile('

(.*?)

.*?

(.*?)

') iterms=re.findall(pattern,html) for item in iterms: print(item[0]+":"+item[1])

(2)、第2の場合は、要求毎にランダムに数秒間隔を置いて次の要求を行うことができる.一部の論理的な脆弱性のあるサイトでは、何度も要求したり、ログインを終了したり、再ログインしたりすることで、同じアカウントを短時間で何度も同じ要求を行うことができない制限を回避することができます.[コメント:アカウントに対して登り制限をするのは、一般的には対応しにくく、ランダムに数秒の要求も閉鎖されることが多い.複数のアカウントがあれば、切り替えて使用すれば、効果はもっと良い]
3、ダイナミックページの逆爬虫類
上記のいくつかのケースの多くは静的ページに表示され、一部のサイトではajaxリクエストによって取得されたり、Javaによって生成されたりする必要があります.
ソリューション:Selenium+PhantomJS
Selenium:Webテストソリューションを自動化し、実際のブラウザ環境を完全にシミュレートし、基本的にすべてのユーザー操作PhantomJSを完全にシミュレートします.グラフィックインタフェースのないブラウザです.
宝を洗う妹の個人の詳しい住所を取得します:
#! /usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ == "tyomcat"
 
from selenium import webdriver
import time
import re
 
drive = webdriver.PhantomJS(executable_path='phantomjs-2.1.1-linux-x86_64/bin/phantomjs')
drive.get('https://mm.taobao.com/self/model_info.htm?user_id=189942305&is_coment=false')
 
time.sleep(5)
 
pattern = re.compile(r'.*?class="mm-p-info-cell clearfix">.*?
  • .*?(.*?)',re.S) 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()

  • 最后に皆さんに1つの资源のとてもそろっているpythonの学习の集まりを推荐して、クリックして入って、ここは私が以前の学习の心得を収集して、ノートを勉强して、まだ第一線の企业の仕事の経験があって、しかもみんなに1部のpythonの0基础からプロジェクトの実戦の资料を心を込めて整理します