r.encoding 從HTTP頭部猜想的響應內容編碼方式,是從HTTP頭部中charset字段得到的,若是header中不存在charset,則認爲編碼爲ISO-8859-1,這種編碼方式不可以解析中文
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文件
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協議是建議但非線束性,網絡爬蟲能夠不遵照,但存在法律風險