查看完整版本: 爬圖程式碼免費教學和分享(可直接使用)
頁: [1]

eyny0426 發表於 2017-2-6 01:24 AM

爬圖程式碼免費教學和分享(可直接使用)

本帖最後由 eyny0426 於 2017-2-12 10:38 PM 編輯

各位看官,新年快樂~

基於過年和朋友聚一聚、嘴砲來嘴砲去的緣由...就莫名其妙寫出了這隻小程式{:46:}
事不宜遲,趕緊放上爬某『單一』個相簿的程式碼!!

撰寫程式: Python 2.7.13
模組: requests、beatifulsoup4
環境: Window7 x64
目前放上來的程式碼為Beta測試版。抓取每一頁每一個的相簿程式碼也寫得差不多了,只差還沒補視窗介面,有空會再補上。這是以"捷X論壇"的某個版為例子:

由於eyny不讓我放上code...所以就把code和可直接執行的.exe檔放在MG了

介紹一下code內容:
win是視窗介面
crawl_b開始爬圖
  res取得url網頁中的所有原始碼
  BeautifulSoup專門剖析網頁原始碼的工具(為了找到圖片的網址)
  urllib.urlretrieve()把圖片存下來

爬全圖實測結果:
大約爬了10頁(450個左右的相簿)、耗時3小時左右、總大小4GB以上、1萬張以上圖片。

爬圖其實沒有您想像的難啦~歡迎指教^^
在下只是個Python新手,還請高手指點



在下將這些圖做為研究和教學使用,無商業用途,下載後已刪除檔案。

----------2/12更新----------
已將完整版放上,但只提供原始程式碼。
完整版:
能爬前1-19頁的相簿
圖片大概會有一萬多張
一樣是MEGA載點,內附使用說明(ReadMe.txt)。
程式碼可自行更改,但請註明原出處,謝謝{:4:}
>...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

sc79891am 發表於 2017-2-11 12:22 AM

可以做看看dcard的爬圖程式嗎

eyny0426 發表於 2017-2-11 06:46 PM

sc79891am 發表於 2017-2-11 12:22 AM static/image/common/back.gif
可以做看看dcard的爬圖程式嗎

網路上有很多爬dcard的教學文...
所以我不太懂您是要爬dcard的文章還是圖片還是什麼呢{:24:}

sc79891am 發表於 2017-2-19 07:17 PM

eyny0426 發表於 2017-2-11 06:46 PM static/image/common/back.gif
網路上有很多爬dcard的教學文...
所以我不太懂您是要爬dcard的文章還是圖片還是什麼呢 ...

有辦法爬每天抽到的卡片彙整到一個資料夾嗎

msi845x 發表於 2017-4-2 08:25 PM

小弟是Python新手,最近在研究dcard跟爬蟲
感謝分享~<br><br><br><br><br><div></div>

q816697q 發表於 2017-7-10 12:00 PM

我套件都裝好了
用你給的程式都抓不套圖
這是什麼問題??
http://imgur.com/KJpUK0f
會顯示ERROR

eyny0426 發表於 2017-7-11 04:14 PM

q816697q 發表於 2017-7-10 12:00 PM static/image/common/back.gif
我套件都裝好了
用你給的程式都抓不套圖
這是什麼問題??


那是正常
因為我使用try...catch
try...catch會抓出Beautifulsoup沒處理乾淨東西用[!]Error吐出來
[!]Error是我寫來處理這些沒辦法處理完的東西{:31:}

q816697q 發表於 2017-7-17 01:43 PM

那要怎麼改才能成功抓下來??
還不太會用

eyny0426 發表於 2017-7-24 11:57 PM

q816697q 發表於 2017-7-17 01:43 PM static/image/common/back.gif
那要怎麼改才能成功抓下來??
還不太會用

不是  那些是本來就不是可以抓的東西
因為我只把所有 圖片網址 抓出來
在用圖片網址去抓圖片
如果抓出來的不是圖片網址  就會被丟到try catch
變成error輸出

ren1244 發表於 2017-7-26 01:06 AM

本帖最後由 ren1244 於 2017-7-26 03:40 PM 編輯

其實是 urllib.urlretrieve 函式的問題
只要刪掉那行,就不會跑出error了
不過原程式是利用 urllib.urlretrieve 抓圖
既然這函式有問題(舊版本)就必須找其他函式來替代了

另外圖片的網址有些不是http或https開頭的也會出錯
遇到這種的,代表它前面跟原本的網站是同一網址
所以要再加上原網址

下面這程式碼提供參考,主要是回饋 BeautifulSoup 的用法。
至於想抓圖的朋友自己想辦法改吧!
我會顧慮到對方網站流量的問題,不在此提供。

程式碼:http://codepad.org/Vf1ziUe5
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

eyny0426 發表於 2017-7-27 12:40 PM

ren1244 發表於 2017-7-26 01:06 AM static/image/common/back.gif
其實是 urllib.urlretrieve 函式的問題
只要刪掉那行,就不會跑出error了
不過原程式是利用 urllib.urlretr ...

感謝大大的指點!!
請問一下  您在def getAlbum這個function中
class_='xw0'是要抓甚麼東西呢??

想不到大大您連re.compile都用上了
看得出來您應該是高手!
我真是拋磚引玉啊XDD
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ren1244 發表於 2017-7-27 02:05 PM

本帖最後由 ren1244 於 2017-7-27 02:11 PM 編輯

去看原始網頁內容,可以看到相簿的資訊長這樣<h3 class="xw0">
<div class='locked'>下載: <em>訪客無法瀏覽下載點,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>
</h3>所以soup.find_all('h3',class_='xw0')是找所有「標籤名稱為 h3 ,且符合 class="xw0"」的標籤
至於為什麼多一個底線,單純是 BeautifulSoup為了避開 python 的關鍵字「class」的緣故

另一段程式碼soup.find_all('img',attrs={'zoomfile':pat_not_empty})是指找出「標籤名稱為 img ,且 zoomfile 屬性符合 pat_not_empty」的標籤
其中 pat_not_empty 是 Regular Expression:".+"
表示任意>...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

hgc31225 發表於 2017-8-30 09:12 PM

我自己用的是python3.5,對於python2.7有點差
但對於抓網頁有編碼的問題,我一般是用urllib2這個模組的
response = urllib2.urlopen(web_site_url)
html = response.read().decode("utf-8", "ignore")html就是用UTF8編碼導出的源始碼,再放入BeautifulSoup(html, "html.parser")這只是我自己的習慣,還請各位大大指教
頁: [1]