經過socket來下載一張圖片

# 導入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,我會及時刪除或修改文章或回覆的。

相關文章
相關標籤/搜索