本文代碼來源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()