python :通過爬蟲爬取資料(1)
阿新 • • 發佈:2018-11-17
(1)通過url爬取網頁資料
import urllib.request #指定url url ="https://www.baidu.com" #向伺服器發起請求,返回響應的資料,通過infor接收 infor = urllib.request.urlopen(url) #獲取接收的資料,把其儲存為Html檔案 data = infor.read().decode("utf-8) ''' 讀取infor接收的資料的三種方法 1.data = infor.readline() 逐行讀取 2.data = inor.readlines() 讀取所有文字,賦值給列表變數 3.data = infor.read().decode("utf-8) 讀取所有文字,賦值給字串變數 ''' path =r"D:\pythonItem\爬蟲與Json\file.html" with open(path,"wb") as f : f.write(infor)
#直接把資料讀取到檔案中的方法,容易帶來快取
import urllib.request
url ="https://www.baidu.com"
path =r"D:\pythonItem\爬蟲與Json\file.html"
urllib.request.urlretrieve(url,path)
urllib.request.urlcleanup() #清除快取
#返回的資料屬性
infor.info() 返回當前環境的所有資訊 infor.getcode() 返回狀態碼 if infor.getcode() == 200 or infor.getcode() == 304 : print("請求成功") urllib.request.unquote(url) 編碼url url.request.quote(url) 解碼url
#反爬蟲:模擬瀏覽器
import urllib.request url ="https://www.baidu.com" #偽裝瀏覽器 #設定請求頭 ''' User-Agent:使用者瀏覽器的基礎資訊 Content-Type:定義網路檔案的型別和網頁的編碼 X-Requested-With:伺服器判斷請求型別 Accept:告知客戶端可以處理的內型 ''' Headers ={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" " X-Requested-With": "XMLHttpRequest" "Accept": "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01" "Content-Type":" baiduApp/json; v6.27.2.14; charset=UTF-8" } #設定請求體 req = req =urllib.request.Request(url,headers=Headers) response = urllib.request.urlopen(url) data = response.read().decode("utf-8") print(data)
#為防止多次請求被封ip,需要設定隨機請求
#獲取隨機請求頭
import urllib.request
import random
user_agent_list=[
"User-Agent_One"
"User-Agent_Two"
"User-Agent_Three"
……
]
#隨機獲取列表中的User-Agent
random_agent =random.choice(user_agent_list)
req = urllib.request.Request(url)
#向請求提新增User-Agent
req.add_header("User-Agent",random_agent)
response = urllib.urlopen(req)
print(response.read().decode("utf-8"))
#如果網頁長時間未響應,那麼則要進行超時處理
timeout :爬蟲響應時間
import urllib.request
for i in range(1,100) :
try:
reesponse = urllib.request.urlopen("https://www.baidu.com",timeout = 0.5)
print(response.read().desode("utf-8"))
except:
print("請求超時,請求下一個爬蟲")