摘要:前言最近接了一個(gè)爬蟲的私活,收益頗豐。項(xiàng)目需求一個(gè)類似百度文庫(kù)的網(wǎng)站,要求給出獲得文章,以形式保存下來(lái)。但是這次需要保存到這不難,難在要求格式不變。文章都是以許多標(biāo)簽組合在一起的。知情人請(qǐng)告知,感激不盡。
前言
最近接了一個(gè)爬蟲的私活,收益頗豐。自認(rèn)為對(duì)爬蟲掌握的還算不錯(cuò),爬過(guò)很多國(guó)內(nèi)外網(wǎng)站,
數(shù)據(jù)超過(guò)百萬(wàn),應(yīng)對(duì)過(guò)封IP、設(shè)驗(yàn)證碼、假數(shù)據(jù)、強(qiáng)制登錄等反爬蟲手段。于是乎,我毫不猶豫的接下了該活。
但是進(jìn)行了一半,我遇到了困難,寫這篇文章希望能夠找到感興趣的朋友一起解決,一起分享勞動(dòng)成果。如果到期沒(méi)有解決的話,就當(dāng)一次經(jīng)歷記錄一下也罷。
項(xiàng)目需求一個(gè)類似百度文庫(kù)的網(wǎng)站,要求給出url,獲得文章,以Word形式保存下來(lái)。保持格式不變。
我的進(jìn)展和思路我以前爬數(shù)據(jù)都是以文本的形式獲得數(shù)據(jù),然后清洗,保存數(shù)據(jù)庫(kù)。但是這次需要保存到word,這不難,難在要求格式不變。我打算根據(jù)元素的css屬性,設(shè)置在word里面的格式。
獲取文本和樣式首先我使用我最熟悉的python+selenium+chrome組合,無(wú)頭模式啟動(dòng)不用打開瀏覽器比較方便
def open_brower_headless(): chromeOptions = webdriver.ChromeOptions() chromeOptions.add_argument("headless") browser = webdriver.Chrome(chrome_options=chromeOptions) return browser
文章部分是一個(gè)iframe框,通過(guò)selenium的switch_to_frame()方法切換到iframe元素,然后就是一系列的定位取值操作,很容易的取到了文章的文本。文章都是以許多 標(biāo)簽組合在一起的。通過(guò)絕對(duì)定位控制格式。
(爬蟲手法詳情https://segmentfault.com/a/11...)
我利用selenium的value_of_css_property()方法可以獲得元素的屬性(font-family、top、font-size),這個(gè)方法比較強(qiáng),不僅可以獲得行內(nèi)樣式的css,還可以獲得外嵌式的css,所以我不用擔(dān)心它的樣式寫在css文件里。這樣每一行的格式我就得到了。
1. 怎么換行?對(duì)比該元素和上一個(gè)元素的top屬性的值,如果不一樣就換行,高度不一樣必定不在一行,很合理。
2. 文字大小?元素的font-size的大小換算公式 ($/14 +0.5),差不多匹配docx里面的run.font.size的值
python庫(kù)里面操作word使用的是docx,docx對(duì)word 的讀寫有一套完整的方法。比如:添加文字,設(shè)置字體,顏色,大小,段落,表格,添加圖片。
docx的使用也非常簡(jiǎn)單,主要分為三級(jí):file >paragraph >run,下面簡(jiǎn)單介紹一下:
file = docx.Document() #新建文件 f = file.add_paragraph("添加段落") #添加段落 run = f.add_run("追加文字") #追加文字 run.font.color.rgb = RGBColor(0,0,1) #設(shè)置字體顏色 run.font.size = Pt(36) #設(shè)置字體大小 run.font.name = "宋體" #設(shè)置字體 run._element.rPr.rFonts.set(qn("w:eastAsia"), "宋體") run.add_break() #換行 file.save("d.docx") #保存文件至今進(jìn)度
如此我完成了一個(gè)簡(jiǎn)單word的爬取和保存。
瓶頸但是我遇到了更復(fù)雜的格式,就是表格。F12后發(fā)現(xiàn)表格的邊框就是一個(gè)圖片! 至此我不知道怎么進(jìn)行下去了。開始我以為識(shí)別圖片后我可以利用doxc 插入表格,根據(jù)文字的位置,插入在對(duì)應(yīng)的表格里,但是我發(fā)現(xiàn)有的文章還有其他圖片。所以我不能遇到圖片就將下面的文字按照表格里面的文字處理。
其他辦法發(fā)現(xiàn)這條路似乎走不通后,我試了其他辦法,就是pandoc,這是一個(gè)文檔轉(zhuǎn)化工具,windows下安裝后通過(guò)輸入命令來(lái)轉(zhuǎn)化文檔。比如將a.html轉(zhuǎn)化為b.docx
pandoc -s a.html -o b.docx
但是得到得word 格式還沒(méi)有我上面程序?qū)懙暮?,?yīng)該是我不太會(huì)用,網(wǎng)上對(duì)pandoc評(píng)價(jià)很高,幾乎神器。
我嘗試將html先轉(zhuǎn)化為pdf,然后再轉(zhuǎn)word.但是失敗了,需要安裝pdf 引擎,而且需要配中文之類的,總之我沒(méi)有成功,不知道轉(zhuǎn)化成pdf后再轉(zhuǎn)化word 它能否識(shí)別并插入表格。而不是背景圖。
知情人請(qǐng)告知,感激不盡。
我發(fā)現(xiàn)文章結(jié)構(gòu)的class名和百度文庫(kù)里的一樣,這是通過(guò)百度富文本編輯器編輯的吧?,如果是這樣通過(guò)這個(gè)富文本編輯器反編輯一下是否可行?
后面的話距離項(xiàng)目測(cè)試版交期還有3天,搞不定這個(gè)問(wèn)題話就黃了,如果有朋友能夠解決或者有思路的話可以一起完成,報(bào)酬四位數(shù)。一起吃雞,真不舍得放棄!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43617.html
摘要:第二次嘗試以為是打包過(guò)程中出現(xiàn)了問(wèn)題,清理項(xiàng)目重新打,然后重新部署到上,仍然沒(méi)有解決問(wèn)題。于是我在所有目錄下都找了一遍,果然在目錄下發(fā)現(xiàn)了一個(gè)項(xiàng)目的同名文件關(guān),刪除之。重新把新的包到目錄下后重啟。 序 不久前畢設(shè)網(wǎng)站的第三版上線,然后我遇到了一個(gè)奇怪的bug: 訪問(wèn)頁(yè)面的時(shí)候,第一次打開404,必須F5刷新后才能正常顯示 簡(jiǎn)直迷 第一次嘗試 最開始以為是瀏覽器緩存沒(méi)有清理【思路大概是...
摘要:正確的思路是等概率隨機(jī)只取出共個(gè)數(shù),每個(gè)數(shù)出現(xiàn)的概率也是相等的隨機(jī)輸出把一段代碼改成,并增加單元測(cè)試。代碼本身很簡(jiǎn)單,即使沒(méi)學(xué)過(guò)也能看懂,改后的代碼如下但是對(duì)于單元測(cè)試則僅限于聽過(guò)的地步,需要用到,好像也有別的模塊。 在拉勾上投了十幾個(gè)公司,大部分都被標(biāo)記為不合適,有兩個(gè)給了面試機(jī)會(huì),其中一個(gè)自己覺得肯定不會(huì)去的,也就沒(méi)有去面試,另一個(gè)經(jīng)歷了一輪電話面加一輪現(xiàn)場(chǎng)筆試和面試,在此記錄一下...
摘要:用戶綁定的邏輯主要復(fù)雜在既需要考慮微信本身的接口在不同情況下提供的數(shù)據(jù)不同,另外一方面就是考慮本身用戶模塊的業(yè)務(wù)邏輯問(wèn)題。針對(duì)每一節(jié)課以及每一節(jié)系列課程生成小程序太陽(yáng)碼主要涉及到幾個(gè)細(xì)節(jié)問(wèn)題。 感覺已經(jīng)好久沒(méi)寫程序了,最近這段時(shí)間,一方面是學(xué)習(xí)了python,然后折騰了scrapy框架,用python寫了下守護(hù)進(jìn)程程序監(jiān)聽任務(wù)以及用redis做隊(duì)列任務(wù)通信,并開進(jìn)程來(lái)處理爬蟲任務(wù)。以上...
閱讀 1764·2021-10-11 10:59
閱讀 2402·2021-09-30 09:53
閱讀 1765·2021-09-22 15:28
閱讀 2795·2019-08-29 15:29
閱讀 1558·2019-08-29 13:53
閱讀 3207·2019-08-29 12:34
閱讀 2849·2019-08-26 10:16
閱讀 2661·2019-08-23 15:16