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嗎
前幾天才在想現在 python 爬資料都用些什麼套件
(因為很少用,還沒更新訊息)
稍微看一下介紹,竟然直接支援 js,看來可以少裝一個套件了
是吧XD
支援 js 還能用 selector
也就不需要 BeautifulSoup
之類的東西
單一個套件可以完成所有東西
比較難爬的
才會考慮用 selenium
或 puppeteer
froce 推推 推推 推推推
ㄜ,雖然這套件我一直推,但是他的JS rendering我自己一直試不成功。XD
有遇到要JS的通常還是selenium比較穩,我主要還是因為他的selector整合得很好才用的。
還是堅持用requests配BS的可以考慮BS換成pyquery,requests-html也是再把pyquery包裝整合起來的產物。
初學者不要再去啃BS那厚厚api了,如果你有在寫網頁,相信用我介紹的這幾個套件,你可以在幾分鐘內寫出簡單的爬蟲。
用BS的話我也得遇到問題慢慢去爬api。
另外我今天才發現,原來BS從4.7開始支援selector了,我剛學爬蟲的時候還沒有。XD
把img挑出來我已經知道了
但是我問的是圖文都下載
然後包到html或我剛剛發現一個叫mht的東西
讓圖文混排在一個檔案
你有兩個選擇
一個是我照我上面說的做
然後把圖片照他的結構放
另一個是把那些 url 加工
加上他的 domain name
前者可以單機瀏覽
後者就需要網路連線
mhtml 我沒試過
你可以試試看
不過我覺得可能會跟你想的不太一樣
dragonH
我還打算多個打包成epub
所以選前者
照他的結構放?
html檔只能文字編輯不能放圖片阿?
還是指超連結?
只能手動難以自動化嗎...
當然可以自動化阿
但是必須仰賴你的 code
舉例來說
他的第一張圖的 src 是
/images/python_install_01.PNG
也就是說你這張圖載下來後
必須放在 images
這 folder 裡
才能讓同一層的 html 正常讀取
依此類推
這樣就多出一個資料夾了...
看來好像沒有其他方法了...
你可以把圖片編碼成 base64 放在 src
這樣就不會多資料夾了
幫你找了範例 sample
listennn08
這個好暴力
雖然還不確定能不能實現
但要試試
epub 裡面是可以多個資料夾的,一般 epub 檔案比較少把圖檔直接用 base64 內嵌在 html 內。
淺水員
沒錯
但是我目前不知道如何直接包成epub下載
所以只好用html轉檔看看了
這個範例在 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()
淺水員
compresslevel=9是壓縮等級?
會錯誤要刪掉
跑完後沒辦法以epub開啟
稍微改一下內容是指?
稍微研究後發現比想像中複雜太多了
以往只有轉過文字檔
而且是用現成的軟體
要用python處理就...
難度一下實在跳太多...
我先試試html吧
我只是放 html 跟圖檔當作範例
epub 的結構要照某種格式寫,不過也只是把文字檔案(xhtml)跟圖檔塞到 zip 裡面去而已
建議可以去找個 epub 檔案,然後用用一般解壓縮軟體解壓縮,看一下裡面的內容搭配維基的說明大概就知道了
(另外關於 compresslevel 跟 python 版本有關)
雖然我還做不到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()
淺水員
我發完文才看到
看來我的網路有問題...
compresslevel 跟 python 版本有關
查不到啊
是我版本太低嗎
python --version
Python 3.6.1
https://docs.python.org/3.7/library/zipfile.html#zipfile-objects
Changed in version 3.7: Add the compresslevel parameter.
這個線上教學有你需要的圖文爬取做法,我自己看了之後很有幫助,課程評價非常好,應該可以解決你的問題!
https://www.udemy.com/course/python-crawler/?referralCode=A4F2B9D20A2C35D5001D