1. 程式人生 > >Python練手爬蟲系列No.1 知乎福利收藏夾圖片批量下載

Python練手爬蟲系列No.1 知乎福利收藏夾圖片批量下載

前言

學習總是要有動力的,我最開始學習爬蟲也是看著崔大的爬蟲新手系列Python爬蟲學習系列教程-靜覓,收穫很大,但是除了爬爬糗百、百度文庫,總得有些動力讓你的學習變成一個主動行為吧。好吧,直接步入正題,常年混知乎,自然知道知乎已經是網際網路的一大內容輸出地了,至於什麼內容就仁者見仁智者見智了。而包含的各種已經建立好的收藏夾則是種類豐富多彩。比如今天就用這個收藏夾來做一個圖片爬蟲吧~
說明一下,後面我寫的爬蟲都將主要使用python3的程式碼,畢竟要緊跟時代

這裡寫圖片描述

分析結構

首先要說明的是,選擇收藏夾而不是問題作為開始,是因為收藏夾的瀏覽不需要登入,比較簡單,作為開篇還是比較合適的


我們的目的是抓取收藏夾內的圖片,而收藏夾是以收藏夾-答案流-答案的形式組成的,所以爬蟲肯定分為兩部分。

  • 第一步,自動翻頁批量抓取收藏夾內所有的答案連結url
  • 第二步,對答案url進行遍歷,對每一個答案進行一次抓取,獲得包含的所有圖片url,並且將圖片下載到本地

還是比較簡單的,我們就直接開始吧。第一步自然是研究下網頁結構

這裡寫圖片描述
這裡寫圖片描述
收藏夾的翻頁完全可以通過傳送url進行,那麼我們就直接做實驗

一、獲取所有答案的連結URL

1.抓取網頁原始碼

使用python自帶的urllib.request庫

import urllib.request
page = 1
root_url = 'https://www.zhihu.com/collection/52598162?page=' + str(page)
request = urllib.request.Request(root_url ) response = urllib.request.urlopen(request) content = response.read().decode('utf-8')

這裡寫圖片描述
測試一下,可以看到,沒有問題,直接獲取了這一頁的所有原始碼。

2.篩選原始碼內url資料

下面需要從原始碼中抓取我們需要的url,url的狀態是什麼呢?
這裡寫圖片描述
這時候我們就可以使用大名鼎鼎的美麗湯庫了,beautifulsoup,可以按照結構來獲取資料

from bs4 import Beautifulsoup
soup = BeautifulSoup(content, 'html.parser'
) url_tems = soup.find_all('a', class_="toggle-expand")

這裡寫圖片描述
可以看到,這裡的url_tems並不是我們需要的資料,因此後面還需要通過.get(‘herf’)來得到url

url_sets = []
for url in url_tems:
    full_url = urllib.request.urljoin('https://www.zhihu.com', url.get('href'))
    url_sets.append(full_url)

這樣,我們就獲得了完整的url資訊。

3.獲取收藏夾的最大頁碼

同時我們還需要獲得最下面最大的頁面頁碼才知道該需要抓取到什麼時候。
這裡寫圖片描述
這裡寫圖片描述
我們可以通過獲取這些數字,然後通過max函式取出最大值,程式碼見下方

page_soup = soup.find_all('a',href = re.compile(r'\?page=\d+'))
page_digit = set()
for page in page_soup:
    test = page.get_text()
    if test.isdigit():
        page_digit.add(test)
max_page =int(max(page_digit))

page.get_text()即找出來的所有文字,包含1,2,3,4,32,下一頁。通過isdigit()判斷,就能篩選出數字。在通過一個max()函式,就可以去的最大的數字。這樣就能得到收藏夾的總頁數。

4.組合在一起

這裡前面的程式碼略,直接放迴圈抓取的部分
geturl()代指前面的程式碼

def geturls_set():
    page = 1
    urls_set = []
    while True:
        root_url = 'https://www.zhihu.com/collection/52598162?page=' + str(page)
        urls = geturl(root_url)
        urls_set.extend(urls)
        if page == max_num:
            break
        page += 1
    return urls_set

二、抓取答案資料

這裡寫圖片描述

開啟一篇答案,檢視原始碼,看到
data-original=”https://pic4.zhimg.com/v2-5b96b2cd9dc1b6a430b54e9e272a1acb_r.jpg”
正式我們想要的圖片,於是乎,一閉眼一睜眼,程式碼寫出來了
先用class定位,在用.get()提取屬性

image_url_tem = soup.find_all('img', class_="origin_image zh-lightbox-thumb lazy")
for url_tem in image_url_tem:
    image_urls.add(url_tem.get('data-original'))

image_urls就是一篇文章所有的圖片url(以列表形式儲存)

三、下載圖片

urllib.request.urlretrieve這個函式可以直接下載圖片。一個迴圈,搞定~

def downloadPic(self,image_urls):
    count = 1
    path = os.getcwd()
    os.makedirs(str(path)+'\\beauty')
    for url in self.image_urls :
        try:
            urllib.request.urlretrieve(image_urls,str(path)+'\\beauty\\%s.png'%count)
        except:
            print("連結失效")
        print("正在下載第%d張圖片"%count)
        count = count +1
    print("已經下載完畢,共下載%d張圖片"%count)
    print("Enjoy it!")

這裡寫圖片描述

這裡寫圖片描述

JUST ENJOY IT!

四、組合程式碼

相關推薦

Python爬蟲系列No.1 福利收藏圖片批量下載

前言 學習總是要有動力的,我最開始學習爬蟲也是看著崔大的爬蟲新手系列Python爬蟲學習系列教程-靜覓,收穫很大,但是除了爬爬糗百、百度文庫,總得有些動力讓你的學習變成一個主動行為吧。好吧,直接步入正題,常年混知乎,自然知道知乎已經是網際網路的一大內容輸出地了

Python爬蟲系列No.2 抓取問題下所有回答中的圖片(待續)

接著上一篇Python練手爬蟲系列No.1 知乎福利收藏夾圖片批量下載,今天我們來按照知乎問題抓圖片!比起收藏夾,更加直接精準。為什麼先抓收藏夾後抓取問題呢,其實是因為知乎的一點限制。 那就是!知乎問題下方的回答是通過動態載入的……普通的靜態網站抓取的辦法是沒

Python系列之--名片管理系統

完成 elif menu 顯示 log pytho lob pos app 列表或字典做全局變量在函數中調用可以不用加global # 用來存儲名片 card_infors = [] def print_menu(): """完成打印功能菜單""" p

python爬蟲系列(3.1-xpath語法的介紹)

一、關於xpath的認識 xpath(XML Path Language)是一門在XML和HTML文件中查詢資訊的語言,可用來在XML和HTML文件中對元素和屬性進行遍歷。 二、xpath的基本語法 1、選擇節點   2、謂語 謂語是用來找出某個特定的

python爬蟲系列(2.1-requests庫的基本的使用)

一、基本認識 1、傳送一個get請求 import requests if __name__ == "__main__":     # 獲取一個get請求     response = requests.get('http://htt

python爬蟲系列(4.1-關於檔案的寫入)

一、關於python中json模組的回顧 1、json.dumps():將python中字典轉換為json字串 2、json.loads():將json字串轉換為python字典 二、使用python中自帶的檔案寫入功能 1、使用前面使用 bs4 爬取獲取貴州農產品爬取的資料

$python爬蟲系列1)——一個簡單的爬蟲實例

name 響應 -s 鏈接 實例 blog itl 匹配 列表 本文主要實現一個簡單的爬蟲,目的是從一個百度貼吧頁面下載圖片。 1. 概述 本文主要實現一個簡單的爬蟲,目的是從一個百度貼吧頁面下載圖片。下載圖片的步驟如下: 獲取網頁html文本內容; 分析html中圖

$python爬蟲系列1)——一個簡單的爬蟲例項

  本文主要實現一個簡單的爬蟲,目的是從一個百度貼吧頁面下載圖片。 1. 概述 本文主要實現一個簡單的爬蟲,目的是從一個百度貼吧頁面下載圖片。下載圖片的步驟如下: 獲取網頁html文字內容; 分析html中圖片的html標籤特徵,用正則解析出所有的

python爬蟲系列1):使用python3和正則表示式獲取貓眼電影排行榜資料

簡述 這次打算寫一個爬蟲系列,一邊也想好好總結鞏固學習的知識,一邊做總結筆記,方便以後回憶。這次我們使用Python3和正則表示式來爬取一個簡單html頁面資訊,就從貓眼電影的排行榜單開始吧。如果讀到這篇文章的是位大神,期望您能不吝賜教,指正錯誤,如果您是小白,咋們可以一同

python爬蟲--模擬登錄

print url 開發 數字 pan tps 參數 content 開發者 1、處理登錄表單 處理登錄表單可以分為2步: 第一、查看網站登錄的表單,構建POST請求的參數字典; 第二、提交POST請求。 打開知乎登錄界面,https://www.zhi

Python,封裝日誌模塊,v1

日誌 clas inf cti rop 美化 時間 dig als 代碼:Python3# -*- coding: utf-8 -*- ''' --封裝了logging模塊,僅保留關鍵設置,美化了輸出格式 ''' i

Python,封裝日誌模塊,v2

return randint des erro ini alt map 重復 int 前面第1版寫好後,很淩亂,主要的問題在於,Python不支持方法重載,想要靈活創建對象,當時的變通辦法是,先鏈式地有選擇地設置屬性(方法重載的本質就是有選擇地設置屬性),再做實例化,這樣導

Python,pandas

.py multi 0.12 sam 函數 保留 dataframe Y軸 1.4 ''' http://pandas.pydata.org/pandas-docs/stable/10min.html numpy的主要數據結構是ndarry

Python,造樣本

import 樣本 pandas imp 可復用 時長 dataframe i+1 panda import pandas as pd def getEmpDataFrame(num): '''創建一份可復用的數據,有一定的隨機性

70個Python項目

-- 生成 英文 命令行 交換 djang 預測 python3 引擎 前言: 不管學習那門語言都希望能做出實際的東西來,這個實際的東西當然就是項目啦,不用多說大家都知道學編程語言一定要做項目才行。 這裏整理了70個Python實戰項目列表,都有完整且詳細的教程,你可以從中

python專案之股票指數提醒服務

前言 一直比較關心各大經濟指數的走向,但是發現很多這方面的訊息都是需要開啟指定網頁或app才能知道的,沒有找到提供主動推送資料的服務。於是就想結合python自己動手搞一個,正好用來練手,很快就搞定了,本來計劃使用簡訊推送的但發現簡訊管制很嚴,還是用郵箱湊合一下吧。 主要作用

個人python專案之微報命令列版V1.0開源

前言 還記得不久之前,寫過一篇關於團隊管理工具的調研文章傳送門,當時調研了一大圈發現對於管理層來說最大的痛點就是沒有一個現成的工具支援word週報的匯出,傳統企業還是比較偏向紙質檔案的。再加上想練練python說動手就動手,於是就有了這個專案。 專案定位算是練練手+解決自身痛點。現

整理了適合新手的20個Python小程式

100個Python練手小程式,學習python的很好的資料,覆蓋了python中的每一部分,可以邊學習邊練習,更容易掌握python。 本文附帶基礎視訊教程:私信回覆【基礎】就可以獲取的 【程式1】 題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少? 1.程式分析:可

python小程式之二

判斷是否為完全數 題目:一個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如6=1+2+3.程式設計    輸入一個數,判斷是否是“完數”。 程式分析:對輸入的數j進行因子分解(這裡的因子不是質因數): (1)初始化一個s變數,將j賦值給s,使用迴圈和取餘

Python經典100例

100個Python練手小程式,學習python的很好的資料,覆蓋了python中的每一部分,可以邊學習邊練習,更容易掌握python。 【程式1】 題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少? 1.程式分析:可填在