1. 程式人生 > >Python爬蟲第二天

Python爬蟲第二天

主機 and oar handle bold use put 安全 就會

Python爬蟲第二天 超時設置 有時候訪問網頁時長時間未響應,系統就會判斷網頁超時,無法打開網頁。如果需要自己設置超時時間則: 通過urlopen()打開網頁時使用timeout字段設置 import urllib.request for i in range(1,100): #循環99次 try: file = urllib.request.urlopen("http://yum.iqianyue.com",timeout=0.1) #設置超時時間為0.1s data = file.read() print(len(data)) except Exception as e: print("出現異常:"+str(e)) #網站服務器性能不好的時候可能出現異常 一般我們不想出現超時異常就可以把時間設置長一點如:30。
HTTP協議請求實戰: 在客戶端和服務器端之間消息傳遞可以使用http協議請求進行 http六種類型: get請求:通過url地址傳遞信息。 post請求:可以向服務器提交數據,比較主流比較安全。 put請求:請求服務器存儲一個資源,通常要指定存儲的位置。 head請求:請求獲取報頭信息。 delete請求:請求服務器刪除一個資源。 options請求:獲取當前url所支持的請求類型。 一般使用get和post較多只介紹這兩種:
get請求: 例如我們想在百度上查詢一個關鍵詞,如何用爬蟲進行處理呢? 步驟:首先我們打開百度輸入關鍵詞如“xpath”之後回車,我們觀察一下url的變化: https://www.baidu.com/s?wd=xpath&rsv_spt=1&rsv_iqid=0xdb261ac900003e2f&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_n=2&rsv_sug3=1
我們分析一下:字段wd是我們查詢的值,也就是說wd就是存儲用戶要檢索的關鍵詞 我們簡化下網址 "https://www.baidu.com/s?wd=關鍵詞" 這時我們把https://www.baidu.com/s?wd=xpath 也加入瀏覽器刷新一下,也能出現關鍵詞,這說明我們在百度上查詢關鍵詞會用get請求進行。 接著我們實現 import urllib.request keywd = "xpath" url = "http://www.baidu.com/s?wd=" + keywd req = urllib.request.Request(url) data = urllib.request.urlopen(req).read() fhandle = open("D:/crawler/6.html", "wb") fhandle.write(data) fhandle.close() 如果要檢索的關鍵詞是中文,則要對上述代碼進行優化: import urllib.request # keywd = "xpath" keywd="楊守鶴" url = "http://www.baidu.com/s?wd=" #註意不是https key_code=urllib.request.quote(keywd)#這裏對關鍵詞部分進行編碼 url_all=url+key_code req = urllib.request.Request(url_all)#通過url參數構建Request對象 data = urllib.request.urlopen(req).read()#通過urlopen打開構建的Request對象 fhandle = open("D:/crawler/7.html", "wb") fhandle.write(data) fhandle.close() 這裏我們學習到滿足get請求的url格式:"http://網址?字段名1=字段內容1&字段名2=字段內容2 ..." post請求 我們在進行註冊登錄的時候時常用到post請求 我們先打開一個網頁:http://www.iqianyue.com/mypost/ 輸入數據提交後會顯示信息。 如何使用爬蟲自動實現呢? 步驟: 首先設置url地址,我們分析一下,在點擊了提交之後會傳遞到當前頁面進行處理,所以處理的頁面應該是: http://www.iqianyue.com/mypost/,我們設為url。之後我們在網頁右擊選擇查看頁面源代碼,找到對應的form表單部分 ,進行分析。 <form action="" method="post"> name:<input name="name" type="text" /><br> passwd:<input name="pass" type="text" /><br> <input name="" type="submit" value="submit" /> 我們看到屬性值 我們使用字典形式 格式:{字段名1:字段值1,字段名2:字段值2......} 如:{"name":"yang","pass":"a123456"} 之後我們還要對數據進行編碼處理:使用urllib.parse.urlencode 然後創建Request對象傳入url和數據,接著我們可以使用之前學過的add_header()添加頭信息,模擬瀏覽器爬取。之後就按以往進行處理即可。 import urllib.request import urllib.parse url = "http://www.iqianyue.com/mypost/" postdata=urllib.parse.urlencode({ "name":"yang", "pass":"a123456" }).encode(‘utf-8‘)#將編碼設置為utf-8 req = urllib.request.Request(url,postdata) req.add_header(‘User-Agent‘,‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36‘) data = urllib.request.urlopen(req).read() fhandle = open("D:/crawler/8.html", "wb") fhandle.write(data) fhandle.close() 代理服務器設置 有時候使用同一個ip去爬取同一個網站,久了就會被對方服務器屏蔽,怎麽辦?? 這時我們就要使用一招:"瞞天過海、暗度陳倉",也就是使用代理服務器。 這裏有一個網址:http://yum.iqianyue.com/proxy 裏面有更新很多代理ip 我們選擇一個: 格式:"網址:端口號"即:110.52.235.249:9999 #實現使用代理服務器爬取url網頁功能 def use_proxy(proxy_addr,url): import urllib.request proxy=urllib.request.ProxyHandler({‘http‘:proxy_addr}) opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler) urllib.request.install_opener(opener) data=urllib.request.urlopen(url).read().decode(‘utf-8‘) return data proxy_addr="58.219.8.8:1080" data=use_proxy(proxy_addr,"http://www.baidu.com")#傳遞ip和要爬取的url print(len(data))#//後續處理 如果:由於連接方在一段時間後沒有正確答復或連接的主機沒有反應,連接嘗試失敗。> 說明IP可能失效了,要換一個試試,實際上我們可以實現多個ip用程序實現一個不行自動切換為下一個。

 此文是我在學習《精通Python網絡爬蟲》(韋瑋著)的總結,純手打。

Python爬蟲第二天