python網絡爬蟲簡介

1.課堂內容
requests 獲取網頁內容
rebots.txt 網絡爬蟲排除標準
BeautifulSoup  解析HTML頁面
Re 正則表達式詳解,提取頁面關鍵信息
Scrapys 網絡爬蟲原理介紹專業爬蟲框架介紹

2. pytho開發環境
文本工具類
IDLE Notepad++ sublime Text, vim,Atom,Komodo Edit
集成開發工具:
PyCharm, Wing, Pydev&Eclipse, Visual Studio,Anaconda&PTVS, Spyder,Canopy
推薦
pycharm(推薦)開發大型程序
Anaconda 科學計算數據分析領域的IDE,推薦,開源,免費
IDLE sublime

the website is API
Requests庫
rebots協議
5個實戰項目

1.Requests入門
requests:www.python-requests.org上獲取requests庫的詳細信息
使用pip工具來安裝requests庫:pip install requests
requests的相關方法 
request.get(url,params =  None,**kwargs)構造一個Request對象 , 返回一個Response對象
url: 擬獲取頁面的url連接
params: urlk中的額外參數,字典或字節流格式,可選
**kwargs:12個控制訪問的參數

Response對象的屬性:
r.status_code HTTP請求返回的狀態碼,200表示鏈接成功,404表示失敗
r.text  HTTP響應內容的字符串形式,即,url對應的頁面內容
r.encoding 從HTTP頭部猜想的響應內容編碼方式,是從HTTP頭部中charset字段得到的,若是header中不存在charset,則認爲編碼爲ISO-8859-1,這種編碼方式不可以解析中文
r.apparent_encoding 從內容中分析出的響應內容可能的編碼方式,比encoding更加準確
r.content HTTP響應內容的二進制形式
    
    
    
    
import requestsr = requests.get('http://www.baidu.com')print r.status_coder.encoding = r.apparent_encodingprint r.text
爬取網絡的通用代碼框架
Requsts庫的異常
異常 說明 
requests.Connectionerror 網絡鏈接錯誤異常,如DNS查詢失敗,拒絕鏈接等 
requests.HTTPError HTTP錯誤異常
requests.URLRequired URL缺失異常
requests.TooManyRedirects 超過最大的重定向次數,產生重定向異常
requests.ConnectTimeout 鏈接遠程服務器超時異常
requests.Timeout 請求URL超時,產生超時異常
r.raise_for_status() 判斷返回的status_code是否是200,若不是,拋出一個HTTPError異常
    
    
    
    
#-*-coding = utf-8 -*-import requestsdef getHTMLText(url): try: r = requests.get(url,timeout=30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except Exception as e: print eif __name__ == "__main__": url = "http://www.baidu.com" print getHTMLText(url)
HTTP協議 超文本傳輸協議 
請求響應協議
host:主機名
port: 服務的端口,默認爲80
path
對應於網絡上的一個資源
HTTP協議對資源的操做
方法 說明 requests方法 
GET 請求獲取URL位置的資源 requests.get(url,params=None,**kwargs)
HEAD 請求獲取URL位置的資源的響應消息的報告,即得到該資源的頭部信息 requests.head(url,**kwargs)
POST 請求向URL位置的資源後附加新的數據 requests.head(url,data=None,json=None,**kwargs)
PUT 請求向URL位置存儲一個資源,覆蓋原URL位置的資源 requests.put(url,data=None,**kwargs)
PATCH 請求局部更新URL位置的資源,即改變該處資源的部份內容,節省網絡帶寬 requests.patch(url,data=None,**kwargs)
DELETE 請求刪除URL位置存儲的資源 requests.delete(url,**kwargs)
requests.head()方法示例
     
     
     
     
import requestsr = requests.head("http://www.baidu.com")for item in r.headers.items(): print "%s : %s"%item
輸出
     
     
     
     
Server : bfe/1.0.8.18Date : Tue, 23 May 2017 08:01:17 GMTContent-Type : text/htmlLast-Modified : Mon, 13 Jun 2016 02:50:47 GMTConnection : Keep-AliveCache-Control : private, no-cache, no-store, proxy-revalidate, no-transformPragma : no-cacheContent-Encoding : gzip
requests.put()方法測試
     
     
     
     
import requestspayload = {'key1':'value1','key2':'value2'}r = requests.post("http://httpbin.org/put",data = payload)print r.text
輸出
     
     
     
     
{ "args": {}, "data": "", "files": {}, "form": { "key1": "value1", "key2": "value2" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.13.0" }, "json": null, "origin": "218.29.102.115", "url": "http://httpbin.org/put"}
requests.request(method,url,**kwargs)
method請求方式,能夠是GET,HEAD,POST,PUT,PATCH,delete,OPTIONS
**kwargs 13個參數
params 字典或字節序列,做爲參數增長到url中
示例
     
     
     
     
>>> kv= {'key1':'value1','key2':'value2'}>>> r = requests.request("GET",'http://www.python123.io/ws',params=kv)>>> print r.urlhttp://www.python123.io/ws?key2=value2&key1=value1
data: 字典,字節序列或文件對象,做爲Request的內容
     
     
     
     
>>> kv = {'key1':'value1','key2':'value2'}>>> r = requests.request("PUT",'http://www.python123.io/ws',data=kv)>>> body = '主體內容'>>> r = requests.request("PUT",'http://www.python123.io/ws',data=body)
json:JSON格式的數據,做爲Request的內容
    
    
    
    
>>> kv = {'key1':'value1','key2':'value2'}>>> r = requests.request("PUT",'http://www.python123.io/ws',json=kv)
headers:字典,HTTP定製頭
cookies: 字典或CookieJar,Request中的cookie
auth:元組,支持HTTP的認證功能
files:字典類型,傳輸文件
     
     
     
     
>>> fs = {'file':open('data.xls','rb'}>>> r = requests.request("POST",'http://www.python123.io/ws',files = fs)
timeout:設置超時時間,以秒爲單位
proxies: 字典類型,設定訪問代理服務器,能夠增長登陸認證,能夠隱藏用戶訪問網頁的源IP地址信息,能有效的防止對爬蟲的逆追蹤
示例
    
    
    
    
>>> pxs ={'http':'http://user:pass@10.10.10.1:1234','https':'https://10.10.10.1.4321'}>>> r = requests.request('GET','http://www.baidu.com',proxies = pxs)
allow_redicts:True/False默認爲True,重定向開頭
stream:True/False,默認爲True,獲取內容當即下載開頭
verify: True/False,默認爲True,認證SSL證書開頭
cert:本地SSL證書路徑 


最常使用就是get和head方法
代碼框架
    
    
    
    
import requestsdef getHTMLText(url): try: r = requests.get(url,timeout = 30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except Exception as e: print e
實例1,京東商品頁面的爬取
     
     
     
     
#-*-coding=utf8-*-import requestsurl = "https://item.jd.com/1696975522.html"try: r = requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding print r.text[:1000]except Exception as e: print "爬取失敗"
實例2:亞馬遜商品頁面爬取
     
     
     
     
#-*-coding=utf8-*-import requestsurl = "https://www.amazon.cn/gp/product/B0186FESGW/ref=s9_acss_bw_cg_kin_1a1_w?pf_rd_m=A1U5RCOVU0NYF2&pf_rd_s=merchandised-search-2&pf_rd_r=MNPJWDEAVVCY67V3KKXB&pf_rd_t=101&pf_rd_p=190844af-fd7e-4d63-b831-fbd5601cfa0d&pf_rd_i=116087071"try: kv = {"user-agent":"Mozilla/5.0"} r = requests.get(url,headers = kv) r.raise_for_status() r.encoding = r.apparent_encoding print r.text[:1000]except Exception as e: print "爬取失敗"
實例3:向搜索引擎提交關鍵字
百度的關鍵詞接口
360的關鍵詞接口
     
     
     
     
#-*-coding=utf8-*-import requests#url = 'http://www.baidu.com/s'url = 'http://www.so.com/s'try: #kv = {'wd':'python'} kv = {'q':'python'} r = requests.get(url,params = kv) r.raise_for_status() print len(r.text)except Exception as e: print "爬取失敗"
實例:爬取圖片
     
     
     
     
#-*-coding=utf8-*-import osimport requestsroot = 'F:\\pythonstudy\\'url = 'http://image.nationalgeographic.com.cn/2017/0523/20170523015851567.jpg'path = root + url.split('/')[-1]if not os.path.exists(root): os.mkdir(root)if not os.path.exists(path): try: r = requests.get(url) r.raise_for_status() with open(path,'wb') as f: f.write(r.content) print u"寫入成功" except Exception as e: print u"爬取失敗"else: print u"文件已存在"
實例5:查詢IP地址
     
     
     
     
#-*-coding=utf8-*-import requestsurl = 'http://m.ip138.com/ip.asp?ip='try: r = requests.get(url+'222.222.222.222') r.raise_for_status() print r.text[-1000:]except Exception as e: print u"爬取失敗"


網絡爬蟲的尺寸
小規模,數據量小的爬取速度不敏感 Requests庫 爬取網頁 玩轉網頁 >90%
中規模,數據規模較大爬取速度敏感 Scrapy庫 爬取網站 爬取系列網站
大規模,搜索引擎爬取速度關鍵 定製開發  爬取全網

網絡爬蟲帶來的問題:網絡爬蟲對網站的性能會有影響,具備必定的法律風險,致使我的隱私泄露

網絡爬蟲的限制:
            目標網站會首先判斷 user-agent字段,只響應瀏覽器和友好爬蟲的請求
        發佈公告,robots協議 告訴全部爬蟲網站的爬取策略,要求爬蟲遵照
robots協議 Robots Exclusion Standard網絡爬蟲排除標準
網站告知爬蟲那些頁面能夠抓取,那些不行
形式:在網站的根目錄下的robots.txt文件
如:京東的robots協議  https://www.jd.com/robots
      
      
      
      
User-agent: * Disallow: /?* Disallow: /pop/*.html Disallow: /pinpai/*.html?* User-agent: EtaoSpider Disallow: / User-agent: HuihuiSpider Disallow: / User-agent: GwdangSpider Disallow: / User-agent: WochachaSpider Disallow: /
robots協議的語法:
User-agent:*
Disallow: /
若是一個網站的根目錄下沒有robots文件,則網絡爬蟲能夠無限制的爬取其上面的網絡內容

robots協議的使用
網絡爬蟲:自動或人工識別robots.txt,再進行內容爬取
約束性:robots協議是建議但非線束性,網絡爬蟲能夠不遵照,但存在法律風險





 











相關文章
相關標籤/搜索