Python爬蟲爬取圖蟲網的圖片

這是我第一個Python爬蟲項目,Python基礎太差,花了好久,下面詳細的解釋一下這個項目,因為是第一個項目,可能邏輯有些混亂,代碼也不夠簡潔,歡迎指正,哈哈

之前看到好多文章關于爬取網頁圖片的,于是就找到了圖蟲網,爬取上面的星(xiao)空(jie)圖(jie)

先說明一下,爬蟲的基本流程

  1. 構造url,然后請求此url
  2. 根據返回的數據,分析響應的內容,找到圖片的鏈接
  3. 請求圖片的鏈接,然后將它保存在本地

下面看一下要爬取的網頁
圖蟲網
我們選擇一個標簽來查看,在瀏覽器中按住F12,調出開發者web開發工具箱

我們隨意點開一個圖集,開始分析一下

將url里面的數字放到第一張圖片里面搜索一下,看一下是否能夠查到

可以搜索到,所以考慮可以請求這個網頁,然后獲取這個網頁中所有圖集的url,然后在每個圖集的url的網頁里面找到每一張圖片的鏈接,最后再下載

但是這個網頁會在用用戶不斷的向下滾動時,不斷地加載新的內容,這樣就不好辦了,就像下面這樣(web開發工具里面選擇網絡)

可以在上面圖片畫紅線的地方,發現一個小小的規律,就是這個鏈接,

https://tuchong.com/rest/tags/少女/posts?page=2&count=20&order=weekly

多此加載之后發現只有page=2這個數字2變化,于是有了轉機,打開這個鏈接,會看到這個東西


這是一個json數據,不太了解這個,不過查資料后發現可以用Python中的json庫進行檢索。就是json.loads()將json編碼的字符串轉化為Python數據結構

進一步分析這個數據,可以發現在postList下面的,所有url字典對應的都是一個圖集的url

好了,第一步搞定

然后就是每個圖集中的圖片的處理,在一個圖集中,和前面一樣的分析方法,
但是發現了一個比較有有意思的事情,就是在點擊刷新的時候,頁面會發現變化,如下圖(我也不太清楚為什么,不是很了解前端的知識。)


我們就用下面的圖來分析
審查一下圖片我們就可以發現了

這個鏈接在原來的html源代碼中,這樣就可以用正則表達式來匹配出了。

到此為止,找到了每個標簽下面的每個圖集的鏈接,還有每個圖集下面的每張圖片的鏈接,思路清晰了,就可以來編寫代碼了

import os
import re
import json
import requests
import time
import urllib.parse
import random
import traceback

#定義要爬取的標簽和正在爬取的頁數
def UserUrl(theme,pagenum):
    url = "https://tuchong.com/rest/tags/%(theme)s/posts?page=%(pagenum)s&count=20&order=weekly" % {'theme': urllib.parse.quote(theme), 'pagenum': pagenum}
    #print(url)
    return url

#利用requests使用get方法請求url,使用User-Agent是為了防止被反爬,這樣使得我們的爬取行為更像人的行為
def GetHtmltext(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
    }
    try:
        r = requests.get(url, headers=head, timeout=30)
        r.raise_for_status()  #如果返回的狀態碼不是200,就到except中
        return r
    except:
        pass

#定義獲取一個pagenum頁面中的所有圖集的URL鏈接的函數
def PictureFatherUrl(user_url):
    try:
        raw_data = GetHtmltext(user_url)
        j_raw_data = json.loads(raw_data.text)   #將獲取的網頁轉化為Python數據結構
        # print(j_raw_data)
        father_url = []                    #將每個圖集的url定義為father_url的一個列表
        for i in j_raw_data['postList']:   #解析出的j_raw_data是一個多重字典,在這里先將postList字典的內容取出來
            father_url.append(i['url'])     #然后再取出鍵為“url”的值
        # print(father_url)
        # print(len(father_url))
        return father_url
    except:
        return

#定義獲取一個圖集中所有圖片的url鏈接
def PictureUrl(url):
    try:
        html = GetHtmltext(url)
        #利用正則表達式來匹配
        url_list = list(re.findall('<img id="image\d+" class="multi-photo-image" src="([a-zA-z]+://[^\s]*)" alt="">', html.text))
        return url_list
    except:
        pass

#定義一個圖集中所有圖片的下載
def Download(url):
    url_list = PictureUrl(url)
    for i in url_list:
        r = GetHtmltext(i)
        file_name = os.path.join(save_path, i.split('/')[-1])
        # file_name = str(i)
        with open(file_name, 'wb') as f:
            f.write(r.content)
            f.close()
        time.sleep(random.uniform(0.3, 0.5))  #為防止被反爬,在這里random了0.3-0.5的數,然后在下載一張圖片后,sleep一下
        print('save %s' % file_name)

#定義主函數
if __name__ == '__main__':
    theme = input("你選擇的標簽(如果你不知道有什么標簽,去https://tuchong.com/explore/去看看有什么標簽吧,輸入不存在的標簽無法下載哦):")
    pagenum_all = int(input("你要爬取的頁數(不要太貪心哦,數字太大會被封IP的):"))
    save_path = os.path.join(theme)
    m = 0
    if not os.path.exists(save_path):
        os.makedirs(save_path)
        print("我知道你沒有創建保存路徑,我把文件存在和此腳本同樣的路徑下的叫做“ %s ”的文件夾下面了" % theme)
    for i in range(1, pagenum_all+1):
        n = 0
        m += 1
        print("正在下載第%d頁,一共%d頁" % (m, pagenum_all))
        user_url = UserUrl(theme, i)
        father_url = PictureFatherUrl(user_url)
        for j in father_url:
            n += 1
            print("正在下載第%d套圖,一共%d套圖" % (n, len(father_url)))
            Download(j)
            time.sleep(random.randint(6, 10))  #同樣為了反爬,也random了6-10之間的數,更真實的模擬人的操作

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

推薦閱讀更多精彩內容