iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
1

Hi 大家好~~~
今天要分享網路爬蟲的第(2)部分,我覺得大家還是要去課程連結看一下會比較清楚喔!!!

Cookie

Cookie就是網站存放在瀏覽器的一小段內容,在與伺服器連線時,會被放在Request Headers中送出

程式範例:

#抓取PTT八卦版原始碼的網頁(HTML)
import urllib.request as req
def getData(url):
    #加入底下這一段才會讓整段程式碼看起來像一個普通使用者,建立一個Request物件,付加Request Headers 的資訊
    request=req.Request(url,headers={
        "cookie":"over18=1",#要帶上cookie才能夠像使用者點擊滿18歲一樣,這樣才能進去八卦版
        "User-Agent":"你的資料"
    })
    # 使用 with request.urlopen(網址) 連上網路,並將其重新取名為 response ,最後使用 read() 函數,將網頁結果放入 data 中。
    with req.urlopen(request) as response: 
        data=response.read().decode("utf-8")# 取的網頁的原始碼。並用decode("utf-8")來翻譯成中文(解碼)。
    print(data)
 
#解析原始碼,取得每篇文章的標題
    import bs4 #解析HTML格式
    root=bs4.BeautifulSoup(data,"html.parser") # 利用上方載入套件做解析:變數 data 是剛在網路上抓到的資料,丟給 beautifulsoup4,他會解析html格式 。 
    titles=root.find("div",class_="title") #尋找class="title"的div標籤
    print(root.title) # .title :抓取網頁標題。<title> 以及 </titl3> 分別代表開始與結束。
    print(root.title.string) # .title.string :抓取標籤內的文字。(不會再顯示印出上方時句首句末會出現的 <title> 以及 </titl3>)
    print(titles) # 印出剛剛上面找到的標籤。這裏 titles 代表上面找到的 div 標籤。
    print(titles.a.string) # 加上 ".a" 代表我們剛剛找到的那個 div 標籤底下的 <a> 裡面的東西; ".string" 則是抓取前面 "titles.a" 抓到的東西的文字。
    titles = root.find_all("div", class_="title") # 尋找所有 class = "title" 的 div 標籤。
    print(titles) # 印出剛剛上面找到的標籤。這裏 titles 代表上面找到的 div 標籤。
    for title in titles:
        if title.a != None: # 如果標題包含<a>標籤(沒有被刪除),印出來(!=是不等於)
            print(title.a.string) 
    #追蹤網頁連結,抓取PTT上一頁的功能連結,這樣可以不斷地記錄每一頁PTT的資料
    nextlink=root.find("a",string="‹ 上頁") #找到HTML程式碼內文是"‹ 上頁"的 a 標籤
    return nextlink["href"] #印出"‹ 上頁"的 a 標籤的href屬性
#連續一個頁面的標題
pageurl="https://www.ptt.cc/bbs/Gossiping/index.html"
count=0
while count<3: #抓3頁
    pageurl="https://www.ptt.cc"+getData(pageurl) #getData不會抓到前面https://www.ptt.cc這段文字,所以要自己加
    count+=1 

以上,就是今天的學習心得分享,
若是文章中有錯誤的地方,再麻煩前輩們不吝指正,謝謝大家!!!!
/images/emoticon/emoticon41.gif


上一篇
Day 20 - 網路爬蟲(1)
下一篇
Day 22 - 網路爬蟲(3)
系列文
30天Python學習心得分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言