资讯专栏INFORMATION COLUMN

记一次还可以抢救一下的爬虫私活,求接盘!

alanoddsoff / 770人阅读

摘要:前言最近接了一个爬虫的私活,收益颇丰。项目需求一个类似百度文库的网站,要求给出获得文章,以形式保存下来。但是这次需要保存到这不难,难在要求格式不变。文章都是以许多标签组合在一起的。知情人请告知,感激不尽。

前言

最近接了一个爬虫的私活,收益颇丰。自认为对爬虫掌握的还算不错,爬过很多国内外网站,
数据超过百万,应对过封IP、设验证码、假数据、强制登录等反爬虫手段。于是乎,我毫不犹豫的接下了该活。

但是进行了一半,我遇到了困难,写这篇文章希望能够找到感兴趣的朋友一起解决,一起分享劳动成果。如果到期没有解决的话,就当一次经历记录一下也罢。

项目需求

一个类似百度文库的网站,要求给出url,获得文章,以Word形式保存下来。保持格式不变

我的进展和思路

我以前爬数据都是以文本的形式获得数据,然后清洗,保存数据库。但是这次需要保存到word,这不难,难在要求格式不变。我打算根据元素的css属性,设置在word里面的格式

获取文本和样式

首先我使用我最熟悉的python+selenium+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元素,然后就是一系列的定位取值操作,很容易的取到了文章的文本。文章都是以许多

标签组合在一起的。通过绝对定位控制格式。
(爬虫手法详情https://segmentfault.com/a/11...)

我利用selenium的value_of_css_property()方法可以获得元素的属性(font-familytopfont-size),这个方法比较强,不仅可以获得行内样式的css,还可以获得外嵌式的css,所以我不用担心它的样式写在css文件里。这样每一行的格式我就得到了。

1. 怎么换行?对比该元素和上一个元素的top属性的值,如果不一样就换行,高度不一样必定不在一行,很合理。
2. 文字大小?元素的font-size的大小换算公式 ($/14 +0.5),差不多匹配docx里面的run.font.size的值

docx写入word

python库里面操作word使用的是docxdocx对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的爬取和保存。

瓶颈

但是我遇到了更复杂的格式,就是表格。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天,搞不定这个问题话就黄了,如果有朋友能够解决或者有思路的话可以一起完成,报酬四位数。一起吃鸡,真不舍得放弃!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43617.html

相关文章

  • 一次奇怪debug:Tomcat部署网站每一个页面第一次打开404刷新后才正常显示

    摘要:第二次尝试以为是打包过程中出现了问题,清理项目重新打,然后重新部署到上,仍然没有解决问题。于是我在所有目录下都找了一遍,果然在目录下发现了一个项目的同名文件关,删除之。重新把新的包到目录下后重启。 序 不久前毕设网站的第三版上线,然后我遇到了一个奇怪的bug: 访问页面的时候,第一次打开404,必须F5刷新后才能正常显示 简直迷 第一次尝试 最开始以为是浏览器缓存没有清理【思路大概是...

    CompileYouth 评论0 收藏0
  • 一次奇怪debug:Tomcat部署网站每一个页面第一次打开404刷新后才正常显示

    摘要:第二次尝试以为是打包过程中出现了问题,清理项目重新打,然后重新部署到上,仍然没有解决问题。于是我在所有目录下都找了一遍,果然在目录下发现了一个项目的同名文件关,删除之。重新把新的包到目录下后重启。 序 不久前毕设网站的第三版上线,然后我遇到了一个奇怪的bug: 访问页面的时候,第一次打开404,必须F5刷新后才能正常显示 简直迷 第一次尝试 最开始以为是浏览器缓存没有清理【思路大概是...

    Nino 评论0 收藏0
  • 【FAILED】一次Python后端开发面试经历

    摘要:正确的思路是等概率随机只取出共个数,每个数出现的概率也是相等的随机输出把一段代码改成,并增加单元测试。代码本身很简单,即使没学过也能看懂,改后的代码如下但是对于单元测试则仅限于听过的地步,需要用到,好像也有别的模块。 在拉勾上投了十几个公司,大部分都被标记为不合适,有两个给了面试机会,其中一个自己觉得肯定不会去的,也就没有去面试,另一个经历了一轮电话面加一轮现场笔试和面试,在此记录一下...

    kohoh_ 评论0 收藏0
  • 一次小程序之旅

    摘要:用户绑定的逻辑主要复杂在既需要考虑微信本身的接口在不同情况下提供的数据不同,另外一方面就是考虑本身用户模块的业务逻辑问题。针对每一节课以及每一节系列课程生成小程序太阳码主要涉及到几个细节问题。 感觉已经好久没写程序了,最近这段时间,一方面是学习了python,然后折腾了scrapy框架,用python写了下守护进程程序监听任务以及用redis做队列任务通信,并开进程来处理爬虫任务。以上...

    不知名网友 评论0 收藏0
  • 「Do.018」接私活儿,是否有必要?

    摘要:对于接这样的私活儿,我个人的看法是因人而异的。对于这一类私活儿我个人的态度是有非常必要的。这就是我说的接技术以外的私活儿是有必要的,尽管你自己都不曾意识到这是在接私活儿。 showImg(https://segmentfault.com/img/remote/1460000017714596?w=1280&h=720); 首发公众号:Android程序员日记作者:贤榆的榆如果你觉得有帮...

    arashicage 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<