最近接了一个爬虫的私活,收益颇丰。自认为对爬虫掌握的还算不错,爬过不少国内外网站,
数据超过百万,应对过封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天,搞不定这个问题话就黄了,若是有朋友可以解决或者有思路的话能够一块儿完成,报酬四位数。一块儿吃鸡,真不舍得放弃!