主頁 > 後端開發 > 一起學爬蟲(Python) — 05

一起學爬蟲(Python) — 05

2020-12-03 09:58:39 後端開發

今天我們爬圖片

  • 開始
    • 分析
    • 實踐

開始

大家好鴨,又是新的一天!
無論做什么事情,都要恪守初心,要知道我們是為了什么才學爬蟲的,比如我,就是為了爬取一些好看的圖片……
所以,今天帶大家一起爬一些好看的,圖片~
話不多說,直接高速!
http://www.win4000.com/zt/dongman.html
作為一個老二刺猿,當然是直接找動漫圖片~

分析

在這里插入圖片描述
打開頁面后往下拉,發現圖片是真滴好看……
里面還有我的02老婆~
認真分析,看到這一張張的圖片,我們是不是可以認為這些圖片是放在一個串列里的,所以一會我們爬取這個串列,然后把每一張圖片遍歷出來就可以了,對吧!(遍歷大意:用回圈把串列中每一個元素列出來)
好,打開我們的抓包工具!(審查元素 或 檢查)
在這里插入圖片描述
找到圖片所對應的位置,發現直接就有圖片了,那我們直接爬取整個頁面,再把爬取到的資料篩選一下,只要圖片的網址然后再單獨下載不就好啦~
這個想法是對的,但是打開那個網址會發現……
在這里插入圖片描述
我們上當了!
這只是一個縮略圖,那么真正的圖片在哪里呢?學過html的同學應該能直接找到,沒學過的呢,就跟著小澤一起往下走,
我們點開某一張圖片,會發現跳到了另一個頁面,

在這里插入圖片描述
在新的頁面,我們會發現有個下載按鈕,還有個左右切換的按鈕,
先點擊一下下載按鈕試試……
在這里插入圖片描述
好家伙,直接好家伙,
一看后綴名就知道,我們又上當了!
這個按鈕或許會給你一種錯覺,跟昨天的翻譯按鈕一樣,會不會回傳一個圖片,我們只要接收了再保存就好了,
這個想法是沒錯的,但是奈何這個網站太狡猾,實在是狡猾!
這個時候打開抓包工具看一下我們要的東西還有沒有,
在這里插入圖片描述
找到你啦,色圖 美圖!
我們再打開這個鏈接,看一下是不是真正的大圖,
在這里插入圖片描述
可以了可以了,夠大了!
那么我們現在就是找到了真正存放圖片的地址,但是還有一個地方不能忽略,來回切換的那個按鈕,到底有什么用?
我們點一下,注意觀察網址的變化!
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
發現規律了沒,網址每一次都會在177098_后面加1,那么177098_1是不是就是第一張圖片呢?大家可以試一下,
試完你就會發現還真的是誒,好神奇!
但是還有個問題,這一組圖片是8張,也就是177098_1到177098_8,那么其他的圖組是不是呢(一開始還以為是一張一張圖片,上當啦,hh)
在這里插入圖片描述
好的,果然讓我們發現一個,那就是說每組圖組里面圖片的數量是不固定的,只爬第一張怎么會滿足呢!
這樣想,如果我們上面那個圖組出現177098_9會怎么樣?
程式不出意外應該會報錯,那我們只要建立一個死回圈,在報錯的時候就終止回圈,就可以不用管它有多少張,我全都要的下載下來啦!
思路很明確,但是實作起來…

嗨,先硬著頭皮上吧,啃!

實踐

import requests
url = 'http://www.win4000.com/zt/dongman.html'
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}

首先匯入我們的requests模塊,先設好url和回應頭資訊,
在這里插入圖片描述
通過抓包工具我們發現,這些圖片確確實實可以當做一個串列,每一個li標簽都在class為clearfix的ul標簽里,
那我們有沒有辦法只獲取這一部分資料呢?
辦法是有的,但是突然告訴你可能會很迷茫,不過不要糾結,先用著,

from lxml import etree

這就是我們的解決方法,etree,我是這樣理解的,把網頁變成一棵樹,很easy的就找到我們要的樹葉,
當然你也可以百度一下這個模塊,多了解一下~

response = requests.get(url=url,headers=headers).text
tree = etree.HTML(response)
leaf = tree.xpath('//div[@class="tab_tj"]//ul[@class="clearfix"]/li/a/@href')

第一句大家應該能看懂吧,把回應的頁面資料以文本的形式給response,
第二句的意思呢,就是把文本形式的網頁資料給變成大樹!可以這么理解哦,因為我們要找的是某一片葉子,所以要用etree.HTML()把它大樹化~
第三句里的leaf是葉子的意思哦,要記住這個xpath,查帕斯查帕斯查帕斯,這是我們找葉子的一種方法,一般來說是可以直接在抓包工具那里直接右鍵復制xpath,就是你要找的地方的xpath,但是這個網站復制過來的xpath并不怎么管用,這也說明了方便不一定好用哈~
所以這里小澤就手打了xpath陳述句,
// 的意思是不用從根目錄開始,如果只打一個斜線就是要從/html開始了,但是我們直接找class為tab_tj的div就行了,中間的//意思就是div和ul中間不是還有東西嘛,直接跳過了,不一一打出來了,一個下劃線就是跳一級,最后的@href就是直接艾特我們要的資料,他就會乖乖過來啦!
上圖~
在這里插入圖片描述
這就是xpath方法哦,記住了,查帕斯!
那我們一會肯定要給圖片起名的嘛,就可以再弄一個葉子,最后改成@alt就行啦~

在這里插入圖片描述
這里小澤是遍歷了一下葉子,記住嘍,爬下來的是個串列~
在這里插入圖片描述
不過爬下來的網址里混入了幾個不明物體,這個小澤也不知道是為什么誒,有會的大佬歡迎留言一下~
一會用處理報錯的那個東西,try和except~
很多同學可能會還處于懵逼狀態,如果是因為對xpath那塊不理解的話,留言一下,如果點贊留言的人多的話,后續會專門寫一篇關于我們去找我們要的資料的方法相關的文章!(誰不喜歡偷懶呢,hhh)

import requests
from lxml import etree
import os
# 指定第一個url
url = 'http://www.win4000.com/zt/dongman.html'
# 指定偽裝頭
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
# 讀取第一個url
response = requests.get(url=url,headers=headers).text
# 樹化第一個頁面
tree = etree.HTML(response)
# 找到圖片對應的第二個頁面(li串列)
leaf = tree.xpath('//div[@class="tab_tj"]//ul[@class="clearfix"]/li/a/@href')

# 創建一個檔案夾
if not os.path.exists('./setu'): # 如果該檔案夾不存在,則創建
    os.mkdir('./setu')


# 遍歷每一張圖片所對應的第二個頁面
for a in leaf:
    # 防止出錯中止程式
    try:
        # 設定區域變數,177105_b
        b = 1
        # 回圈獲取圖集里的每一張圖片,默認最多10張
        while b < 11:
            # 切割-->拼接
            c = a.split('.html')[0]
            d = c+'_'+str(b)+'.html'
            # 當前圖集的下一張
            b += 1
            # 對第二個頁面開始讀取,前面的都是為了方便找url
            e = requests.get(url=d,headers=headers).text
            # 樹化第二個頁面
            f = etree.HTML(e)
            # 在第二個頁面里找到我們要的圖片地址 [0]是指把串列里第一個元素提取出來,可以這么拼接!!
            g = f.xpath('//div[@class="main"]//div[@class="pic-meinv"]/a/img/@src')[0]
            # 獲取圖片的二進制資料
            h = requests.get(url=g,headers=headers).content
            # 給圖片起名
            i = 'setu/'+g.split('/')[-1]
            # 持久化存盤
            with open(i,'wb') as fp:
                fp.write(h)

    except:
        print('出錯啦')

廢話不多說,直接把全部代碼都弄上來啦!
其實都是剛敲的,網站也是剛找的,還有點怕翻車,hhh
上面代碼里跟爬蟲有關的知識已經跟大家說的差不多了,看著注釋應該也能大概明白,要學的不是上面的代碼哦,是思路,
有了思路,就很容易有目標的去學習啦~
由于很多代碼是跟基礎有關的,而且思路也跟大家分析明白了,所以就不多說了,如果你真的真的哪里看不懂,搞不明白的話,不要怕,沒有什么別人都會我不會不好意思問什么的,放心大膽的留言,留言的時候最好帶上自己出錯的代碼或者不明白的代碼,一定鼎力相助!
一起變得更厲害吧!
話說今天沒有加表情包誒……
在這里插入圖片描述
這是小澤剛才爬下來的圖片,都是可以直接當螢屏壁紙的那種哦!
不乏春光乍露之圖,哇哦~
在這里插入圖片描述

那么,各位晚安嘍~
最后的最后,給個贊和關注再走好不好QAQ
還有已經關注了小澤的粉絲可以任性的提問題和請求哦,比如想爬哪個網站,或者想學哪方面的知識,粉絲專利哦!!!
ByeBye~

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/229200.html

標籤:python

上一篇:python基本資料型別都在這里

下一篇:Python實作在遠端服務器掛代碼—發送定時天氣預報至郵箱+每日一句(小白教程)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more