最近接了一個爬蟲的私活,收益頗豐。自認爲對爬蟲掌握的還算不錯,爬過不少國內外網站,
數據超過百萬,應對過封IP、設驗證碼、假數據、強制登陸等反爬蟲手段。因而乎,我堅決果斷的接下了該活。css
可是進行了一半,我遇到了困難,寫這篇文章但願可以找到感興趣的朋友一塊兒解決,一塊兒分享勞動成果。若是到期沒有解決的話,就當一次經歷記錄一下也罷。html
一個相似百度文庫的網站,要求給出url,得到文章,以Word形式保存下來。保持格式不變。python
我之前爬數據都是以文本的形式得到數據,而後清洗,保存數據庫。可是此次須要保存到word,這不難,難在要求格式不變。我打算根據元素的css屬性,設置在word裏面的格式。web
首先我使用我最熟悉的python
+selenium
+chrome
組合,無頭模式啓動不用打開瀏覽器比較方便chrome
def open_brower_headless(): chromeOptions = webdriver.ChromeOptions() chromeOptions.add_argument("headless") browser = webdriver.Chrome(chrome_options=chromeOptions) return browser
文章部分是一個iframe框,經過selenium的switch_to_frame()
方法切換到iframe元素,而後就是一系列的定位取值操做,很容易的取到了文章的文本。文章都是以許多<p>標籤組合在一塊兒的。經過絕對定位控制格式。
(爬蟲手法詳情https://segmentfault.com/a/11...)數據庫
我利用selenium的value_of_css_property()
方法能夠得到元素的屬性(font-family
、top
、font-size
),這個方法比較強,不只能夠得到行內樣式的css,還能夠得到外嵌式的css,因此我不用擔憂它的樣式寫在css文件裏。這樣每一行的格式我就獲得了。segmentfault
1. 怎麼換行?對比該元素和上一個元素的top
屬性的值,若是不同就換行,高度不同一定不在一行,很合理。
2. 文字大小?元素的font-size
的大小換算公式 ($/14 +0.5),差很少匹配docx
裏面的run.font.size
的值windows
python庫裏面操做word使用的是docx
,docx
對word 的讀寫有一套完整的方法。好比:添加文字,設置字體,顏色,大小,段落,表格,添加圖片。
docx的使用也很是簡單,主要分爲三級:file >paragraph >run,下面簡單介紹一下:瀏覽器
file = docx.Document() #新建文件 f = file.add_paragraph("添加段落") #添加段落 run = f.add_run("追加文字") #追加文字 run.font.color.rgb = RGBColor(0,0,1) #設置字體顏色 run.font.size = Pt(36) #設置字體大小 run.font.name = "宋體" #設置字體 run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋體') run.add_break() #換行 file.save("d.docx") #保存文件
如此我完成了一個簡單word的爬取和保存。less
可是我遇到了更復雜的格式,就是表格。F12後發現表格的邊框就是一個圖片! 至此我不知道怎麼進行下去了。開始我覺得識別圖片後我能夠利用doxc 插入表格,根據文字的位置,插入在對應的表格裏,可是我發現有的文章還有其餘圖片。因此我不能遇到圖片就將下面的文字按照表格里面的文字處理。
發現這條路彷佛走不通後,我試了其餘辦法,就是pandoc
,這是一個文檔轉化工具,windows下安裝後經過輸入命令來轉化文檔。好比將a.html轉化爲b.docx
pandoc -s a.html -o b.docx
可是獲得得word 格式尚未我上面程序寫的好,應該是我不太會用,網上對pandoc
評價很高,幾乎神器。
我嘗試將html先轉化爲pdf,而後再轉word.可是失敗了,須要安裝pdf 引擎,並且須要配中文之類的,總之我沒有成功,不知道轉化成pdf後再轉化word 它可否識別並插入表格。而不是背景圖。
知情人請告知,感激涕零。
我發現文章結構的class名和百度文庫裏的同樣,這是經過百度富文本編輯器編輯的吧?,若是是這樣經過這個富文本編輯器反編輯一下是否可行?
距離項目測試版交期還有3天,搞不定這個問題話就黃了,若是有朋友可以解決或者有思路的話能夠一塊兒完成,報酬四位數。一塊兒吃雞,真不捨得放棄!