好久沒更新了…
上一篇(Python爬蟲入門)已經是上個月初的事XD
今天就先來一篇最近學python爬蟲的心得
首先先來個版權聲明:
這篇取自:小白爬蟲第一彈之抓取妹子圖- 靜覓 崔慶才的個人博客
這是我能找到的python爬蟲教學文中,最淺顯易懂的優質好文
版主真是佛心來著!
不過版主使用的爬蟲來源:mzitu.com能正常連線的時間實在太少了
網站都連不上,那還要寫爬蟲程式嗎? XDD
所以我就改用另一個來源:meizitu.com
網站都換另一個了,那爬蟲程式必然要修改
加上原作者一開始的程式碼是平鋪直敘
後來加了函式最後用class
這對python的新手駕駛來說有點一時難以理解
所以我就加以修改了
這一個版本完全沒有函式跟class
完全直述語法,setp by setp,淺進淺出
應該沒有比這更簡單的,可以完成一個真正有用的爬蟲程式
直接看程式碼吧! come some code:
''' author:smilehsu requirements:Windows7、python3.52 date:2017/02/12 ''' import os, re, requests, shutil from bs4 import BeautifulSoup headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"} base_url='http://meizitu.com/a/' dir_path='d:\meizitu' all_page_link=[] #列出全部套圖的連結 #num的範圍 1 <= num <= 5481 #先爬50頁試試看 num=50 for i in range(1,num+1): page=base_url+str(i)+'.html' all_page_link.append(page) #print(all_page_link) error_page=[] #把頁面連結的list傳進來,逐頁處理 #ll_page_link[30:35] 先丟30~35頁測試用 for get_album in all_page_link[30:35]: page_html=requests.get(get_album) page_html.encoding='gb2312' page_soup=BeautifulSoup(page_html.text,'lxml') try: #取得頁面的title跟該頁面的圖片連結 title=page_soup.find('div',{'class':'metaRight'}).find('a') #取得圖片連結 album_pics=page_soup.find('div',{'class':'postContent'}).find_all('img') print(get_album) print(title.text) #print('目前工作目錄:'+os.getcwd()) dir_name=title.text isExists = os.path.exists(os.path.join(dir_path, dir_name)) mydir_path=os.path.join(dir_path, dir_name) if not isExists: print('建立資料夾:'+mydir_path) os.makedirs(mydir_path) else: print('資料夾已存在'+mydir_path) except: print('error: {}'.format(get_album)) error_page.append(get_album) pass #開始下載前先切換到要存放圖檔的資料夾 os.chdir(mydir_path) for pic in album_pics: #路徑check #print('目前工作目錄:'+os.getcwd()) #頁面裡的圖片連結 pic_src=pic['src'] print('要下載的圖檔連結'+pic_src) #下載圖片後要存檔的檔名 pic_name=dir_name+'_'+pic_src.split('/')[-1] #下載圖片 get_pic=requests.get(pic_src,headers=headers,stream=True) f=open(pic_name,'wb') shutil.copyfileobj(get_pic.raw,f) f.close() del get_pic
後續:
1.本系列會照著原作:靜覓 崔慶才的個人博客 進行改寫
2.對本篇有問題可以問我(現在還沒有留言功能)(謝謝指教)
2018/05/20 新增有class的寫法
code:
''' author:smilehsu blog:smilehsu.cc requirements:Windows7、python3.52 ''' import os, re, requests, shutil from bs4 import BeautifulSoup #base_url='http://meizitu.com/a/' all_link=[] error_page=[] dir_path='d:\meizitu' class meizitu(): def all_url(self,url,maxpage): for i in range(1,maxpage+1): page_url=url+str(i)+'.html' all_link.append(page_url) for p in all_link: html=self.request(p) soup=BeautifulSoup(html.text,'lxml') try: #取得頁面的title跟該頁面的圖片連結 title=soup.find('div',{'class':'metaRight'}).find('a') #取得圖片連結 img_url=soup.find('div',{'class':'postContent'}).find_all('img') #測試用 印出頁面的title print(title.text) #測試用 #print(len(img_url),img_url) #要存圖片的資料夾檔名就用頁面的title dirname=title.text #建立資料夾 self.mkdir(dirname) #儲存圖檔 self.save(img_url) except: print('error: {}'.format(p)) error_page.append(p) pass def request(self,url): headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"} res = requests.get(url, headers=headers,stream=True) res.encoding='gb2312' return res def mkdir(self, dirname): dirname=dirname.strip() isExists = os.path.exists(os.path.join(dir_path, dirname)) mydir_path=os.path.join(dir_path, dirname) if not isExists: print('建立資料夾:'+mydir_path) os.makedirs(mydir_path) os.chdir(mydir_path) return True else: print('資料夾已存在'+mydir_path) os.chdir(mydir_path) return False def save(self, img_url): for pic in img_url: #路徑check #print('目前工作目錄:'+os.getcwd()) #頁面裡的圖片連結 pic_src=pic['src'] print('要下載的圖檔連結'+pic_src) #下載圖片後要存檔的檔名 #pic_name=dir_name+'_'+pic_src.split('/')[-1] pic_name=pic_src.split('/')[-1] #下載圖片 get_pic=self.request(pic_src) f=open(pic_name,'wb') shutil.copyfileobj(get_pic.raw,f) f.close() del get_pic Meizitu=meizitu() Meizitu.all_url(url='http://meizitu.com/a/',maxpage=5)