Python爬虫基礎2--urllib 2

4206 ワード

前節では、Webページをキャプチャする方法と画像をダウンロードする方法について説明しました.次の節では、制限されたキャプチャされたWebサイトをキャプチャする方法について説明します.まず、前回の授業の方法で、みんなが例に挙げたWebサイトをキャプチャする方法について説明します.
1.制限されたWebページをキャプチャ2.コードの最適化
1.制限されたWebページのキャプチャ
まず、前節で学んだ知識を使ってテストしてみましょう.
'''
@       blog.csdn.net  
'''
import urllib

url = "http://blog.csdn.net/FansUnion"
html = urllib.urlopen(url)
#getcode()     Http   
print html.getcode()
html.close()
#  
403

ここで、私たちの出力は403で、アクセスを拒否したことを表します.同理200は、要求が成功したことを示す.404はウェブサイトが探し当てていないことを表します.csdnはすでに関連する遮蔽をして、第1節の方法を通じてウェブページを取得することができなくて、ここで私達は新しいライブラリを起動する必要があります:urllib 2しかし私達もブラウザがその文を送ることができることを見て、私達がブラウザの操作を模擬するかどうか、ウェブページの情報を取得することができます.古い方法、まず、ブラウザがcsdnサーバにリクエストを送信する方法を見てみましょう.まず、方法を簡単に説明します.
Webページを開き、右クリックして「inspect Element」(一番下の項目)を選択して、下に弾いた枠のNetworkタブをクリックしてWebページをリフレッシュすると、Networkタブが多くの情報をつかんでその中の1つの情報展開を見つけることができ、リクエストパッケージのHeaderを見ることができます
ヘッダー情報の表示
以下、整理したヘッド情報です
Request Method:GET
Host:blog.csdn.net
Referer:http://blog.csdn.net/?ref=toolbar_logo
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36

次に、抽出されたHeader情報に基づいてurllib 2のRequestメソッドを使用して、ブラウザがサーバに要求を送信することをシミュレートします.コードは次のとおりです.
# coding=utf-8
'''
@           (blog.csdn.net)
@User-Agent:        
@Host:     
@Referer:    
@GET:     GET
'''
import urllib2

url = "http://blog.csdn.net/FansUnion"

#     Header,             
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36')
req.add_header('Host', 'blog.csdn.net')
req.add_header('Referer', 'http://blog.csdn.net')
req.add_header('GET', url)

#    html   
html = urllib2.urlopen(req)
content = html.read()
print content
html.close()

ほほほ、あなたは私を制限して、私はあなたの制限をスキップします.ブラウザがアクセスできる限り、爬虫類を通じて捕まえることができるそうです.
2.コードの最適化
送信ヘッダーメソッドの簡略化
毎回そんなにreq.add_を書くことに気づきましたヘッドは自分にとって苦しみで、コピーすれば使える方法はありませんか.答えは肯定的です.
#input:
help(urllib2.Request)
#output(     ,  __init__  )
__init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False)

観察してみると、headers={}ということは、辞書でheader情報を提出できるということです.では、やってみましょう!!
#     Header    
csdn_headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",
    "Host": "blog.csdn.net",
    'Referer': 'http://blog.csdn.net',
    "GET": url
    }
req = urllib2.Request(url,headers=csdn_headers)

簡単かどうか発見して、ここでスパルタの無私な教えに感謝します.
ダイナミックヘッダ情報の提供
上記の方法でキャプチャを行うと、送信情報が単一すぎるため、サーバからマシン爬虫類とみなされて拒否されることが多い.よりスマートな方法で動的なデータを送信するかどうかは、答えも肯定的である.しかも簡単で、直接コードを送信する.
'''
@          Header  
@random    ,     
'''

# coding=utf-8
import urllib2
import random

url = 'http://www.lifevc.com/'

my_headers = [
    'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)',
    'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.1',
    'Mozilla/4.0 (compatible; GoogleToolbar 5.0.2124.2070; Windows 6.0; MSIE 8.0.6001.18241)',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; Sleipnir/2.9.8)',
    #     ,    N 
]

random_header = random.choice(headers)
#     print random_header     header  
req = urllib2.Request(url)
req.add_header("User-Agent", random_header)
req.add_header('Host', 'blog.csdn.net')
req.add_header('Referer', 'http://blog.csdn.net')
req.add_header('GET', url)
content = urllib2.urlopen(req).read()
print content

実はとても簡単で、このように私達はコードに対するいくつかの最適化を完成しました.この節は主に図のように制限されたウェブサイトを捕まえることを話して、次の節は爬虫神兵利器BeautifulSoupを紹介します.