iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
AI & Data

爬蟲怎麼爬 從零開始的爬蟲自學系列 第 26

爬蟲怎麼爬 從零開始的爬蟲自學 DAY26 python網路爬蟲開爬7-規模擴大

前言

各位早安,書接上回我們將程式碼成功加上儲存的功能,我們今天要來使它的規模更大更方便使用

開爬-規模擴大

首先目前我們只會建一個檔案存放資料
如果想要存取更大量資料只有一個檔案是不行的
因為記事本一旦資料太多就會變得難以閱讀
所以我今天以15頁為目標 每個檔案5頁 建3個檔案
在此之前
我們先利用之前學到的讀檔來讓終端也輸出我們抓到的內容
把原本的

print("爬完了")

改成

read = open("Pet_Get.txt", encoding="utf-8")
print(read.read())
read.close()

第一行開檔
第二行印出讀取出來的東西
第三行關檔

執行結果
https://ithelp.ithome.com.tw/upload/images/20211009/20140149lcFvfbgpVW.jpg
可以看到把檔案內的資料印出來了

接下來是利用多一個迴圈建立更多檔案並印出更多頁
把原本用來寫入的部分

file = open("Pet_Get.txt", "w", encoding="utf-8")
for i in range(1,4,1):
    infor = getData(infor)
    file.write("--------------------第"+str(i)+"頁--------------------\n")
    for inf in infor:
        file.write(inf)
file.close()

改成

for x in range(1,4,1):
    file = open("Pet_Get"+str(x)+".txt", "w", encoding="utf-8")
    for i in range(1,6,1):
        infor = getData(infor)
        file.write("--------------------第"+str(i)+"頁--------------------\n")
        for inf in infor:
            file.write(inf)
    file.close()

加一層迴圈用來建立更多檔案
並把檔案名稱編號
將原本一個檔案內存三篇文章改成存五篇

執行後可以看到他一個一個新增了3個檔案 就是這次執行的結果
https://ithelp.ithome.com.tw/upload/images/20211009/20140149xSZJfyZPKV.jpg
但是終端內的輸出依然沒變
因為他還是讀取之前的 Pet_Get.txt
而不是新的 Pet_Get1.txt Pet_Get2.txt Pet_Get3.txt
所以下面讀取的部分也要更新成讀這三個檔案
要加上去的迴圈邏輯跟寫入的一樣

把原本

read = open("Pet_Get.txt", encoding="utf-8")
print(read.read())
read.close()
for x in range(1,4,1):
    read = open("Pet_Get"+str(x)+".txt", encoding="utf-8")
    print(read.read())
    read.close()

這樣就會讀取新建立的 Pet_Get1.txt Pet_Get2.txt Pet_Get3.txt 了
原本的 Pet_Get.txt 沒用了已經可以刪掉了

執行結果
https://ithelp.ithome.com.tw/upload/images/20211009/201401495cQttMJ50o.jpg
可以看到這裡印出了三個檔案量的內容 資料也都成功寫入檔案內

但是我發現了三個問題

1.第一行文章的原網址沒有換行 導致第一篇文章被往後擠不好看

https://ithelp.ithome.com.tw/upload/images/20211009/20140149TKYSo8m3cF.jpg

2.文章原網址竟然是下一頁的...

https://ithelp.ithome.com.tw/upload/images/20211009/20140149reEOhw2a2J.jpg

3.標題竟然越來越多???

Pet_Get1.txt

https://ithelp.ithome.com.tw/upload/images/20211009/20140149hzb7thnghO.jpg

Pet_Get2.txt

https://ithelp.ithome.com.tw/upload/images/20211009/201401495M6FYlqdDH.jpg

Pet_Get3.txt

https://ithelp.ithome.com.tw/upload/images/20211009/20140149vscHeZWtSE.jpg

有這些問題都是我在構思程式碼時對程式設計不夠了解導致的
擴大程式的規模也讓這些原本沒發現到的問題浮現出來
有這麼多問題可不能放任它們 明天我們就要來把這些問題解決了 順便再優化一下程式

今天的程式碼

import requests
import bs4

def getData(infor):
    headers = {"cookie" : "over18=1"}
    #建立headers用來放要附加的cookie
    request = requests.get(infor[0],headers = headers)
    #將網頁資料利用requests套件GET下來並附上cookie
    data = bs4.BeautifulSoup(request.text, "html.parser")
    titles = data.find_all("div", class_ = "title")
    #解析網頁原始碼
    i = 1
    for title in titles:
        if title.a != None:
            if "兔" not in title.a.text:
                infor.insert(i, "https://www.ptt.cc"+title.a["href"]+" "+title.a.text+"\n")
                i = i+1
    #利用for迴圈把資料放進infor[1]開始的位置內並篩選掉已被刪除的文章
    prePage = data.find("a", class_ = "btn wide", text = "‹ 上頁")
    newUrl = "https://www.ptt.cc"+prePage["href"]
    #抓取上頁按鈕內URL
    infor[0] = newUrl
    return infor
    #將newUrl放進infor[0]再把infor傳出去
infor = ["https://www.ptt.cc/bbs/Pet_Get/index.html"]
#抓PTT領養版的網頁原始碼
for x in range(1,4,1):
    file = open("Pet_Get"+str(x)+".txt", "w", encoding="utf-8")
    for i in range(1,6,1):
        infor = getData(infor)
        file.write("--------------------第"+str(i)+"頁--------------------\n")
        for inf in infor:
            file.write(inf)
    file.close()
#寫入資料
for x in range(1,4,1):
    read = open("Pet_Get"+str(x)+".txt", encoding="utf-8")
    print(read.read())
    read.close()
#讀取檔案中資料並印出

早安閒聊區

你知道嗎?

歐洲古代貴族會用放射性鈾玻璃做的器皿吃飯生活導致有人生病喔

每日二選一

你去火鍋吃到飽是會吃爆蔬菜的草食人還是吃爆肉類的肉食人呢


上一篇
爬蟲怎麼爬 從零開始的爬蟲自學 DAY25 python網路爬蟲開爬6-資料儲存
下一篇
爬蟲怎麼爬 從零開始的爬蟲自學 DAY27 python網路爬蟲開爬8-儲存問題解決
系列文
爬蟲怎麼爬 從零開始的爬蟲自學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言