網絡爬蟲(又被稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更常常的稱爲網頁追逐者),是一種按照必定的規則,自動的抓取萬維網信息的程序或者腳本。瀏覽器
用戶看到的網頁實質是由 HTML 代碼構成的,爬蟲爬來的即是這些內容,經過分析和過濾這些 HTML 代碼,實現對圖片、文字等資源的獲取。安全
URL,即統一資源定位符,也就是咱們說的網址,統一資源定位符是對能夠從互聯網上獲得的資源的位置和訪問方法的一種簡潔的表示,是互聯網上標準資源的地址。互聯網上的每一個文件都有一個惟一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎麼處理它。服務器
URL的格式由三部分組成:
①第一部分是協議(或稱爲服務方式)。
②第二部分是存有該資源的主機IP地址(有時也包括端口號)。
③第三部分是主機資源的具體地址,如目錄和文件名等。網絡
爬蟲爬取數據時必需要有一個目標的URL才能夠獲取數據,所以,它是爬蟲獲取數據的基本依據。socket
response = urllib2.urlopen(url)網站
調用urllib2庫裏面的urlopen方法,傳入一個URL,協議是HTTP協議,固然你也能夠把HTTP換作FTP,FILE,HTTPS 等等,只是表明了一種訪問控制協議,urlopen通常接受三個參數,它的參數以下:ui
urlopen(url, data, timeout)url
第一個參數url即爲URL,第二個參數data是訪問URL時要傳送的數據,第三個timeout是設置超時時間。spa
第二三個參數是能夠不傳送的,data默認爲空None,timeout默認爲 socket._GLOBAL_DEFAULT_TIMEOUT代理
該方法返回一個response對象,返回信息保存在這裏面
若是直接 print response ,打印的是該對象的描述,須要加上read()方法,才能夠看到返回的HTML內容
urlopen()這個方法能夠直接傳遞一個request對象,經過urllib2.Request(url)構造
詳細內容待補充...
如今大多數網站都是動態網頁,須要你動態地傳遞參數給它,它作出對應的響應。因此,在訪問時,咱們須要傳遞數據給它。最多見的狀況是登陸註冊的時候。
數據傳送分爲POST和GET兩種方式。
GET方式是直接以連接形式訪問,連接中包含了全部的參數,固然若是包含了密碼的話是一種不安全的選擇,不過你能夠直觀地看到本身提交了什麼內容。POST則不會在網址上顯示全部的參數
values = { 'username' : ' ' , 'password' : ' '}
data = urllib.urlencode(values)
request = urllib2.Request(url,data)
response = urllib.urlopen(request)
POST方式把數據隱藏到data參數裏
geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print response.read()
get方式把數據暴露在url裏
爲了徹底模擬瀏覽器的工做,咱們須要設置一些Headers 的屬性。
在請求某個url時, Header裏的agent就是請求的身份,若是沒有寫入請求身份,服務器不必定會響應。
headers = { 'User-Agent' : user_agent }
request = urllib2.Request(url, data, headers)
設置了一個headers,在構建request時傳入,在請求時,就加入了headers傳送,服務器若識別了是瀏覽器發來的請求,就會獲得響應。
headers中還有一個參數是Referer,它的含義是告訴url本身是哪一個網址,從何而來。構造headers時在字典裏再加一個Referer就好
用處:
1.好比我只想要我本身的網站訪問我本身的圖片服務器,那麼圖片服務器就能夠根據Referer來判斷一下是否是我本身的域名。達到防盜鏈的效果
2.Referer爲空的狀況就是這個訪問不是由某個連接而來,好比直接在地址欄裏輸入網址訪問。
一些網站會有相應的反爬蟲措施,例如不少網站會檢測某一段時間內某個IP的訪問次數,若是訪問評率太快以致於看起來不像正常訪客,它可能會禁止這個IP的訪問。因此須要設置一些代理服務器,每隔一段時間換一個代理,就算IP被禁止,依然能夠換個IP繼續爬取。
import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
opener = urllib2.build_opener(proxy_handler)
else:
opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)
將opener應用到全局,以後全部的,不論是opener.open(request)仍是urlopen(request)發送請求,都將使用自定義代理。
#傳入圖片地址,文件名,保存單張圖片def saveImg(imageURL,fileName): u = urllib.urlopen(imageURL) data = u.read() f = open(fileName, 'wb')#以二進制打開,只用於寫入 f.write(data) f.close()