Python 3.x爬虫テクニックまとめ


最近いくつかあぜ道の人の放送をダウンロードしたいと思って、家に帰る列車の中で聞いて、しかしリンクが多すぎて、もし1つ1つ行くならば時間を浪費して、だから1つの爬虫類の自動ダウンロードを書きたいです.
python爬虫ステーションのいくつかのテクニックでこの文章をまとめるのはpython爬虫テクニックに対してよくまとめられているが、python 2に基づいている.xの、自分は最近またpython 3に変わったばかりです.xなので、このブログをpython 3に基づいて変換する.xの.
1.最も基本的な掴み所
from urllib import request

response = request.urlopen("http://www.baidu.com/")
content = response.read().decode('utf-8')
print(content)

- 2.プロキシサーバを使用すると、IPが閉鎖されたり、IPアクセスの回数が制限されたりするなど、場合によっては便利です.
from urllib import request

proxy_support = request.ProxyHandler({'http':'http://xx.xx.xx.xx:xx'})
opener = request.build_opener(proxy_support, request.HTTPHandler)
request.install_opener(opener)

content = request.urlopen('http://www.baidu.com/').read().decode('utf-8')
print(content)
エージェント・アクセスを常に使用したくない場合はinstall_を呼び出す必要はありません.Opener(opener)がインストールされており、毎回openerを使用するだけです.Open()はrequestではありません.urlopen().
- 3.ログインが必要な場合はログインが面倒です質問を分割します:-3.1 cookieの処理
#-*- coding: utf-8 -*-

from urllib import request
from http import cookiejar

cookie_support = request.HTTPCookieProcessor(cookiejar.CookieJar())
opener = request.build_opener(cookie_support, request.HTTPHandler)
request.install_opener(opener)

content = request.urlopen('http://www.baidu.com/').read().decode('utf-8')
print(content)

はい、そうです.エージェントとクッキーを同時に使いたいならproxy_に参加します.次にopernerを
opener = request.build_opener(proxy_support, cookie_support, request.HTTPHandler)

-3.2フォームの処理登録に必要な記入表、フォームはどのように記入しますか?まずツールを利用して記入する表の内容を切り取ります例えば私は一般的にfirefox+httpfoxプラグインを使って自分がいったい何を送ったのかを見てみましょう.これは例を挙げてみましょう.verycdを例に、まず自分が送ったPOSTリクエストとPOSTフォームの項目を見つけます.verycdが見えたらusername,password,continueURI,fk,login_submitは、fkがランダムに生成されている(実際にはあまりランダムではなく、epoch時間を簡単な符号化で生成しているように見える)ため、Webページから取得する必要があります.つまり、一度Webページにアクセスし、正規表現などのツールで戻りデータのfk項目を切り取る必要があります.continueURIはその名の通り自由に書けます、login_submitは固定されており、これはソースコードから見ることができます.usernameもありますが、passwordは明らかです.はい、記入するデータがあればpostdataを生成します.
postdata = parse.urlencode({
    'username':'XXXXX',
    'password':'XXXXX',
    'continueURI':'http://www.verycd.com/',
    'fk':'fkasdfasdf',
    'login_submit':'  ',
})


次にhttpリクエストを生成し、リクエストを送信します.
req = request.Request(
    url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/',
    data = postdata
)
content = request.urlopen(req).read()

print(content)

getリクエストの場合、次のようになります.
fullurl = 'http://xxxxxxxxxxxxxxx/index?%s' % data
req = request.Request(fullurl)

3.3ブラウザに偽装していくつかのウェブサイトにアクセスして爬虫類の訪問に反感を持って、そこで爬虫類に対してすべて要求を拒否しますこの時私達はブラウザに偽装する必要があります.これはhttpパッケージのheaderを修正することによって実現することができます.
postdata = parse.urlencode({})
headers = {
    'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
}
req = request.Request(
    url = 'http://secure.verycd.com/signin/*/http://www.verycd.com/',
    data = postdata,
    headers = headers
)

3.4反"反盗链"一部のサイトにはいわゆる反盗链设置がありますが、実は简単に着ています.あなたが要求したheaderの中で、referサイトが彼自身かどうかをチェックすることです.だから、3.3のようにheadersのreferをこのサイトに変更するだけでいいです.黒幕で有名なcnbetaを例に挙げます.
headers = {
    'Referer':'http://www.cnbeta.com/articles'
}

headersはdictデータ構造で、任意の希望のheaderを入れて、いくつかの偽装をすることができます.
3.5究極の絶技3.1-3.4をしても、訪問は根拠にされることがあるので、仕方がありません.正直にhttpfoxで見たheadersを全部書いておけば、普通でいいです.これ以上だめなら、究極の絶技を使うしかない.seleniumはブラウザを直接制御してアクセスし、ブラウザができる限り、それもできる.似たようなのはpamie、watirなどです.
4.マルチスレッド同時キャプチャ単一スレッドが遅すぎると、マルチスレッドが必要になります.ここでは簡単なスレッドプールテンプレートというプログラムに1-10を簡単に印刷しただけですが、同時であることがわかります.
#-*- coding: utf-8 -*-

from threading import Thread
from queue import Queue
from time import sleep
#q     
#NUM       
#JOBS      
q = Queue()
NUM = 2
JOBS = 10
#       ,        
def do_somthing_using(arguments):
    print(arguments)
    
#       ,             
def working():
    while True:
        arguments = q.get()
        do_somthing_using(arguments)
        sleep(1)
        q.task_done()
#fork NUM       
for i in range(NUM):
    t = Thread(target=working)
    t.setDaemon(True)
    t.start()
# JOBS    
for i in range(JOBS):
    q.put(i)
#    JOBS  
q.join()

5.認証コードの処理
認証コードに遭遇したらどうしますか?ここでは2つの状況に分けて処理します.
-
1.googleの認証コード、冷やし
-
2.簡単な検証コード:文字の個数が限られていて、単純な平行移動や回転と騒音を使用しているだけで、ねじれがない場合、このような処理が可能である.一般的な考え方は回転して戻ってきて、騒音を取り除いて、それから単一の文字を区分して、区分してから特徴抽出の方法(例えばPCA)を通じて次元を下げて特徴ライブラリを生成することである.次に検証コードとフィーチャーライブラリを比較します.これは比较的に复雑で、1篇の博文は言い终わらないで、ここは展开しないで、具体的なやり方は本の関连する教科书をいじってよく研究してください.
-
3.事実上、一部の検証コードはまだ弱いので、ここでは点呼しません.どうせ私は2の方法で精度の高い検証コードを抽出したことがあるので、2は事実上可能です.