Python爬蟲第二天
阿新 • • 發佈:2019-01-26
主機 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爬蟲第二天