python爬蟲抓取圖片


一、什么是爬蟲

  什么是爬蟲?爬蟲是蜘蛛么?是八爪魚么?nonono。

 

 

 

  爬蟲是指請求網站並獲取數據的自動化程序,又稱網頁蜘蛛或網絡機器,最常用領域是搜索引擎,最常用的工具是八爪魚。

  它的基本流程分為以下五部分,依次是:

    明確需求——發送請求——獲取數據——解析數據——存儲數據。

  爬蟲的三大特點:

    • 網頁都有唯一的URL(統一資源定位符,也就是網址)進行定位
    • 網頁都使用HTML(定位超文本標記語言)來描述頁面信息
    • 網頁都使用HTTP/HTTPS(超文本傳輸協議)協議來傳輸HTML數據

   爬蟲可以由什么編寫呢:

    編寫爬蟲的語言有很多,但用的最多最廣的還應該是Python,並且也誕生了很多優秀的庫和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。但是一般來說,搜索引擎的爬蟲對爬蟲的效率要求更高,會選用c++、java、go(適合高並發)。

 

二、爬蟲前期准備工作

1、准備一台性能良好的電腦

  電腦要求:windows7以上,內存四核8G以上

2、安裝python環境

  python官網下載地址:

    https://www.python.org/downloads/release/python-395/

  安裝流程:

    請自行百度。

 

3、安裝所需要的擴展

  咱們主要使用以下四個擴展:

import os # python自帶擴展不需要安裝
import requests   # pip install requests
from urllib import request  # python自帶擴展不需要安裝
from bs4 import BeautifulSoup  # 安裝命令:pip install bs4

  

4、查找一個可讀取源碼的圖片網站

 

注意注意:此鏈接僅供學習參考,請勿非法批量爬取,任何不聽勸阻,一意孤行者,如若產生違法亂紀之事,請自行承擔。(開發不易,且行且珍惜)

抓取圖片的地址:https://www.umei.cc/meinvtupian/meinvxiezhen/

 

 

三、分析網站源碼

1、分析源碼,得到獲取源碼的三個方向(編碼格式、請求方式、header請求頭)

  1.   windows默認是gbk的編碼格式,網頁一般默認是utf-8的編碼,所以直接用windows電腦抓取網頁內容信息的時候可能會遇到亂碼的問題,所以請求的時候統一編碼格式保證數據不亂嗎   
  2.   請求方式有post、get、put等方式校驗,所以選擇對的請求方式獲取頁面信息,如果不爭取可能會出現404找不到頁面或者500服務器錯誤   
  3.   header請求頭包含很多陰性信息,如果我們常見的,如:反爬機制、token校驗、cookie校驗等等

 

2、查找列表頁的唯一節點

 

 

3、根據圖片排版,查找源碼規律(相同的li標簽獲取節點)

 

 

4、獲取列表的最后一頁,獲取最后一頁的頁碼(NewPages節點下的尾頁,代表最后141頁)

 

根據圖片分頁的頁碼地址規律,我們能得到(特別注意:第一頁不能使用  index_1.htm  來查詢):
https://www.umei.net/meinvtupian/meinvxiezhen/                    第一頁沒有index
https://www.umei.net/meinvtupian/meinvxiezhen/index_2.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_3.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_4.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_5.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_6.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_7.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_8.htm
https://www.umei.net/meinvtupian/meinvxiezhen/index_9.htm
......

 

  

 

 

 

5、根據每一個圖片鏈接,進入圖片詳情

根據上題3可以看出,圖片詳情的地址為:

https://www.umei.net/meinvtupian/meinvxiezhen/233941.htm

  

 

6、查找圖片詳情的地址規律,獲取所有的詳情子圖片地址

根據圖片詳情可以查看出來每一個子圖片的詳情地址:
https://www.umei.net/meinvtupian/meinvxiezhen/233941.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_2.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_3.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_4.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_5.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_6.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_7.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_8.htm
https://www.umei.net/meinvtupian/meinvxiezhen/233941_9.htm

 

 

 

 

7、根據地址抓取圖片流,保留本地

  根據題6獲取的圖片地址進行爬取圖片信息,保存到本地,頁面分析到此結束,廢話不多說,直接上代碼,趕緊抓取。

四、開始編寫我們的爬蟲腳本

1、封裝式代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/06/06 14:48
# @Author  : Liu
# @Site    : 
# @File    : 美圖小姐姐.py
# @Software: PyCharm

import requests
import time
import os
import re
from urllib import request
from bs4 import BeautifulSoup

url_address = "https://www.umei.cc"

def get_url_path(url):
    """
    獲取地址內容信息
    :param url:
    :return:
    """
    # time.sleep(1)  # 獲取源碼的時候睡眠一秒
    obj = requests.get(url)
    obj.encoding = obj.apparent_encoding
    return obj.text


def get_page_info():
    """
    抓取每頁信息
    :return:
    """
    nums = int(input("輸入抓取的頁數:"))
    for i in range(nums):
        if i < 1:
            url = f"{ url_address }/meinvtupian/meinvxiezhen/"
        else:
            url = f"{ url_address }/meinvtupian/meinvxiezhen/index_{i + 1}.htm"
        ret = get_url_path(url)  # 獲取頁面信息
        get_bs4(ret)  # 逐頁抓取頁面信息
        print(f"第{i+1}頁完成")
    pass


def get_bs4(ret):
    soup = BeautifulSoup(ret, "html.parser")
    li_list = soup.select(".TypeList")[0].find_all(name="li")
    for i in li_list:
        # 先獲取第一張圖片
        img_src = url_address + i.a["href"]
        ret1 = get_url_path(img_src)  # 獲取頁面信息
        get_image_info(ret1, i.a.span.string, 1)

        # print(ret1)

        # 獲取分頁后的頁面圖片數量
        # script_reg = r'<script type="text\/javascript">Next\("\d+","(?P<num>\d+)",.*?\)<\/script>'
        script_reg = r'<a href="/meinvtupian/meinvxiezhen/(?P<num>[0-9_]+).htm">尾頁</a>'
        num_str = re.search(script_reg, ret1, re.S).group("num")
        page_num = int(num_str.split("_")[1])  # 獲取圖片數量

        img_lst = os.path.basename(i.a["href"]).split(".")  # 獲取圖片的后綴
        img_dir = os.path.dirname(i.a["href"])   # 獲取圖片的地址路徑
        for j in range(2, page_num+1):
            img_src = f"{ url_address }{img_dir}/{img_lst[0]}_{j}.{img_lst[1]}"
            res = get_url_path(img_src)  # 獲取頁面信息
            get_image_info(res, i.a.span.string, j)


def get_image_info(ret, name, i):
    soup = BeautifulSoup(ret, "html.parser")
    img = soup.select(".ImageBody img")[0]
    image_path = img["src"]  # 獲取圖片地址
    image_name = name  # 獲取圖片中文所屬
    img_name = f"{image_name}_{i}.{os.path.basename(image_path).split('.')[1]}"  # 獲取圖片真實名字
    # 圖片存儲
    image_dir = f"girl/{image_name}"
    if not os.path.isdir(image_dir):
        os.makedirs(image_dir)
    # 遠程打開圖片寫入到本地  第一種方式open
    # with open(f"{image_dir}/{img_name}", mode="wb") as add:
    #     add.write(requests.get(image_path).content)
    # 遠程打開圖片寫入到本地  第二種方式urllib
    request.urlretrieve(image_path, filename=f"{image_dir}/{img_name}")


print("已經開始執行了,可能需要等待一會,請您耐心等待!")
begin_time = int(time.time())
get_page_info()
end_time = int(time.time())
print(f"當前腳本執行了{end_time - begin_time}秒")
print("執行已經結束了")

 

2、簡單的爬取首頁展示圖片代碼

import os
import requests
from bs4 import BeautifulSoup
from urllib import request

url_address = 'https://www.umei.cc'
list_url = url_address + '/meinvtupian/meinvxiezhen/'
obj = requests.get(list_url)
obj.encoding = obj.apparent_encoding
content = obj.text

# 格式化頁面 soup
= BeautifulSoup(content, 'html.parser') li_soup = soup.select(".TypeList")[0].findAll("li") dir = "./girls/" for i in li_soup: if not os.path.isdir(dir): os.makedirs(dir) img_path = i.img["src"] img_suffix = os.path.basename(img_path).split('.')[1] img_url = dir + i.span.string + '.' + img_suffix request.urlretrieve(img_path, img_url)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM