python爬蟲爬高清圖片


本文代碼來源csdn一位叫coso度的大佬

版權聲明:本文為CSDN博主「COS0度」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/cos0du/article/details/116273972

前幾天突然間就想着去學習爬蟲,然后就看了看python,開始搞這個。然后開始百度,找到一位大佬發的東西,爬高清圖片。但是大佬的代碼弄到我這里,就會報錯,就是爬完第二張圖片就開始報錯,下邊是大佬的代碼

import re
import requests
import os
from bs4 import BeautifulSoup

def getHtml(url):  #固定格式,獲取html內容
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }  #模擬用戶操作
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print('網絡狀態錯誤')

def getUrlList(url):  # 獲取圖片鏈接
    url_list = []  #存儲每張圖片的url,用於后續內容爬取
    demo = getHtml(url)
    soup = BeautifulSoup(demo,'html.parser')
    sp = soup.find_all('div', class_="list") #class='list'在全文唯一,因此作為錨,獲取唯一的div標簽;注意,這里的網頁源代碼是class,但是python為了和class(類)做區分,在最后面添加了_
    nls = re.findall(r'a href="(.*?)"', str(sp)) #用正則表達式提取鏈接
    for i in nls:
        if 'https' in i: #因所有無效鏈接中均含有'https'字符串,因此直接剔除無效鏈接(對應第3條的分析)
            continue
        url_list.append('http://www.netbian.com' + i) #在獲取的鏈接中添加前綴,形成完整的有效鏈接
    return url_list

def fillPic(url,page):
    pic_url = getUrlList(url) #調用函數,獲取當前頁的所有圖片詳情頁鏈接
    path = './美女'  # 保存路徑
    for p in range(len(pic_url)):
        pic = getHtml(pic_url[p])
        soup = BeautifulSoup(pic, 'html.parser')
        psoup = soup.find('div', class_="pic") #class_="pic"作為錨,獲取唯一div標簽;注意,這里的網頁源代碼是class,但是python為了和class(類)做區分,在最后面添加了_
        picUrl = re.findall(r'src="(.*?)"', str(psoup))[0] #利用正則表達式獲取詳情圖片鏈接,因為這里返回的是列表形式,所以取第一個元素(只有一個元素,就不用遍歷的方式了)
        pic = requests.get(picUrl).content #打開圖片鏈接,並以二進制形式返回(圖片,聲音,視頻等要以二進制形式打開)
        image_name ='美女' + '第{}頁'.format(page) + str(p+1) + '.jpg' #給圖片預定名字
        image_path = path + '/' + image_name #定義圖片保存的地址
        with open(image_path, 'wb') as f: #保存圖片
            f.write(pic)
            print(image_name, '下載完畢!!!')

def main():
    n = input('請輸入要爬取的頁數:')
    url = 'http://www.netbian.com/meinv/'  # 資源的首頁,可根據自己的需求查看不同分類,自定義改變目錄,爬取相應資源
    if not os.path.exists('./美女'):  # 如果不存在,創建文件目錄
        os.mkdir('./美女/')
    page = 1
    fillPic(url, page)  # 爬取第一頁,因為第1頁和后續頁的鏈接的區別,單獨處理第一頁的爬取
    if int(n) >= 2: #爬取第2頁之后的資源
        ls = list(range(2, 1 + int(n)))
        url = 'http://www.netbian.com/meinv/'
        for i in ls: #用遍歷的方法對輸入的需求爬取的頁面做分別爬取處理
            page = str(i)
            url_page = 'http://www.netbian.com/meinv/'
            url_page += 'index_' + page + '.htm' #獲取第2頁后的每頁的詳情鏈接
            fillPic(url_page, page) #調用fillPic()函數

main()

代碼確實很優秀,但是我搬過來之后爬取第二張之后就開始報錯,然后就開始了自己找錯之旅,吃別人現成的我還吃不好。

 

 

 下邊是報錯的內容,然后我就開始了百度之旅,然后實在是沒找到啥,就開始去debug,

 

 

 我發現呢,他這個pic值是None,沒獲取到唄,然后往上邊看,發現呢,pic_url多出來一個很奇怪的網址,就是02這個一塊,他是兩個網址拼接到一起了

 

 

然后自己就狗了一波,直接把這個移除了用了remove函數,在 def filePic(url,page):這個模塊兒,我在第一句下邊加了一個下邊又加了一個pic_url.remove ='htp://netbian.comhttp://pic.netbian.com/'然后就可以正常使用了,其實事兒這里就差不多結束了,但是我還想知道為什么會出現這個,然后就分析:圖片又是從上邊來的,然后就往def getUrlList(url) 這個模塊看我就把這一整塊兒代碼扒下來,跑一次,把他獲取的網址打印出來看看唄

這是我扒下來的代碼

import re
import requests
import os
from bs4 import BeautifulSoup
url ='http://www.netbian.com'
def getHtml(url):  #固定格式,獲取html內容
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }  #模擬用戶操作
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print('網絡狀態錯誤')

def main(url):  # 獲取圖片鏈接
    url_list = []  #存儲每張圖片的url,用於后續內容爬取
    demo = getHtml(url)
    soup = BeautifulSoup(demo,'html.parser')
    sp = soup.find_all('div', class_="list") #class='list'在全文唯一,因此作為錨,獲取唯一的div標簽;注意,這里的網頁源代碼是class,但是python為了和class(類)做區分,在最后面添加了_
    nls = re.findall(r'a href="(.*?)"', str(sp)) #用正則表達式提取鏈接
    for i in nls:
        if 'https' in i: #因所有無效鏈接中均含有'https'字符串,因此直接剔除無效鏈接(對應第3條的分析)
            continue
        if 'pic' in i:
            continue
        url_list.append('http://www.netbian.com' + i) #在獲取的鏈接中添加前綴,形成完整的有效鏈接
    print (url_list)
main(url)

讓他把獲取的每一個網址都打印出來,果然沒看錯,下邊是打印出來的東西,果然,錯誤的網址還在

 

 然后我就去看了看找圖的那個網站,果不其然啊

 

 過濾標簽的時候沒考慮清楚,這也是網址一個,在獲取本來是我想要的網址的時候,出來了一點問題,下邊的語句跟他一拼接就出錯了。

 

 事情至此圓滿結束。然后我就在def getUrlList(url):這個模塊兒下邊的if 語句后又加了一個if

if 'pic' in i:

  continue

然后就沒毛病了,大家如果對這個感興趣的話,可以去參考大佬的文章,網址在我這邊隨筆開頭,本文是一個我找錯誤的過程,雖然錯誤很小,但還是花了我很長時間,接下來打算去了解一下這幾個庫,我把自己修改的代碼(其實就加了一句話,代碼全是老哥的,希望大家把代碼吃透)附在本文最后,給來學習的哥們兒參考,歡迎大家跟我一起探討。爬蟲的學習。

import re
import requests
import os
from bs4 import BeautifulSoup

def getHtml(url):  #固定格式,獲取html內容
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
    }  #模擬用戶操作
    try:
        r = requests.get(url, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print('網絡狀態錯誤')

def getUrlList(url):  # 獲取圖片鏈接
    url_list = []  #存儲每張圖片的url,用於后續內容爬取
    demo = getHtml(url)
    soup = BeautifulSoup(demo,'html.parser')
    sp = soup.find_all('div', class_="list") #class='list'在全文唯一,因此作為錨,獲取唯一的div標簽;注意,這里的網頁源代碼是class,但是python為了和class(類)做區分,在最后面添加了_
    nls = re.findall(r'a href="(.*?)"', str(sp)) #用正則表達式提取鏈接
    for i in nls:
        if 'https' in i: #因所有無效鏈接中均含有'https'字符串,因此直接剔除無效鏈接(對應第3條的分析)
            continue
        if 'pic' in i:
            continue
        url_list.append('http://www.netbian.com' + i) #在獲取的鏈接中添加前綴,形成完整的有效鏈接
    return url_list
    print (url_list)

def fillPic(url,page):
    pic_url = getUrlList(url) #調用函數,獲取當前頁的所有圖片詳情頁鏈接
    
    path = './美女'  # 保存路徑
    for p in range(len(pic_url)):
        pic = getHtml(pic_url[p])
        soup = BeautifulSoup(pic, 'html.parser')
        psoup = soup.find('div', class_="pic")
        picUrl = re.findall(r'src="(.*?)"', str(psoup))[0] 
        pic = requests.get(picUrl).content 
        image_name ='美女' + '第{}頁'.format(page) + str(p+1) + '.jpg' 
        image_path = path + '/' + image_name 
        with open(image_path, 'wb') as f: 
            f.write(pic)
            print(image_name, '下載完畢!!!')

def main():
    n = input('請輸入要爬取的頁數:')
    url = 'http://www.netbian.com/meinv/'  
    if not os.path.exists('./美女'):  
        os.mkdir('./美女/')
    page = 1
    fillPic(url, page)  
    if int(n) >= 2: 
        ls = list(range(2, 1 + int(n)))
        url = 'http://www.netbian.com/meinv/'
        for i in ls: 
            page = str(i)
            url_page = 'http://www.netbian.com/meinv/'
            url_page += 'index_' + page + '.htm' 
            fillPic(url_page, page) 

main()

 


免責聲明!

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



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