<button id="2ddn7"><acronym id="2ddn7"></acronym></button>

<button id="2ddn7"><acronym id="2ddn7"></acronym></button>

  • <button id="2ddn7"><object id="2ddn7"></object></button>
      1. <s id="2ddn7"></s>
        更多課程 選擇中心


        Python培訓

        400-111-8989

        Excel+Python碰撞出來的火花相當不錯

        • 發布:Yogurt_cry
        • 來源: 創云設計
        • 時間:2018-02-23 14:55

        在用Linux的過程中也不是完全一無所獲,還是做了點東西——用Python寫了一個爬取58同城租房信息的小程序。然后再結合Excel來將其進行處理,效果奇好。這次由于涉及到的語言比較多,代碼量較大,所以就不在此進行細講,把注釋好的代碼貼出來,重點分享的是這個過程中的思路。希望大家對Excel處理數據有一個不同或者更深的認識。

        1

        用Python獲取數據


        用Python提前寫好程序,按下【F5】之后就可以批量爬取58同城上面的租房信息了。不過呢,雖然58上面的反爬蟲機制似乎不太嚴,但是還是有一個【操作頻繁】的監控,本來Yogurt是想通過控制訪問時間來繞過這個監控的,后來發現不可行,可能是58是通過同一IP連續訪問次數來判斷這個【操作頻繁】的,后來就索性不設置訪問時間了,直接快速爬取。同時爬取速度與網絡速度和網絡穩定性有關,Yogurt在測試的時候,家里是4M的網絡,用Wifi連接,家里還有其他用網設備,所以每隔一段時間就需要重新設置爬蟲程序的爬取范圍。

        代碼如下:

        #!/usr/bin/python  

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

        import urllib,re,sys,time  

        UrlMain='http://cs.58.com/csyuhua/zufang/0/j2/?ispic=1&selpic=2'  

        MainHtml=urllib.urlopen(UrlMain).read()\  

                  .replace('  ','')\  

                  .replace('\n','')  

        ReUrlAreaContent=re.compile('<div class="arealist">(.*?)</div></dd></dl>')  

        UrlAreaContent=ReUrlAreaContent.findall(MainHtml)[0]  

        ReUrlArea=re.compile('<a href=(.*?)</a>')  

        UrlArea=ReUrlArea.findall(UrlAreaContent)  

        for i in range(len(UrlArea)):  

            #每個地區的網址#  

            UrlAreaResult='http://cs.58.com'+UrlArea[i].split('"')[1]  

            AreaResultHtml=urllib.urlopen(UrlAreaResult).read()\  

                            .replace('  ','')\  

                            .replace('\n','')  

            #獲取住房信息網址#  

            ReUrlHouse=re.compile('<h2><a href=(.*?)</a>')  

            UrlHouse=ReUrlHouse.findall(AreaResultHtml)  

            for j in range(len(UrlHouse)):  

                try:  

                    #當前頁每個住房信息的網址  

                    UrlHouseResult=UrlHouse[j].split('"')[1]  

                    HouseResultHtml=urllib.urlopen(UrlHouseResult).read()\  

                                     .replace('  ','')\  

                                     .replace('\n','')\  

                                     .replace('\r','')  

                    #獲取當前網頁名稱  

                    ReHouse_Title=re.compile('<title>(.*?)</title>')  

                    House_Title='網頁名稱:'+ReHouse_Title.findall(HouseResultHtml)[0]  

                    if House_Title<>'網頁名稱:403 Forbidden' or House_Title<>'網頁名稱:請輸入驗證碼':  

                        #獲取房子租金  

                        ReHouse_Money=re.compile('<span class="c_ff552e">(.*?)</span><!')  

                        House_Money=ReHouse_Money.findall(HouseResultHtml)[0]\  

                                     .replace('<bclass="f36">','')\  

                                     .replace('</b>','')\  

                                     .replace('</span>    <spanclass="c_333">',' ')  

                        #獲取租賃方式  

                        ReHouse_Pay=re.compile('<li><spanclass="c_888 mr_15">(.*?)</span></li>')  

                        House_Pay=ReHouse_Pay.findall(HouseResultHtml)[0]\  

                                   .replace(':</span><span>',':')  

                        #獲取房子信息  

                        ReHouse_Info=re.compile('<li><span class="c_888 mr_15">(.*?)</li>')  

                        House_Info=ReHouse_Info.findall(HouseResultHtml)  

                        House_Infos=''  

                        for k in range(len(House_Info)):  

                            House_text=House_Info[k]\  

                                              .replace(':</span><span>',':')\  

                                              .replace('  ',' ')\  

                                              .replace('  </span>','')\  

                                              .replace('</span>','')  

                            if k==2:  

                                House_Infos+=House_text.split('<')[0]\  

                                              +House_text.split('>')[1].replace('</a','')+'\n'  

                            elif k==3:  

                                House_Infos+=House_text.split('<')[0]\  

                                              +House_text.split('>')[1].replace('</a',' ')\  

                                              +House_text.replace('</a>','').split('>')[2].replace('<emclass="dt c_888 f12"','')+'\n'  

                            elif k==4:  

                                House_Infos+=House_text.split('<')[0]\  

                                              +House_text.split('>')[1].replace('</a',' ')\  

                                              +House_text.replace('</a>','').split('>')[2]+'\n'  

                            else:  

                                House_Infos+=House_text+'\n'  

                        #獲取房子詳細地址  

                        ReHouse_Address=re.compile('<spanclass="c_888 mr_15">(.*?)</span></li>')  

                        House_text=ReHouse_Address.findall(HouseResultHtml)[1]\  

                                       .replace(':</span>',':')  

                        House_Address=House_text.split('<')[0]\  

                                       +House_text.split('>')[1].replace('</span','')  

                        #獲取房東信息  

                        ReHouse_People=re.compile('<p class="agent-name f16 pr">(.*?)</i></p>')  

                        House_text=ReHouse_People.findall(HouseResultHtml)[0].split('>')  

                        for k in range(len(House_text)):  

                            House_People=House_text[1].replace('</a','')\  

                                          +House_text[2]  

                            if k>5:  

                                House_People=House_People+House_text[4]+House_text[6]  

                            elif k>3:  

                                House_People=House_People+House_text[4]  

                            else:  

                                House_People=House_People  

                            House_People='房東信息:'+House_People\  

                                          .replace('<i class="icon pho-approve" title="',' ')\  

                                          .replace('"<i class="icon mail-approve" title="',' ')\  

                                          .replace('"<i class="icon single-approve" title="',' ')\  

                                          .replace('"','')  

                        #獲取房屋配置  

                        ReHouse_Disposal=re.compile('<ul class="house(.*?)</ul>')  

                        House_Disposal=ReHouse_Disposal.findall(HouseResultHtml)[0]  

                        ReHouse_Allocation=re.compile('<li class="(.*?)</li>')  

                        House_Allocation=ReHouse_Allocation.findall(House_Disposal)  

                        House_text=''  

                        if len(House_Allocation)>1:  

                            for k in range(len(House_Allocation)):  

                                House_text+='、'+House_Allocation[k].split('</i>')[1]  

                            House_Allocation='房屋配置:'+House_text.replace('、','',1)  

                        else:  

                            House_Allocation='房屋配置:'  

                        #獲取房屋其他信息  

                        ReHouse_Item=re.compile("<ul class='introduce-item'>(.*?)</ul>")  

                        House_Item=ReHouse_Item.findall(HouseResultHtml)[0]  

                        ReHouse_OtherInfo=re.compile("<li><span class='a1'>(.*?)</span></li>")  

                        House_OtherInfo=ReHouse_OtherInfo.findall(HouseResultHtml)  

                        House_text=''  

                        for k in range(len(House_OtherInfo)):  

                            House_text+=House_OtherInfo[k]+'\n'  

                        House_OtherInfo=House_text\  

                                         .replace("</span><span class='a2'>",':')\  

                                         .replace('</em><em>','、')\  

                                         .replace('<em>','')\  

                                         .replace('</em>','')\  

                                         .replace('<p>','')\  

                                         .replace('<p >','')\  

                                         .replace('</p>','')\  

                                         .replace('<b>','')\  

                                         .replace('</b>','')\  

                                         .replace('<br>','')\  

                                         .replace('<br >','')\  

                                         .replace('<br />','')\  

                                         .replace(' ','')\  

                                         .replace('<span >','')\  

                                         .replace('<span>','')\  

                                         .replace('</span>','')\  

                                         .replace('<strong>','')\  

                                         .replace('<strong >','')\  

                                         .replace('</strong>','')  

                        House_InfoText='網址鏈接:'+UrlHouseResult+'\n'\  

                                        +House_Title+'\n'\  

                                        +'房子租金:'+House_Money+'\n'\  

                                        +House_Pay+'\n'\  

                                        +House_Infos\  

                                        +House_Address+'\n'\  

                                        +House_People+'\n'\  

                                        +House_Allocation+'\n'\  

                                        +House_OtherInfo  

                        FileName=UrlArea[i].split('"')[4].replace('>','').decode('utf8').encode('gb2312')+'.txt'  

                        FileSave=open(sys.path[0]+'/'+FileName,'a')  

                        FileContent=House_InfoText+'\n'  

                        FileSave.write(FileContent.decode('utf8').encode('gb2312'))  

                        FileSave.close  

                        print House_InfoText+'\n'+str(i)  

                    else:  

                        print '\n'  

                except:  

                    print '檢查網絡情況'  

                    time.sleep(10)  

                    next  


        上面的爬取效果是特地保留下來的,其目的是為了確認代碼的運行,在運行過程中將其內容保存到txt文件中進行保存。以便下一步的處理。

        2

        按照規則導入Excel匯總

        由于直接使用Python生成Excel需要第三方庫的支持,而Yogurt比較懶,不想去找這些庫,所以就用txt文件為連接Python和Excel的媒介。

        首先我們需要建立一個【Excel啟用宏的工作簿】,建立兩張表——一個【租房信息】,用于存放處理結果,一個【緩存區】用于記錄和處理導入的每一個txt文件。


        然后,通過VBA結合數組函數將導入的txt文件進行處理


        這里Yogurt圖方便,用VBA代碼直接在單元格中插入數組函數:

        {=IFERROR(INDEX(緩存區!$D:$D,MATCH($A2&B$1,緩存區!$B:$B&緩存區!$C:$C,),1)&"","")}

        數據龐大,Yogurt在前一天晚上把代碼寫好,測試通過之后就打開電腦讓它自己執行了一夜,第二天早上起來驗收。

        代碼如下:

        Sub InputText()  

            On Error Resume Next  

            Dim FileAddress As String  

            Dim FileNames As String  

            Dim Rank As Integer  

            FileAddress = ThisWorkbook.Path & "\*.txt" 'txt文件地址  

            FileNames = Dir(FileAddress, vbNormal) '獲取txt文件名稱  

            Rank = 1 '使獲取txt文件名稱的起始順序為1  

            Sheet1.Range("A2:P60000").ClearContents  '清空【租房信息】中的數據內容  

            With ThisWorkbook.Sheets(2)  

                .Range("A:A").ClearContents '清空存放txt文件名稱的單元格  

                Do While FileNames <> "" '設置循環獲取,直至找不到txt文件名為止  

                    .Range("A" & Rank) = FileNames '當存在txt文件名時將其輸入到【緩存區】A列單元格中  

                    FileNames = Dir '獲取下一個內容  

                    Rank = Rank + 1 '單元格位置向下移動1位  

                Loop  

                Dim RangeCount As Integer  

                RangeCount = .Range("A10000").End(xlUp).Row '獲取導入txt文件名稱的總數量  

                With .Sort 'A列單元格內容按照拼音順序進行排序  

                    .SortFields.Clear  

                    .SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal  

                    .SetRange Range("A1:A" & RangeCount)  

                    .Header = xlNo  

                    .MatchCase = False  

                    .Orientation = xlTopToBottom  

                    .SortMethod = xlPinYin  

                    .Apply  

                End With  

                  

                Dim myText As String  

                Dim myArr() As String  

                Dim RangeCountText As Integer  

                Dim RangeEndRow As Integer  

                Dim StartNum As Integer  

                Dim EndNum As Integer  

                For i = 1 To RangeCount  

                    .Range("B:D").ClearContents  '在導入新的txt文件內容前清除緩存區中存放txt文件內容的單元格  

                    Open ThisWorkbook.Path & "\" & .Range("A" & i) For Input As #1 '打開指定的txt文件  

                    j = 1  

                    Do While Not EOF(1) '從第一行到最后一樣獲取txt內容,并將其填充到C、D兩列中  

                        Line Input #1, myText  

                        .Range("C" & j) = Left(myText, 4)  

                        .Range("D" & j) = Mid(myText, 6)  

                        j = j + 1  

                    Loop  

                    Close #1 '關閉txt文件  

                      

                    RangeCountText = .Range("C10000").End(xlUp).Row '獲取導入txt文件的行數  

                    .Range("E:E").ClearContents '清空E列內容  

                    .Range("E1") = 0 '使E1單元格的值為0  

                    k = 2  

                    For j = 1 To RangeCountText '從C1到C列有內容的單元格的最后一行  

                        If .Range("C" & j) = "" Then '當C列中的單元格內容為空時  

                            .Range("E" & k) = .Range("C" & j).Row  '在E列填充該空單元格所在的行數  

                            k = k + 1  

                        End If  

                    Next  

                    RangeEndRow = .Range("E10000").End(xlUp).Row + 1 '在獲取完所有空單元格的行數之后,將C列中最后一個空單元格的位置賦值給RangeEndRow  

                    .Range("E" & RangeEndRow) = RangeCountText '并使該單元格所在行數填入E列最后一位單元格中  

                      

                    k = 1  

                    For j = 1 To RangeEndRow '從E1到E列有內容的單元格的最后一行  

                        StartNum = .Range("E" & j) '將E列上下相鄰的兩位數的第一位賦值給StartNum  

                        EndNum = .Range("E" & j + 1) '第二位賦值給EndNum  

                        If j = RangeEndRow Then Exit For '如果循環到最后一行則停止循環  

                        .Range("B" & StartNum + 1 & ":B" & EndNum) = k '將C列txt內容中相同信息的填上相同的序號  

                        k = k + 1  

                    Next  

          

                    For j = 1 To k - 1  

                        With Sheet1  

                            RangeEndRow_1 = .Range("A60000").End(xlUp).Row '循環獲取【租房信息】中A列不為空單元格的行數  

                            .Range("A" & RangeEndRow_1 + 1) = j '使A列順序填充序號  

                            With .Range("B" & RangeEndRow_1 + 1) '在當前序號行中填充數組函數  

                                .FormulaArray = "=IFERROR(INDEX(緩存區!C4,MATCH(RC1&R1C,緩存區!C2&緩存區!C3,),1)&"""","""")"  

                                .AutoFill Sheet1.Range("B" & RangeEndRow_1 + 1 & ":P" & RangeEndRow_1 + 1), xlFillDefault  

                                With Sheet1.Range("B" & RangeEndRow_1 + 1 & ":P" & RangeEndRow_1 + 1) '復制當前序號行內容,并使其內容格式填充為數值  

                                    .Copy  

                                    .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False  

                                End With  

                            End With  

                        End With  

                    Next  

                Next  

            End With  

        End Sub  

        3

        處理數據

        3.1 地區排序


        將地區進行排序之后,咱們需要重新將序號進行填充。因為上面的代碼是按照【數字+標題名】的形式對導入的txt文件內容進行查找的,每一個txt文件中都是重新排序的,因此不符合我們匯總的要求,所以我們此時需要對其進行重新安排。

        3.2 重新設定序號


        在序號列中的開頭兩位中輸入起始值和特定步長后的值,選中兩個單元格后雙擊右下角的小黑點即可完成所有行序號的填充。

        3.3 細化列表條件


        我們看到,按照從58上爬下來的數據,很多都連在了一起,比如【房子租金】列中【房租】和【支付方式】連在了一起;【朝向樓層】中房子的【朝向】和【樓層】連在了一起;【所屬區域】中,【行政區域】和【地名】連在了一起等等……這樣的數據對我們后期的統計和分析會產生不好的影響,因此我們需要盡可能的將列表的分列條件進行細化,以便于后期的處理和分析。

        在此之前,我們需要考慮到原始數據的獲取和生成都是需要耗費大量的時間和精力的,因此,為了后期處理過程中避免操作失誤導致數據丟失,我們需要新建一張表來調用此表中的數據。

        經過近1個小時的處理,形成了下面的這么一張長圖:


        具體的函數使用大家可以通過在公眾號的對話框中回復【爬蟲】獲取源文件。特地標出來的灰色隱藏信息列,是直接從【租房信息】表中直接用函數提取出來的內容。在我們查看的過程中是不需要出現的。

        4

        美化表格

        在進行簡單的處理之后,讓表格更加易于查看。如下圖:


        這樣處理完后表才有益于后期的分析和處理,以便數據的展示等等。

        以上就是Excel+Python獲取58租房信息后的數據處理和匯總的全過程和代碼內容。不知道對大家有沒有一點點小啟發。

        在本期的最后呢,Yogurt想再多說點題外話。在一般的情況下,很多小伙伴都只知道Excel可以輸入各種表格信息。很少會去思考Excel可以做一些更深層次的東西。新的一年,Yogurt用Excel+Python給大家分享了一個Excel對于處理來自網絡的數據思路。希望能給大家一點在Excel上能夠挖掘出更多好玩的操作方式。

        這里順便分享一下Python這個軟件吧。

        Python(/?pa?θ?n/),是一種面向對象的解釋型計算機程序設計語言,由荷蘭人Guido van Rossum于1989年發明,第一個公開發行版發行于1991年。

        簡單地說,Python是一種相對于其他編程語言來說比較容易入門的一種語言,而且可以在短時間內學會并開發出相對不錯的小作品。在云計算大數據方面的應用頗多,在互聯網技術、人3工智能等等方面中的表現優異。目前有2.x和3.x版兩種版本。Yogurt目前使用的是Python 2.7.13 for Windows 64bit。

        本文內容轉載自網絡,本著傳播與分享的原則,來源/作者信息已在文章頂部表明,版權歸原作者所有,如有侵權請聯系我們進行刪除!

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:利用python和excel 搭建接口測試框架
        下一篇:python基礎語法介紹

        Python中類的屬性有哪幾種

        Python語法你知道多少

        Python 中常見的配置文件寫法

        Python爬蟲可以做什么

        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        黑龍江省

        吉林省

        河北省

        湖南省

        貴州省

        云南省

        廣西省

        海南省

        青青青草网站免费观看|青青青视频在线观看 超真实强奷视频在线看 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>