創作內容

3 GP

PTT Beauty 板圖片爬蟲 (下)

作者:Yotsuba│2020-06-01 18:11:17│巴幣:6│人氣:430

這篇文章是 PTT Beauty 板圖片爬蟲 (上) 以及 Session 的延伸閱讀

我會利用 requests 裡面的 Session 物件把上次的程式碼撰寫的更簡潔

程式碼如下 :


import requests
from bs4 import BeautifulSoup


# I am over 18 years old
session = requests.Session()
session.post('https://www.ptt.cc/ask/over18', data = {'from' : '/bbs/Beauty/M.1563888394.A.F76.html', 'yes' : 'yes'})


# Get html
response = session.get('https://www.ptt.cc/bbs/Beauty/M.1563888394.A.F76.html')
soup     = BeautifulSoup(response.text, 'html.parser')


# Get images
div_list = soup.find_all('div', class_ = 'richcontent')
for div in div_list:
    print(div.img.get('src'))


執行結果




其實真正的重點只有前面兩行

首先去創建一個 Session 物件,我寫成 session = requests.Session()

這樣就完成創建了,之後只要是用這個 session 變數去請求的,一律都是「有狀態」


當我使用 POST 時就自動處理好了 cookie,下一次就直接 GET 目標網頁

連想都不用想,後面直接接 Beautiful Soup 的操作

如果你想利用圖片連結做下載,可以使用 Context Managerurlretrieve


談一下 Session 物件的使用時機 ?

有一種網頁,它明明是 GET,但是你直接 GET 卻看不到它

它需要你先 POST 過後再 GET 才看得到的網頁,就可以用 Session 物件處理

而你八成也知道,這種網頁就是用 cookie 在記錄狀態


舉個例子,巴哈姆特首頁的網址是 https://www.gamer.com.tw/

可是為什麼每個人點擊進去,就可以看到自己的勇者造型和個人資訊 ?

從網址分析,看不出任何個人資訊,而且網站是 GET 嗎 ? 也是

答案就是 cookie,因為瀏覽器自動幫你紀錄並且填好了 cookie

所以每個人點擊一模一樣的網址,卻可以看到屬於自己的資料
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4802257
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 4 篇留言

星が降る☄fripSide廚
其實可以不用再get一次 用response去接post會有一樣的結果

06-01 23:40

Yotsuba
的確是,因為第一個 POST 的回應其實是 302 (會重導向)

requests 的 allow_redirects 預設也是 True,算是多此一舉了

撰寫的時候沒有注意到,感謝回覆 !06-01 23:57
多古尼爾抱抱怪獸鮭魚
我想問兩個問題
第一個是有關創立物件
所以一定要先session=request. session()
不能以後都把session代換成request.session()
像是session. post(參數)換成request. session. post(參數)這樣

06-02 08:35

Yotsuba
以你這樣的寫法會讓 Session 失效

因為每一次使用完,那塊物件就自動釋放掉了


不過如果你今天是寫其他東西或許可以這麼做

比如說我要調用 Math 物件裡面的 pow 函式就可以寫 z = Math.Pow(x, y) 之類的

(我亂舉例的)

那種 "我單純想要用這個物件的函式" 就可以寫成一行流

但像 Session 這種物件中有變數需要持續使用的就不行

因為我們就是希望這塊記憶體被保留06-02 08:42
多古尼爾抱抱怪獸鮭魚
第二個問題是
session. post(參數)這部份如果不用參數接起來的話
他就像是我們對網頁做post動作然後沒有儲存東西是嗎@@
因為看你後面又再get了一次
有點不太懂@@
看了樓上的留言好像是可以直接用參數接session.post(參數)的東西
好像就可以直接拿到接下來get拿到的東西(?)
我的理解對嗎@@

06-02 08:38

Yotsuba
以流程來說,session.post 是代表點擊我同意這件事情,並且記錄下來

接著用 session.get 就可以正常瀏覽頁面了,因為我們點擊我同意了


可是為什麼樓上會提到不用後面的 get ?

因為實際上那個 POST 重導向了 XD,直接引導我們到後面要 GET 的網址了

以你瀏覽器看到的畫面其實也一模一樣

你是不是點擊了我同意,就跳轉到 Reol 那篇文章的頁面了呢 ?


重導向的部分,我會在寫一篇文章介紹06-02 08:46
風蕭蕭荊軻醬
假設我要爬取的是https://www.ptt.cc/bbs/Beauty/M.1567911703.A.C65.html的圖片
那我soup.find_all('blockquote', class_='imgur-embed-pub')
跟soup.find('blockquote').find_all(class_='imgur-embed-pub')
看起來感覺是一樣的
可是為甚麼第2種方式會找不到東西[e3]
另外我想問一下如果是找imgur的"關鍵字" 通常會用甚麼來找

07-18 16:05

我要留言提醒:您尚未登入,請先登入再留言

3喜歡★happy819tw 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:PTT Beauty 板... 後一篇:Hashing...

追蹤私訊切換新版閱覽

作品資料夾

huaing123垃圾霸凌仔
絕不讓我碰的辣個系列昨天又更新啦看更多我要大聲說昨天08:22


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】