# 導入socket模塊,時間模塊 import socket # socket模塊是python自帶的內置模塊,不須要咱們去下載 import time # url爲: http://images.gaga.me/photos2/2019/0416/5cb5e9950e25a.jpeg?watermark/1/image/aHR0cDovL3Jlcy5nYWdhLm1lL3dhdGVybWFyay9wYWl4aW4xLnBuZz9pbWFnZVZpZXcyLzIvdy80MDAvaC80MDA=/dissolve/50/gravity/Center/ws/1 # ip遠程地址爲:113.229.252.244 # 端口爲:80 # 咱們寫的請求頭以下: http_req = b'''GET /photos2/2019/0416/5cb5e9950e25a.jpeg?watermark/1/image\ /aHR0cDovL3Jlcy5nYWdhLm1lL3dhdGVybWFyay9wYWl4aW4xLnBuZz9pbWFnZVZpZXcyLzIvdy80MDAvaC80MDA=\ /dissolve/50/gravity/Center/ws/1 HTTP/1.1\r\n\ Host: images.gaga.me\r\n\ User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0\r\n\r\n\ ''' # 創建對象 client = socket.socket() # 鏈接,經過(ip,端口)來進行鏈接 client.connect(("113.229.252.244",80)) # 根據請求頭來發送請求信息 client.send(http_req) # 創建一個二進制對象用來存儲咱們獲得的數據 result = b'' i = 0 # 獲得響應數據 while True: # 每次得到的數據不超過1024字節 http_resp = client.recv(1024) i = i+1 print("這是咱們第{}次得到數據,得到的數據長度是{},得到的數據內容爲{}.".format(i,len(http_resp),http_resp)) # 將每次得到的每行數據都添加到該對象中 result += http_resp # 每獲取一行數據便休眠一段時間,避免出現下次得到響應數據,由於速度太快,數據還未加載出來致使的咱們獲取不到數據的問題 time.sleep(0.3) # 根據判斷每一行獲取的數據的字節長度來判斷是否還存在數據,當該行數據長度等於0時,即已經獲取到最後一行數據,終止循環 if len(http_resp) <= 0: # 關閉瀏覽器對象 client.close() # 終止循環 break # 因爲咱們得到的響應文件是包括響應頭和圖片信息兩種的,而響應頭是以\r\n\r\n來進行結尾的. # 因此咱們想得到圖片信息能夠以此來分割,又由於響應頭是在前面的,全部咱們只須要得到第二部分的圖片便可 result = result.split(b"\r\n\r\n")[1] print("咱們得到的圖片內容爲{}.".format(result)) # 打開一個文件,將咱們讀取到的數據存入進去,即下載到本地咱們獲取到的圖片 with open("可愛的小姐姐.jpg","wb") as f: f.write(result)
運行後的結果爲:python
大概步驟爲; 1. 訪問一個能看到該圖片的網址,我訪問的是:https://v.paixin.com/photoplus/10787437瀏覽器
2. 在網頁中右擊該圖片,點擊查看元素服務器
3. 若是是使用的img標籤,咱們能夠直接得到它的src屬性中的值,即爲該圖片的網絡地址,訪問該網絡地址,咱們能夠看到跳轉到只有這一張圖片的一個網頁;若是不是使用img標籤,則能夠查看它的background屬性,該屬性中url括號中的網絡地址便是圖片的網絡地址,訪問該網絡地址,咱們能夠看到跳轉到只有這一張圖片的一個網頁。網絡
4. 本文中得到到的圖片的網絡地址爲:http://images.gaga.me/photos2/2019/0416/5cb5e9950e25a.jpeg?watermark/1/image/aHR0cDovL3Jlcy5nYWdhLm1lL3dhdGVybWFyay9wYWl4aW4xLnBuZz9pbWFnZVZpZXcyLzIvdy80MDAvaC80MDA=/dissolve/50/gravity/Center/ws/1socket
5. 此時右鍵圖片打開查看元素,點擊出現界面的最上面一行中的網絡(或者說network),而後刷新該網頁,你會發現網絡的下面加載出來一堆的東西,通常來講你點擊最上面的第一個文件就是你想要的文件。函數
6. 而後咱們就能夠得到域名,IP,請求方式,和http版本號,這樣咱們就能夠寫出咱們的請求頭了。學習
7. 而後創建client對象,經過IP和端口,以及咱們寫好的請求頭,來經過send函數對服務器發送請求url
8. 而後經過recv函數來得到服務器響應給咱們的數據,須要注意的是,該函數每次只能獲取一行數據,若是咱們想要獲取須要得到的所有數據,就須要使用循環了。spa
9. client.recv(1024)是指,咱們每次得到到的數據不得超過1024字節,即若是該行數據小於1024則直接獲取,若是多於1024則分多行進行獲取,若是該行沒有數據了,那麼它的字節長度將會是0,咱們也能夠依據此來進行結束循環的標誌。3d
10. 須要注意的是,咱們得到的數據,包括兩部分: 響應頭和圖片數據,咱們只須要圖片數據,那麼咱們能夠根據\r\n\r\n來使用split函數來進行分割,來僅僅獲取圖片部分的內容,由於響應頭都是以\r\n\r\n來進行結尾的。
11. 而後將咱們得到的圖片數據以二進制的形式(wb)來寫入文件,這樣該圖片就下載到本地了。
12. socket 套接字: 幾乎全部的網絡通訊的底層都是由套接字實現.
socket 可以爲咱們建立TCP鏈接,能夠把本身編寫好的請求報文發送給服務器了.
socket 對咱們爬蟲來講默認只能針對HTTP, 而相對於HTTPS的資源, 該模塊不行.
--------------------------------------------------------------------------------------------------------------------------------------------
本文僅爲我的學習筆記,若是侵權或python問題討論或指正,歡迎發送郵件到1730797947@qq.com,我會及時刪除或修改文章或回覆的。