爬蟲,也叫蜘蛛(Spider),若是把互聯網比喻成一個蜘蛛網,Spider就是一隻在網上爬來爬去的蜘蛛。網絡爬蟲就是根據網頁的地址來尋找網頁的,也就是URL。舉一個簡單的例子,咱們在瀏覽器的地址欄中輸入的字符串就是URL,例如:https://www.baidu.compython
URL就是贊成資源定位符(Uniform Resource Locator),它的通常格式以下(帶方括號[]的爲可選項):小程序
protocol :// hostname[:port] / path / [;parameters][?query]#fragmentapi
URL的格式主要由三部分組成:瀏覽器
爬蟲就是根據URL來獲取網頁信息的。服務器
urllib包提供的模塊能夠用來使Python代碼訪問url。cookie
從Python3官方的urllib包介紹能夠知道,在Python3中的內置庫中把Python2 的urllib、urllib2兩個庫整合成了urllib包。網絡
在urllib包中只提供了4個模塊:app
import urllib2 --->
在Python3.x中會使用import urllib.request
,urllib.error
。import urllib --->
在Python3.x中會使用import urllib.request
,urllib.error
,import urlparse --->
在Python3.x中會使用import urllib.parse
。import urlopen --->
在Python3.x中會使用import urllib.request.urlopen
。import urlencode --->
在Python3.x中會使用import urllib.parse.urlencode
。import urllib.quote --->
對應的,在Python3.x中會使用import urllib.request.quote
。cookielib.CookieJar --->
對應的,在Python3.x中會使用http.CookieJar
。urllib2.Request --->
在Python3.x中會使用urllib.request.Request
。urllib.request.urlopen():訪問一個URL,返回一個包含網頁信息的對象dom
response.read():獲取返回對象的內容ide
response.getcode():獲取返回的HTTP Code
response.info():獲取返回的元數據信息,例如HTTP Header
response.geturl():獲取訪問的url
# 使用Python訪問博客園,獲取網頁信息 import urllib.request response = urllib.request.urlopen('http://www.cnblogs.com/dachenzi') data = response.read().decode('utf-8') print(data)
利用Python下載一個圖片
import urllib.request url = 'http://img.lenovomm.com/s3/img/app/app-img-lestore/2370-2015-07-16035439-1437033279327.jpg?isCompress=true&width=320&height=480&quantity=1&rotate=true' response = urllib.request.urlopen(url) data = response.read() with open('img.jpg','wb') as f: # 圖片輸入二進制文件,因此只須要使用b模式打開寫入便可 f.write(data)
注意:這裏urlopen能夠接受一個str,或者一個request對象
使用Python完成翻譯小程序,輸入中文返回英文信息,反正亦然。
# 一、使用瀏覽器訪問,查看Network,肯定提交數據訪問的地址以及提交的data
HTTP Header,表示在瀏覽器在進行訪問(HTTP請求)時攜帶的頭部信息,什麼叫定製HTTP請求頭呢,舉個栗子:其實天天活躍在網上的爬蟲太多了,若是網站不進行限制的話,那麼訪問流量會很高,因此站點基本都會對爬蟲進行基本的限制,而利用User-Agent (瀏覽器標示)是最經常使用的方式,使用瀏覽器和使用Python代碼來訪問站點時,瀏覽器標示時不一樣的。
本人的google瀏覽器是:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
python代碼是:Python 3.6.3 ..
這裏既然說定製,那麼就是說能夠對User-Agent等頭部參數進行修改。
修改請求的User-Agent就須要先定製request對象了,而後把對象傳給urlopen進行訪問
import urllib.request url = 'http://img.lenovomm.com/s3/img/app/app-img-lestore/2370-2015-07-16035439-1437033279327.jpg?isCompress=true&width=320&height=480&quantity=1&rotate=true' head = {} head['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36' request = urllib.request.Request(url,headers=head) # 建立Request對象,並設置headers response = urllib.request.urlopen(request) data = response.read() with open('img.jpg','wb') as f: f.write(data)
1 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", 2 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", 3 "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", 4 "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)", 5 "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", 6 "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", 7 "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", 8 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", 9 "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6", 10 "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", 11 "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", 12 "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5", 13 "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6", 14 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", 15 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20", 16 "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
除了在代碼中經過字典定義header之外,還能夠使用request對象的add_header()方法,進行添加
import urllib.request url = 'http://img.lenovomm.com/s3/img/app/app-img-lestore/2370-2015-07-16035439-1437033279327.jpg?isCompress=true&width=320&height=480&quantity=1&rotate=true' # head = {} # head['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36' request = urllib.request.Request(url) # 建立Request對象,並設置headers request.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36') response = urllib.request.urlopen(request) data = response.read() with open('img.jpg','wb') as f: f.write(data)
HTTP代理也是爬蟲經常使用的方法,咱們的代碼能夠使用不一樣的代理來爬url,這樣能夠避免IP被站點封掉。
什麼是HTTP代理? 簡單來講咱們把請求發給代理服務器,由代理服務器幫咱們訪問請求後把返回的數據原封不動的返回給咱們。
一、建立一個HTTP代理
http_proxy = urlib.request.ProxyHandler({'代理類型':'IP:Port'})
二、定製建立一個opener
opener = urllib.request.build_opener(http_proxy)
PS: 當咱們使用urlopen訪問url時,其實使用的是默認的opener來進行工做的,咱們能夠對其進行定製,這裏就是定製它使用http代理進行訪問
三、安裝opener
urllib.request.install_opener(opener)
PS:執行完畢後,後續全部的請求都會使用該opener進行訪問,因此若是隻是一次特殊的請求,那麼能夠使用 opener.open(url) 來訪問url
import urllib.request # create http_proxy http_proxy = urllib.request.ProxyHandler(proxies = {'http':'114.215.192.184:8081'}) # create opener opener = urllib.request.build_opener(http_proxy) response = opener.open('http://ifconfig.io/') data = response.read() print(data)
PS:這裏能夠定義多個http_list,利用random隨機選擇
import random http_proxy_list = [ '110.73.10.15:8123', '114.230.105.34:21642' ] http_proxy = urllib.request.ProxyHandler(proxies = {'http':random.choice(http_proxy_list)})
opener也是能夠添加header的,使用addheaders = [('key','value')] 進行添加
opener = urllib.request.build_opener(http_proxy) opener.addheaders = [('User-Agent','Mozilla/5.0 ')]