[心得] Python爬蟲教學(1)

好久沒更新了…

上一篇(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)