iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 29
0
自我挑戰組

30天Python學習分享路程系列 第 29

Python 分享三年前大學爬蟲專題心得

  • 分享至 

  • xImage
  •  

前言

就在三年前的大學,教授向我推薦了Python在一兩年後會很紅的,當時我就相信了他,果不起然的看看這一年的Python竄起的速度,但是我還是沒有在期末專題中拿到獎項,原因是大學就好好做大學評審教授有興趣的東西,你才有機會得獎

我們的題目

做一個爬蟲,爬學校租屋網,591租屋網,與其他的租屋網將數據存到我們的資料庫後做一個網站,目標很像trivago的網站那樣,但是當時跟兩個資工宅的朋友,在討論說我做後端你做前端還是同時做一樣的,這時你千萬不要相信你的同學,將工作做好分工不然就是一個人獨自奮戰就好,因為好的隊友讓你上天堂,雷的隊友讓你被當掉

故事就這樣開始了

第一步我找到了一個模組可以請求網站,可以抓取到網站的數據,這個模組叫urllib,但是問題來了,當時我並沒有使用PyCharm,遇到了https問題,後來無法解決找下一個模組

我找到了Mechanize模擬了一個瀏覽器設置了一些標頭檔,終於可以獲得請求了,超開心的,將數據抓下來要存取資料時發現了居然是亂碼,Unicdoe!!! 人生又從彩色掉到黑白,後來找到了我只要在最上方宣告 utf-8編碼就解決了這個問題

故事就這樣順利了來到我要分析這網站的數據格式,我先擬劃我要抓的項目,用判斷的把我要的標題內容做判斷,其他的我不要,用了if else去做 ,然後爬一個單一網頁很順利的成功了, 但是他XX的 存到csv檔又是亂碼

人生又變黑白了,後來我又找到了csv檔的編碼方式,忘記怎麼解決了,故事就這樣進行到存進去已經沒有問題,後來有想著說怎樣可以抓到我要的HTML tag位置只想抓我要的tag就好,於是我就找到了BeautifulSoup4,當時人生一片彩色
BS4,讓我可以流利的操作HTML上的所有元素,眼看著我的專題就要完成了,但是一個頁面一個頁面去爬蟲,你認為教授可能讓你過嗎? 你還是做夢好了

於是我就在想著去抓page讓page一直可以往下找,我找到的方法,好的網站他的URL就有?page= ? 他可以直接用url方式去try,這種的話非常簡單,但是有些網站就是不想讓你爬用一堆加密的ID編碼...或者是javascript onclick作轉跳他X的要怎麼解決???

搞了很久就在專題要弄不出來的時候,我找到了Selenium超級強大的自動化 Web Driver,找到了他可以模擬使用者點擊按鈕的方式+上抓取XPATH就能做到,太好了,最後用了這招把三個網站爬了下來

到了期末專題評審,其他兩個同學沒有把前端完成 GG了 ,就這樣 被當了送到急診室,暑期在評一次,當時的我氣到怒火攻心差點吐血跟他們說沒關係大不了明年在評一次希望他們在暑假把前端完成,就這樣我們的一位同學終於覺醒了,把前端完成了我也哭了出來,終於可以畢業了 嗚嗚嗚

這是我當時寫得糞Code,反正現在也用不到了,就拿來分享吧

#-*- coding: UTF-8 -*-



#------------程式所應用到的函數庫-------------------- 
#import wx, string
from time import asctime
import csv                   
import urllib2
import urllib
from bs4 import BeautifulSoup
import mechanize
from selenium import webdriver
import os
import sys
#-------------------------------------

#url1=urllib2.urlopen("http://rent.591.com.tw/house-rentSale-8-0-0-0-%E5%8B%A4%E7%9B%8A.html")
#-------------------利用mechanize的方法建立一個瀏覽器-----------------------------------------
br = mechanize.Browser()
#-------------------------------------------------------------------------

#-------------------------主程式所使用的的全域變數旗標
global num1
global file_flag
global img

#--------------------------------------------------------------------------
num1=0
file_flag=0
img=0
###################
#cj = cookielib.LWPCookieJar()
#br.set_cookiejar(cj)##关联cookies


#----------------------------------------------------------------------------------------------
###設置參數給mechanize的瀏覽器給客戶端一些功能比如gzip,referer等
br.set_handle_equiv(True)
br.set_handle_gzip(False)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

#----------------------------------------------------------------------------------------------
###这个是degbug##你可以看到他中间的执行过程,对你调试代码有帮助
#br.set_debug_http(True)

br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.11) Gecko/20100701 Firefox/3.5.11')]##模拟浏览器头  
#response = br.open('http://xxx..com/')
#-------------------------------UI背景設定----------------------------------------------------
'''class BackgroundPanel(wx.Panel):
    def __init__(self, parent, image):
        wx.Panel.__init__(self, parent, -1)
        self.buffer = wx.BitmapFromImage(image)
        dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
    def OnPaint(self, evt):
        print 'paint :', evt 
        dc = wx.BufferedPaintDC(self, self.buffer)  

class MyPopupMenu(wx.Menu):
    def __init__(self, parent):
        wx.Menu.__init__(self)
        self.parent = parent
        minimize = wx.MenuItem(self, wx.NewId(), 'Minimize')
        self.AppendItem(minimize)
        self.Bind(wx.EVT_MENU, self.OnMinimize, id=minimize.GetId())
        close = wx.MenuItem(self, wx.NewId(), 'Close')
        self.AppendItem(close)
        self.Bind(wx.EVT_MENU, self.OnClose, id=close.GetId())
    def OnMinimize(self, event):
        self.parent.Iconize()
    def OnClose(self, event):
        self.parent.Close()
'''
#--------------------------------------------------------------------------------


#--------------------------------------UI介面---------------------------------
'''class MyFrame(wx.Frame):
    def __init__(self,parent,id,title):
        Basepathfile = os.path.dirname(os.path.abspath(__file__))
        FileName = 'desert.jpg'
        PrelimPathFile = os.path.join(Basepathfile, FileName )
        PathFile = os.path.normpath(PrelimPathFile)
        image = wx.Image(PathFile, wx.BITMAP_TYPE_JPEG)       
        temp = image.ConvertToBitmap()
        size = temp.GetWidth(), temp.GetHeight()
        wx.Frame.__init__(self, parent, id, title,size=(350, 300))
        self.bmp = wx.StaticBitmap(parent=self, bitmap=temp)
        #self.SetClientSize(size)
        #self.panel = BackgroundPanel(self, image)
        #self.pwsText = wx.TextCtrl(self.panel, -1, "Message Box of PWSs.\n",size=(250, 150), pos=(40,40), style=wx.TE_MULTILINE)
       # self.pwsText.SetInsertionPoint(0)  
        bSizer1 = wx.BoxSizer( wx.VERTICAL )
        
        
        panel = wx.Panel(self, -1)      
        font = wx.SystemSettings_GetFont(wx.SYS_SYSTEM_FONT)
        font.SetPointSize(12)
        
        bSizer1.Add( panel , 1, wx.EXPAND |wx.ALL, 5 )
        self.m_menubar1 = wx.MenuBar()
        self.m_menu1 = wx.Menu()
        self.m_menubar1.Append( self.m_menu1, u"MyMenu" )
        self.m_menu1 .Append(1,'New','New a file')
        self.m_menu1.Append(2,'Quit','Quit application')

        edit=wx.Menu()
        self.m_menubar1.Append( edit, u"Copy" )
        edit.Append(3,'Copy','Copy')
        edit.Append(4,'Paste','Paste')

        self.m_menubar1.Append(MyPopupMenu(self), 'pop')
        prompt = u"請輸591要抓取的網址"
        vbox = wx.BoxSizer(wx.VERTICAL)
          
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        st1 = wx.StaticText(panel, -1, prompt)
        st1.SetFont(font)
        hbox1.Add(st1, 0, wx.EXPAND | wx.LEFT | wx.RIGHT)
        self.name4 = wx.TextCtrl(panel, -1)
        hbox1.Add(self.name4, 1)
 
        vbox.Add(hbox1, 0, wx.EXPAND | wx.LEFT | wx.RIGHT)
        vbox.Add((-1, 10))
 
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        #self.button = wx.Button(panel, 1, "enter")
        #self.Bind(wx.EVT_BUTTON, self.ButtonClick, id = 1)
        #hbox2.Add(self.button, 0)
        #vbox.Add(hbox2, 0, wx.EXPAND | wx.LEFT | wx.RIGHT)
        vbox.Add((-1, 10))
        
        prompt = u"請輸勤益租屋網要抓取的網址"
        hbox3 = wx.BoxSizer(wx.HORIZONTAL)
        st1 = wx.StaticText(panel, -1, prompt)
        st1.SetFont(font)
        hbox3.Add(st1, 0, wx.RIGHT, 14)
        self.name1 = wx.TextCtrl(panel, -1)
        hbox3.Add(self.name1, 1,wx.RIGHT)
       
        
        vbox.Add(hbox3, 0, wx.EXPAND | wx.LEFT | wx.RIGHT)
        vbox.Add((-1, 10))
 
        hbox4 = wx.BoxSizer(wx.HORIZONTAL)
        self.button = wx.Button(panel, 1, "enter")
        #self.Bind(wx.EVT_BUTTON, self.ButtonClick1, id = 1)
        hbox4.Add(self.button, 0)
        

        prompt = u"請輸抓幾頁"
        hbox6 = wx.BoxSizer(wx.HORIZONTAL)
        st2 = wx.StaticText(panel, 1, prompt)
        st2.SetFont(font)
        hbox6.Add(st2, 0, wx.RIGHT, 14)
        self.name3 = wx.TextCtrl(panel, -1)
        hbox6.Add(self.name3, -1,wx.RIGHT)
        vbox.Add(hbox6, 0, wx.EXPAND | wx.LEFT | wx.RIGHT)
        vbox.Add((-1, 10))
        
        hbox5 = wx.BoxSizer(wx.HORIZONTAL)
        self.button = wx.Button(panel, -1, "enter")
        self.Bind(wx.EVT_BUTTON, self.ButtonClick2, id = 1)
        hbox5.Add(self.button, 0)

         
        vbox.Add(hbox4, 0, wx.EXPAND | wx.LEFT | wx.RIGHT)
        vbox.Add(hbox5, 0, wx.EXPAND | wx.LEFT | wx.RIGHT)
        vbox.Add((-1, 12))
        self.SetMinSize((350, 300))
        self.SetSizer( bSizer1 )
        self.SetMenuBar( self.m_menubar1 )
        self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightBtnDown)
        
        self.Bind(wx.EVT_MENU, self.OnQuit, id=2)
        
        panel.SetSizer(vbox)
        self.Centre()
       # self.Centre()
        self.Show(True)
    def OnRightBtnDown(self, event):
        #self.PopupMenu(MyPopupMenu(self), event.GetPosition())
        self.Bind(wx.EVT_MENU, self.OnTest, id=5)
        test = wx.Menu()
        test.Append(5, 'test', 'test')
        self.PopupMenu(test, event.GetPosition())
    def OnTest(self, event):
        self.Close()
    def OnQuit(self, event):
        self.Close()
    def ButtonClick(self, event):
        name = self.name4.GetValue()
        pyth_chin(name)
    #def ButtonClick1(self, event):
    #   name = self.name1.GetValue()
    #   ncut(name)
    def ButtonClick2(self, event):
        name = self.name1.GetValue()
        name2= self.name3.GetValue()
        name2=int(name2)
        print name2
        print type(name2)
        ncut(name,name2)

'''
#--------------------------------------UI介面---------------------------------        
#class MyApp()
 #################



#/////////////////////////抓資料//////////////////////////////////////////////
#/////////////////////////判斷抓取591租屋網資料//////////////////////////////////////////////
def pyth_te(b):
    new_flag=0
    global num1
    
    m=''
    j=0
    i=2   #這個旗標為了要讓前面的lable與要抓取資料的text分開存而寫入
    k=0   #k是為了抓取租金多用一個eum的html標籤 額外要抓取的一個text
    lab=[]  #存進去lable的值
    eum=[]  #存進去額外抓到租金的值
    #url=urllib2.urlopen(req[0])
    response = br.open(b)   #瀏覽器模擬開啟傳入參數b   b為抓到的超連結
    #for f in br.forms():
     #   print f 
    soup=BeautifulSoup(response)    #用beautifulsoup解析網址
    mydiv=soup.find("ul",attrs={"id":"attr"})      #抓網頁裡dev標籤id為detailInfo
    myspan=mydiv.find_all("span")                         #從div裡面抓所有的span標籤
    myspan3=mydiv.find_all("img")
    myeum=mydiv.find("li",attrs={"class":"first"})        #租金裡面有一個額外的eum標籤 這是例外處理
    #mye=myeum.find_all("em")                              #這是從list標籤裡class為first裡的em標籤
    eum.append(b)
    #for eu in mye:                                        #把抓到eum標籤的值轉換為beautifulsoup可用函數的物件
    #    tem1=eu.text                                      #用beautifulsoup物件的方法抓到裡面的text文字     
    for sp in myspan3:
        print sp.get('src')
        tem4=sp.get('src')
    for sp1 in myspan:
        tem2=sp1.text       
        for x in tem2:
            x=x.encode('utf8')                            #將tem變數裡的字串取出轉成字元
            m=m+x                                    #如果第二次class不是othercost就做這個指令
        tem2=sp1.get('class')
        if(tem2!=None):
            a=tem2[0]
            #print a
          #  print type(a)
        if(tem2=="lable"):
                i=i+1                        
        if(m=="格局:"):                               
            i=i+1
        if(m=="社區:"):
            i=i+1
        if(m=="最短租期:"):
            i=i+1
        if(m=="用途:"):
             i=i+1
        if(a=='multiLine'):
            eum.append(tem4)
            tem=sp.get('src')
            urllib.urlretrieve(tem4, str(num1)+".jpg")
            print("download suceess")
            num1=num1+1
            #print tem2
        #if(k==0):                                       #這個只做一次
        #    eum.append(tem1)
        #     print tem1
        #    k=k+1
            #print tem1
            #mymuti=mydiv.find("span",attrs={"class":"multiLine"})
            #這個忘記事幹嘛用
        j=j+1
        m=''
    return eum


#/////////////////////////判斷抓取591租屋網資料//////////////////////////////////////////////
    




#/////////////////////////抓591租屋網連結方法//////////////////////////////////////////////
def pyth_chin(url2):
    url2=url2.encode('utf8')
    url1=urllib2.urlopen(url2)
    soup1=BeautifulSoup(url1)           #從591租屋網先複製查詢勤益後結果的網址貼到程式裡面來 
    x=0
    img_flag=0
    c=0
    req=[]                              #存放超連結網址陣列
    rows1=["租金","押金","坪數","樓層","類型","車位","地址","電話","E-mail"]    #這是要存進去第一列資料行當索引
    driver = webdriver.Firefox()
    driver.get('http://rent.591.com.tw/house-rentSale-8-0-0-0-%E5%8B%A4%E7%9B%8A.html')
    html = driver.page_source
    shContent=soup1.find("div",attrs={"id":"shContent"})    #抓div標籤id為shContent 抓到結果還是一個物件

    shli=shContent.find_all("div",attrs={"class":"shList"}) #再從第一個物件裡面再抓所有div標籤class為shList這時候為結果得到的值無法直接利用物件的方法要拆出來

    f=open("stock9.csv",'wb')  #存資料先不存 資料量大
    f.write('\xEF\xBB\xBF')
    w=csv.writer(f)
    r=w.writerow(rows1)
    tmp=[]  #存資料放的陣列
    for c in range(3):
        for td in shli: #把每個抓到的超連結從shli[0]會做到沒有資 料為止 做一次則所有+1值給td
            tem=td.find("div",attrs={"class":"right"})  #從td裡抓div標籤 屬性為class為right
            a=tem.find("a")                             #再從裡面找超連結標籤為a 
            b=a.get('href')                             #get函數為了把標籤去掉只留內容的函數
            b=b.encode('utf8');                         #重新編碼成utf8不然會為unicdoe無法使用
            b="http://rent.591.com.tw/"+b               #把b串上前面那行因為抓到的超連結沒有前面http
            print b
            req.append(b)                               #抓到的超連結存到一個陣列李
            eum=pyth_te(b)
            for t in eum:                               #將抓取的結果存進陣列裡,當一筆資料存取完成後將它存入資料庫並清除
                t=t.encode('utf8')
                tmp.append(t)
                x=x+1
                #print t
                img_flag+=1
                #print t
                #if(x==7):                                    
                #    w.writerow(tmp)
                 #   x=0
                #    tmp=[]
        #------------------------------抓取下一頁連結        
        driver.find_element_by_xpath('//*[@id="rightContent"]/div[10]/div/a[5]').click()
        html = driver.page_source
        soup1=BeautifulSoup(html)
        shContent=soup1.find("div",attrs={"id":"shContent"})
        shli=shContent.find_all("div",attrs={"class":"shList"})
        #------------------------------抓取下一頁連結      
    f.close()
    app.MainLoop()
#/////////////////////////////////////////////////


    
#////////////////////////判斷抓取勤益租屋網方法//////////////////////////////////////////////
def pyth_tn(urls):
    global img
    global file_flag
    x=0
    name=''
    tmp=[]
    iflag=0
    i=0
    count_flag=0
    #print urls
    response = br.open(urls)
    soup=BeautifulSoup(response)
    shContent=soup.find("table",attrs={"width":"83%"})
    trs=shContent.find_all('tr')
    i=len(trs)
    for tr in trs:   
        tds=tr.find_all('td')
        #print len(trs)
       #if(x>2 and x<i-3):
        for td in tds:
            name=td.text.encode('utf8')
            #print name
            if(name==''):
                name="無"            
            if(count_flag!=39 and count_flag%2!=0 and count_flag!=1):
                tmp.append(name)
                iflag=0
            elif(count_flag==31):
                #print td.text    
                #for site in site_url:
                #    si=site.get('href')
                #    print si
                   # filename = "img.jpg"+str(img_flag)
                    #urllib.urlretrieve(si, filename)#下载图片
                iflag=0    
            elif(count_flag==39):                
                count_flag=0
            if(count_flag!=39):
                count_flag+=1        
        x=x+1
        iflag=iflag+1
    os.makedirs(str(file_flag))
    imgage=shContent.find_all('img')
    print "\ \\ \\\ \\\\"
    for si in imgage:
        site=''
        site=site+"http://www.osa.ncut.edu.tw/2004/html/office/rent/"
        site1=si.get('src')
        site=site+site1
        print site
        #print site
        filename=r"img"+str(img)+".png"
        path=r"D:\project\profe"+"\\"+str(file_flag)
        #print path
        dest_dir=os.path.join(path,filename) 
        urllib.urlretrieve(site, dest_dir)
        print("download suceess")
        #time.sleep(10)
        img=img +1
    file_flag+=1   
    return tmp

#/////////////////////////抓資料//////////////////////////////////////////////

#////////////////////////判斷抓取勤益租屋網方法//////////////////////////////////////////////
def pyth_chichichi(urls):
    global img
    global file_flag
    x=0
    name=''
    tmp=[]
    tmp1=[]
    iflag=0
    i=0
    count_flag=0
    #print urls
    response = br.open(urls)
    soup=BeautifulSoup(response)
    shContent=soup.find("table",attrs={"id":"attributeTable"})
    trs=shContent.find_all('tr')
    i=len(trs)
    for tr in trs:   
        tds=tr.find_all('td')
        #print len(trs)
       #if(x>2 and x<i-3):
        for td in tds:
            name=td.get('class')
            if(name==None):
                if(td.text.encode('utf8')!=' '):
                    tem4=td.text.encode('utf8')
                    if(tem4!='' and tem4!=' '):
                        tmp1.append(tem4)
    tmp.append(tmp1)
    tmp[1][1]
    tmp1=[]
    x=x+1
        #iflag=iflag+1
    #os.makedirs(str(file_flag))
    #imgage=shContent.find_all('img')
    #print "\ \\ \\\ \\\\"
    return tmp

#/////////////////////////抓資料//////////////////////////////////////////////
#/////////////////////////抓取奇集集//////////////////////////////////////////////
def chichi():
    global file_flag
    global img
    url1=urllib2.urlopen('http://www.kijiji.com.tw/fp-renter-in-taichungcity/%E5%8B%A4%E7%9B%8A/c500811l1400201?A_AreaInPingTwoDecimal_max=&A_AreaInPingTwoDecimal_min=&AreaInPingTwoDecimal=min-max&maxPrice=&minPrice=')
    soup1=BeautifulSoup(url1)           #從勤益租屋網租屋網網址貼到程式裡面來 
    x=0
    c=0
    req=[]                              #存放超連結網址陣列
    driver = webdriver.Firefox()
    driver.get('http://www.kijiji.com.tw/fp-renter-in-taichungcity/%E5%8B%A4%E7%9B%8A/c500811l1400201?A_AreaInPingTwoDecimal_max=&A_AreaInPingTwoDecimal_min=&AreaInPingTwoDecimal=min-max&maxPrice=&minPrice=')
    html = driver.page_source  
    #------------------selenium開啟超連結----------------------------------
    shContent=soup1.find_all("div",attrs={"class":"ar-title"})    #抓div標籤id為shContent 抓到結果還是一個物件
    #------------------利用Beautiuflsoup的find方法找出要抓取的表格
    

    #rows1=["租金","押金","坪數","樓層","類型","車位","地址","電話","E-mail"]    #這是要存進去第一列資料行當索引
    #-------------------------------------------------------------------------------
    f=open("stock22.csv",'wb')  #存資料先不存 資料量大
    f.write('\xEF\xBB\xBF')
    w=csv.writer(f)
    #r=w.writerow(rows1)
    #-----------------建立資料表檔案---------------------------------------------------------------
    tmp=[]  #存資料放的陣列
    eum=[]
    bflag=0
    xflag=0
    page=0
    pageflag=0
    #---------------設立旗標去做抓取資料的各種設定-------------------------------------------------
    #-------------------------------判斷網站資料的規則性去做資料抓取--------------------------------
    for td in shContent: #把每個抓到的超連結從shli[0]會做到沒有資 料為止 做一次則所有+1值給td
        shli=td.find('a')
        tem3=shli.get('href')
        tem3=tem3.encode('utf8')
        #print tem3
        url1=tem3
        eum=pyth_chichichi(url1)
        
        #a=td.find('a')
        #print a
        #b=a.get('href')
        #print b
                
    #-------------------------------------------------------------------------------------------------------------------------            

#/////////////////////////抓取勤益租屋網資料連結//////////////////////////////////////////////
def ncut(url2,name2):
    global file_flag
    global img
    url2=url2.encode('utf8')
    url1=urllib2.urlopen(url2)
    soup1=BeautifulSoup(url1)           #從勤益租屋網租屋網網址貼到程式裡面來 
    x=0
    c=0
    req=[]                              #存放超連結網址陣列
    driver = webdriver.Firefox()
    driver.get('http://www.osa.ncut.edu.tw/2004/html/office/rent/lookuprent.asp?keyin=%25&MDown=1&MUp=10000&OrderI=%AF%B2%AA%F7&PiSh=asc&JT=%A5%BC%A5X%AF%B2&Submit=%BDT%A9w%ACd%B8%DF')
    html = driver.page_source  
    #------------------selenium開啟超連結----------------------------------
    shContent=soup1.find("table",attrs={"width":"914"})    #抓div標籤id為shContent 抓到結果還是一個物件
    shli=shContent.find_all('tr')
    #------------------利用Beautiuflsoup的find方法找出要抓取的表格
    

    #rows1=["租金","押金","坪數","樓層","類型","車位","地址","電話","E-mail"]    #這是要存進去第一列資料行當索引
    #-------------------------------------------------------------------------------
    f=open("stock12.csv",'wb')  #存資料先不存 資料量大
    f.write('\xEF\xBB\xBF')
    w=csv.writer(f)
    #r=w.writerow(rows1)
    #-----------------建立資料表檔案---------------------------------------------------------------
    tmp=[]  #存資料放的陣列
    eum=[]
    bflag=0
    x=len(shli)
    xflag=0
    page=0
    pageflag=0
    #---------------設立旗標去做抓取資料的各種設定-------------------------------------------------
    

    #-------------------------------判斷網站資料的規則性去做資料抓取--------------------------------
    for page in range(name2):
        for td in shli: #把每個抓到的超連結從shli[0]會做到沒有資 料為止 做一次則所有+1值給td
            if(c>2 and c<23):
                a=td.find('a')
                b=a.get('href')
                b=b.encode('utf8')
                bflag=len(b)
                #print b
                if(bflag==21 and pageflag==0):
                    url1="http://www.osa.ncut.edu.tw/2004/html/office/rent/detail.asp?%BDs%B8%B9="+b[18]+b[19]+b[20]
                    eum=pyth_tn(url1)
                elif(bflag==20 and pageflag==0):
                    url1="http://www.osa.ncut.edu.tw/2004/html/office/rent/detail.asp?%BDs%B8%B9="+b[18]+b[19]
                    eum=pyth_tn(url1)       
                elif(bflag==19 and pageflag==0):
                    url1="http://www.osa.ncut.edu.tw/2004/html/office/rent/detail.asp?%BDs%B8%B9="+b[18]
                    eum=pyth_tn(url1)
                elif(pageflag!=0):
                    url1="http://www.osa.ncut.edu.tw/2004/html/office/rent/"+b
                    eum=pyth_tn(url1)
    #---------------------------------------------------------------------------------------------------------------------------
    #---------------存取從網站上抓取資料回傳後的結果並寫入資料表----------------------------------------                
                for t in eum:
                    tmp.append(t)
                    xflag=xflag+1
                    #print len(tmp)
                    if(xflag==19):
                        xflag=0
                        r=w.writerow(tmp)
                        tmp=[]
    #-----------------------------------------------------------------------------------------------------------------------------                    
            c=c+1
            
           #print pageflag
        c=0
    #------------------------------進入下一頁連結----------------------------------------------------------------------------------------------
        if(page!=name2):
            driver.find_element_by_xpath('/html/body/table/tbody/tr/td/table/tbody/tr[6]/td[1]/table/tbody/tr[23]/td/table/tbody/tr/td[2]/div/table/tbody/tr/td[3]/a').click()
            html = driver.page_source
            soup1=BeautifulSoup(html)
            shContent=soup1.find("table",attrs={"width":"914"})    #抓div標籤id為shContent 抓到結果還是一個物件
            shli=shContent.find_all('tr')
            page+=1
            pageflag+=1
            c=0
            td=''
        else:
           print "done"
    #-------------------------------------------------------------------------------------------------------------------------------       
    f.close()        
    app.MainLoop()
#----------------------主程式呼叫----------------------------
if __name__ == "__main__":
    print "hellO"
    #app = wx.App()
    #frame = MyFrame(None, -1, title=u"python自動化抓取資料")
    #app.MainLoop()
    
#----------------------------------------

上一篇
Python 做一個簡單的小爬蟲(三)
下一篇
Python 自學30天心得分享
系列文
30天Python學習分享路程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言