数据技术|爬虫一下,百度付费文档轻松得,不用花钱,不用花钱,不用花钱!!!

一.问题介绍

大家都应该有过从百度文库下载东西的经历,对于下载需要下载券的文章,我们可以办理文库VIP(土豪的选择):

有的人也会在某宝购买一定的下载券,然后进行下载。而另一些勤勤恳恳的人,则会选择上传文章,慢慢攒下载券。任劳任怨的人,则会自己一点一点的复制粘贴,复制到word里文字太大,那就复制到txt文件里。而既不想花钱又不想攒下载券,也不想一点一点复制粘贴的人,会选择“冰点文库”这样的下载软件,不过貌似现在“冰点文库”已经不能使用了。但这些都太麻烦了,用爬虫就可以轻松搞定付费文档的文字部分内容。

之前我们已经给大家介绍了基础爬虫的写法,这次我们给大家讲一些更高端的使用方法。如果你之前接触过爬虫可能觉得里面涉及内容太多,实在是不想学,但是接下来我给大家讲的方法一点都不复杂,而且保证没有基础的人也能使用哦。

PS:本次推文涉及的文案、代码以及教学视频的下载链接可以在留言区获取哦!

请大家强烈注意,视频由大一萌妹子花了很多很多时间精心录制。

部分内容涉及上一篇爬虫推文,点击一下!欢迎阅读!

数据技术|十分钟教会你写网络爬虫程序

Ladies and gentlemen,it's show time!

我们以下载这篇文章为例:

URL(网址):

我想,看到这样的一个文章,如果爬取当前页面的内容还是很好爬的吧。感觉so easy!至少我当时是这么想的,但是当把文章翻到最下方的时候,我看到了如下内容:

呃….需要点击“继续阅读”才能显示后续的内容,我单爬这一页内容,是爬不到后续的内容的。第一个想到的方法是,抓包分析下,然后我又一次蒙逼了:

RequestURL这么长!!最后的expire时间信息好解决,其他的信息呢?不想做无谓的挣扎,因此,我果断地放弃这个方法。

问题:获取当前页的内容好办,怎么获取接下来页面的内容?

带着这个思考,Selenium神器走入了我的视线。

二、预备知识

Selenium介绍

Selenium是什么?一句话,自动化测试工具。它支持各种浏览器,包括Chrome,Safari,Firefox等主流界面式浏览器,如果你在这些浏览器里面安装一个Selenium的插件,那么可以方便地实现Web界面的测试。换句话说,Selenium支持多种语言的开发,比如Java,C,Ruby等等,面对我们的Python....当然也是支持的!

安装方式:pip install selenium(下载的是3.x版本的)

在cmd窗口中输入pip指令进行下载!详细内容可以看看我们的上一篇爬虫哦!

详细内容可查看官网文档:

我们举个小栗子:

运行这段代码,会自动打开浏览器,然后访问百度。

如果程序执行错误,浏览器没有打开,应该是没有安装并导入驱动文件。

Windows下,下载好软件直接解压,然后复制geckodriver.exe(或chromedriver.exe)到任何已添加到环境变量的文件夹比如下图的:C:\Python36等文件夹。

当然,你不设置环境变量也是可以的,程序可以这样写:

上面的path\to\your\chromedriver.exe是你的chrome驱动文件位置,可以使用绝对路径。我们通过驱动的位置传递参数,也可以调用驱动,结果如下图所示:

这样就可以实现浏览器的自动浏览了,那么这又和爬虫有什么关系呢?

接下来我们写一个小程序,大家应该就能知道为什么selenium可以应用到爬虫技术里面!

下面的代码实现了模拟提交搜索的功能,首先等页面加载完成,然后输入到搜索框文本,点击提交,然后使用page_source打印提交后的页面的源代码。

全自动的哦,程序操控!是不是很酷炫?

其中driver.get方法会打开请求的URL(网址,WebDriver会等待页面完全加载完成之后才会返回,即程序会等待页面的所有内容加载完成,JS渲染完毕之后才继续往下执行。注意:如果这里用到了特别多的Ajax的话,程序可能不知道是否已经完全加载完毕。

WebDriver 提供了许多寻找网页元素的方法,譬如find_element_by_*的方法。例如一个输入框可以通过find_element_by_name方法寻找name属性来确定。

然后我们输入文本再模拟点击了回车,就像我们敲击键盘一样。我们可以利用Keys这个类来模拟键盘输入。

最后也最重要的一点是可以获取网页渲染后的源代码。通过输出page_source属性即可。这样,我们就可以做到网页的动态爬取了!

最后我们再简单介绍一下selenium的功能,以下功能每个会其中一个就足以写爬虫程序啦。不过有时候可能一种方法不管用,那么我们就可以尝试一下其他方法。

❶ 元素选取

element= driver.find_element_by_id("passwd-id")

//根据id属性查找元素

element= driver.find_element_by_name("passwd")

//根据name属性查找元素

element= driver.find_elements_by_tag_name("input")

//根据标签的name属性查找元素

element= driver.find_element_by_xpath("//input[@id='passwd-id']")

//根据xpath查找元素

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言)的子集,文档中某部分位置的语言。

具体的索引方式大家可以直接查看xpath参考手册,百度xpath即可搜到。不过我之前说过不需要任何基础就能实现爬虫的过程,大家继续看下去就知道怎么回事了。

❷ 界面交互

通过元素选取,我们能够找到元素的位置,我们可以根据这个元素的位置进行相应的事件操作,例如输入文本框内容、鼠标单击、填充表单、元素拖拽等等。具体我就不细讲了,想学的可以查看官方文档进行学习。

❸ 添加到User-Agent

使用webdriver,是可以更改User-Agent的,代码如下:

fromselenium import webdriver

options= webdriver.ChromeOptions()

options.add_argument('user-agent="Mozilla/5.0(Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19(KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19"')

driver=webdriver.Chrome(chrome_options=options)driver.get

使用Android的User-Agent打开浏览器,效果是这样的:

Selenium就先介绍这么多,对于本次实战内容,已经足够~~

三、百度文库爬虫

之前我卖了个关子,接下来我可以告诉大家哪怕你不懂xpath的知识,也能很轻松地在python爬虫中用xpath找到你需要地信息。

我们先看一下我们要爬取的这个百度文库的网站,以火狐浏览器为例。

我们可以右键单击继续阅读的部分,左键点击查看元素。

我们可以看到这是一个在spanclass = “moreBtn goBtn”里的代码,那我们用selenium里模拟点击的方法就可以解决后续内容的爬取了。

不过我还是太小看百度文库的前端工程师了,这个继续阅读的按钮并不能通过selenium访问,因为它调用了js代码里的功能,而js代码我们很难找到是哪一个。

不过解决这个问题也不难,反正是模拟真实的浏览器登录嘛。那我们继续模拟调用js访问(简单来说,就是模拟点击了继续阅读的按钮),代码如下:

js= 'document.getElementsByClassName("moreBtn goBtn")[0].click();'

driver.execute_script(js)

这样就搞定了,如果大家写其他爬虫时不能直接模拟一些操作,那么就可以考虑是不是要调用js,这个方法还是屡试不爽的。

好了,接下来我们就要用xpath索引到网页源代码里的文字部分。

还是和之前一样找到内容部分,然后查看这部分的代码(左键单击查看元素)。

我们直接右键点击该源代码,然后按照下图进行选择,这样就可以直接得到这部分的xpath了,而不需要自己根据xml的规则去推xpath的写法,不需要任何基础,鼠标点一点就能搞定了,这就很nice!

结果会生成这样一个txt文档:

格式,就需要我们自己调整一下了。

然而并没有结束,因为虽然我们看着浏览器自动控制很帅,但是一次两次还好,次数一多未免太慢了。我们的时间要献给人类的发展,怎么能浪费在这里呢!!再给大家介绍一个好东西——phantomjs。

我们要做的就是python+selenium+phantomjs,一个高效稳定的爬虫就搞定了!

用法其实只需要改一下,代码中已经注释起来了:

driver = webdriver.PhantomJS()

当然,千万别忘了下载phantomjs,驱动文件的导入和之前的一样。

以后遇到百度文库的文字文档要下载的话,我们就可以和下载券说拜拜啦,美滋滋~~~

原文发布于微信公众号 - 数据魔术师(gh_39567a079597)

原文发表时间:2018-03-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏指尖下的Android

AndroidStudio无法输出日志的Bug

正常情况下我们在真机调试程序时,如图箭头所指的位置显示的应该是该应用的主包名,但是有的时候明明打开了开发者模式,但是却无法输出日志,该位置显示的也不是应用包名,...

2582
来自专栏DeveWork

纯代码修改WordPress 默认 Gravatar 头像的方法

默认地,在 WordPress 后台的- 设置 - 讨论 下面可以设置默认的 Gravatar 头像,但是 WordPress 自带的可供选择的那几个实在是不得...

2157
来自专栏企鹅号快讯

雅虎前端优化的35条军规

问题:我怎么才能收到你们公众号平台的推送文章呢? 内容部分 1.尽量减少HTTP请求数 80%的终端用户响应时间都花在了前端上,其中大部分时间都在下载页面上的各...

3535
来自专栏自动化测试

手机APP自动化之小白进阶_python

导语 本文介绍用python实现登录微信并发送公众号留言的几种方式,包括遇到的一些问题及解决方法,也附录了一些觉得很全面有用的资料,供想了解app自动化测...

4194
来自专栏极客编程

AngularJS应用开发思维之1:声明式界面

这篇博客之前承接上一篇:http://www.cnblogs.com/xuema/p/4335180.html

921
来自专栏为数不多的Android技巧

mac下自动切换输入法

长久以来,输入法一直是困扰mac用户的一个问题;不过随着国内厂商的跟进,这种状况得到了极大的改善。不用自己去折腾什么鼠须管了,狼厂和企鹅都做的不错。

4581
来自专栏魏琼东

.NET快速开发实践之应用IExtenderProvider实现对象与UI控件的绑定

         现在企业级的信息系统应用开发之中,数据层采用了ORM,解放了之前开发最大工作量的核对SQL语句,我到现在还曾经记得在2002年实医院管理信息系...

1986
来自专栏极客生活

从零开始用Vue+Flask开发知乎小视频下载工具

作为一个几乎从来没做过前端开发的程序员,我近期花了一个周从零开始学习Vue的知识,做了一个知乎小视频的下载Demo,并且成功部署到线上。

1981
来自专栏数据星河

如何对第一个Vue.js组件进行单元测试 (上)

  单元测试是持续集成的关键。通过专注于小的、独立的实体,确保单元测试始终按预期运行,使代码更加可靠,你可以放心地迭代你的项目而不必担坏事儿。

1332
来自专栏黑泽君的专栏

day49_BOS项目_01

其余步骤参考如下链接: https://www.cnblogs.com/chenmingjun/p/9513143.html#_label0 右键项目 -->...

1052

扫码关注云+社区

领取腾讯云代金券