iT邦幫忙

1

如何爬取圖文網頁

import requests
from bs4 import BeautifulSoup
import os
url = 'https://ericjhang.github.io/archives/ad5450f3.html'
html = requests.get(url).content
with open('123.html','wb')as f:
f.write(html)
f.close()
這樣爬出來圖是叉叉
要怎樣爬取才能文字連同圖片一起爬
格式只有html嗎

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

4
dragonH
iT邦超人 5 級 ‧ 2019-12-25 14:15:02

先爬本文

然後把img挑出來

對他們的 url 另外進行下載圖片的動作

選我正解

參考

然後不要用 BeautifulSoup

自從被 froce大 推坑

我現在都改用 requests-html/images/emoticon/emoticon07.gif

看更多先前的回應...收起先前的回應...
淺水員 iT邦大師 6 級 ‧ 2019-12-25 14:21:41 檢舉

前幾天才在想現在 python 爬資料都用些什麼套件
(因為很少用,還沒更新訊息)
稍微看一下介紹,竟然直接支援 js,看來可以少裝一個套件了

dragonH iT邦超人 5 級 ‧ 2019-12-25 14:29:49 檢舉

是吧XD/images/emoticon/emoticon42.gif

支援 js 還能用 selector

也就不需要 BeautifulSoup 之類的東西

單一個套件可以完成所有東西

比較難爬的

才會考慮用 seleniumpuppeteer

froce 推推 推推 推推推

froce iT邦大師 1 級 ‧ 2019-12-25 14:50:35 檢舉

ㄜ,雖然這套件我一直推,但是他的JS rendering我自己一直試不成功。XD

有遇到要JS的通常還是selenium比較穩,我主要還是因為他的selector整合得很好才用的。

還是堅持用requests配BS的可以考慮BS換成pyquery,requests-html也是再把pyquery包裝整合起來的產物。

初學者不要再去啃BS那厚厚api了,如果你有在寫網頁,相信用我介紹的這幾個套件,你可以在幾分鐘內寫出簡單的爬蟲。
用BS的話我也得遇到問題慢慢去爬api。

另外我今天才發現,原來BS從4.7開始支援selector了,我剛學爬蟲的時候還沒有。XD

dragonH iT邦超人 5 級 ‧ 2019-12-25 15:17:59 檢舉

/images/emoticon/emoticon37.gif

s4028600 iT邦新手 5 級 ‧ 2019-12-25 15:23:35 檢舉

把img挑出來我已經知道了
但是我問的是圖文都下載
然後包到html或我剛剛發現一個叫mht的東西
讓圖文混排在一個檔案

dragonH iT邦超人 5 級 ‧ 2019-12-25 15:47:55 檢舉

s4028600

你有兩個選擇

一個是我照我上面說的做

然後把圖片照他的結構放

另一個是把那些 url 加工

加上他的 domain name

前者可以單機瀏覽

後者就需要網路連線

mhtml 我沒試過

你可以試試看

不過我覺得可能會跟你想的不太一樣

s4028600 iT邦新手 5 級 ‧ 2019-12-25 16:00:34 檢舉

dragonH
我還打算多個打包成epub
所以選前者
照他的結構放?
html檔只能文字編輯不能放圖片阿?
還是指超連結?
只能手動難以自動化嗎...

dragonH iT邦超人 5 級 ‧ 2019-12-25 16:09:26 檢舉

s4028600

當然可以自動化阿

但是必須仰賴你的 code

舉例來說

他的第一張圖的 src 是

/images/python_install_01.PNG

也就是說你這張圖載下來後

必須放在 images 這 folder 裡

才能讓同一層的 html 正常讀取

依此類推

s4028600 iT邦新手 5 級 ‧ 2019-12-25 16:27:02 檢舉

這樣就多出一個資料夾了...
看來好像沒有其他方法了...

你可以把圖片編碼成 base64 放在 src
這樣就不會多資料夾了
幫你找了範例 sample

s4028600 iT邦新手 5 級 ‧ 2019-12-25 18:54:10 檢舉

listennn08
這個好暴力
雖然還不確定能不能實現
但要試試

淺水員 iT邦大師 6 級 ‧ 2019-12-25 19:19:49 檢舉

epub 裡面是可以多個資料夾的,一般 epub 檔案比較少把圖檔直接用 base64 內嵌在 html 內。

s4028600 iT邦新手 5 級 ‧ 2019-12-25 19:55:58 檢舉

淺水員
沒錯
但是我目前不知道如何直接包成epub下載
所以只好用html轉檔看看了

淺水員 iT邦大師 6 級 ‧ 2019-12-26 00:44:43 檢舉

這個範例在 zip 檔裡面寫入一個 index.html 跟 image/01.png
稍微改一下內容跟變更副檔名就是 epub 了

import zipfile
import requests
htmlContent='''<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>example</title>
</head>
<body>
    文字內容...
    <div>
        <img src="images/01.png">
    </div>
</body>
</html>
'''

imgUrl='http://lorempixel.com/320/240/'
imgResponse=requests.get(imgUrl)

outZip=zipfile.ZipFile('test.zip', mode='w', compression=zipfile.ZIP_DEFLATED, compresslevel=9)
outZip.writestr('index.html', htmlContent)
outZip.writestr('images/01.png', imgResponse.content)
outZip.close()
s4028600 iT邦新手 5 級 ‧ 2019-12-26 02:06:53 檢舉

淺水員
compresslevel=9是壓縮等級?
會錯誤要刪掉
跑完後沒辦法以epub開啟
稍微改一下內容是指?

稍微研究後發現比想像中複雜太多了
以往只有轉過文字檔
而且是用現成的軟體
要用python處理就...
難度一下實在跳太多...
我先試試html吧

淺水員 iT邦大師 6 級 ‧ 2019-12-26 12:21:57 檢舉

我只是放 html 跟圖檔當作範例
epub 的結構要照某種格式寫,不過也只是把文字檔案(xhtml)跟圖檔塞到 zip 裡面去而已
建議可以去找個 epub 檔案,然後用用一般解壓縮軟體解壓縮,看一下裡面的內容搭配維基的說明大概就知道了

(另外關於 compresslevel 跟 python 版本有關)

s4028600 iT邦新手 5 級 ‧ 2019-12-26 13:38:18 檢舉

雖然我還做不到python來處理epub
但你給的程式碼倒是給我靈感了
只要這樣取得zip後
交給calibre轉換
這樣也能正確顯示圖片了
雖然還是超簡陋...
而且相當依賴calibre

import zipfile
import requests
from bs4 import BeautifulSoup

a=1

url = ''
res=requests.get(url)
res.encoding='gbk'
soup=BeautifulSoup(res.text,'html.parser')
html=soup.select('#contentmain')[0].prettify()

outZip=zipfile.ZipFile('test.zip', mode='w', compression=zipfile.ZIP_DEFLATED)#, compresslevel=9)

for img in soup.select('#contentmain'):
    for src in img.select('img'):
        filename='images/%02d.jpg'%a
        print(src['src'])
        html=html.replace(src['src'],filename)
        imgUrl=src['src']
        imgResponse=requests.get(imgUrl)
        outZip.writestr(filename, imgResponse.content)
        a+=1
print(html)
htmlContent=html
outZip.writestr('index.html', htmlContent)
outZip.close()
s4028600 iT邦新手 5 級 ‧ 2019-12-26 13:52:39 檢舉

淺水員
我發完文才看到
看來我的網路有問題...

compresslevel 跟 python 版本有關
查不到啊
是我版本太低嗎
python --version
Python 3.6.1

ccutmis iT邦高手 2 級 ‧ 2019-12-26 16:58:16 檢舉

https://docs.python.org/3.7/library/zipfile.html#zipfile-objects
Changed in version 3.7: Add the compresslevel parameter.

0
alex0831
iT邦新手 5 級 ‧ 2020-07-23 00:10:58

這個線上教學有你需要的圖文爬取做法,我自己看了之後很有幫助,課程評價非常好,應該可以解決你的問題!

https://www.udemy.com/course/python-crawler/?referralCode=A4F2B9D20A2C35D5001D

我要發表回答

立即登入回答