1. 程式人生 > >python :通過爬蟲爬取資料(1)

python :通過爬蟲爬取資料(1)

(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("請求超時,請求下一個爬蟲")