数据技术 |
您所在的位置:网站首页 › 怎么下载百度文库中的付费文档 › 数据技术 |
一.问题介绍 大家都应该有过从百度文库下载东西的经历,对于下载需要下载券的文章,我们可以办理文库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,驱动文件的导入和之前的一样。 以后遇到百度文库的文字文档要下载的话,我们就可以和下载券说拜拜啦,美滋滋~~~ |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |