天天看点

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

一.问题介绍

大家都应该有过从百度文库下载东西的经历,对于下载需要下载券的文章,我们可以办理文库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,驱动文件的导入和之前的一样。

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