Python实现数据技术|爬虫便可获取免费百度文库付费文档

相信大家在百度文档中看到了比较合适的文档之后就有了想下载学习一下的想法,但是有些时候文章更多的需要付费下载,针对于文档中能发现语句是分为一个一个的标签中的文本进行输出的。如果你有耐心和任劳任怨的想法,可以检查页面的元素进行一条一条的粘贴复制。这里提供一个不用花钱、不用浪费时间的方法进行快速而又简洁的方法实现以上功能。

搜索百度文库查找到自己想要的文档,复制下来URL网址保存到记事本以作备用。

接下来开始具体步骤:

一、学习预热

1、Selenium及相关软件介绍

Selenium是一种支持多种浏览器进行实现Web界面测试的自动化测试工具,主流浏览器如Chrome,Safari,Firefox等都能使用。也可以说Selenium是支持多种语言开发的插件,C、Java、Ruby、Python等都是可以使用的。

2、PyCharm、Anaconda3的Jupyter Notebook、Anaconda3的Jupyter Navigator等python开发工具

笔者这里使用PyCharm开发工具实现selenium的安装,下面给出上面几种工具的下载链接,以供读者选择:

PyCharm:https://www.jetbrains.com/pycharm/download/

Anaconda3:https://www.anaconda.com/distribution/

Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda 的下载文件比较大,其中也包括了Jupyter Notebook。

3、selenium的安装方式多种多样

(1)这里使用 Pycharm的本地控制台Terminal中输入:

pip install selenium(下载3.0版本)

(2)win+R输入cmd,弹出cmd窗口输入指令也可以下载。

这里我们先尝试一个能否使用selenium的功能:

  1. from selenium import webdriver
  2. browser = webdriver.Chrome()
  3. browser = webdriver.Firefox()
  4. browser.get('http://www.baidu.com')

这里使用了谷歌浏览器和火狐浏览器驱动文件的功能,这里笔者建议在本地创建的项目下的第一级目录下载驱动文件。

火狐浏览器需要网上下载geckodriver,这里给出Windows64位的下载地址:

http://pan.baidu.com/s/1gfP8CON

其他系统以及最新的geckodriver可以到github社区中下载:

http://github.com/mozilla/geckodriver/releases

谷歌浏览器chromedriver下载地址:

http://npm.taobao.org/mirrors/chromedriver

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

也可以直接引入插件的工具类也是可以的:

  1. from selenium import webdriver
  2. browser = webdriver.Chorme('')
  3. browser = webdriver.Firefox('')
  4. browser.get('http://www.baidu.com')

这里注意括号中的单引号中的地址为安装驱动文件的绝对路径,通过驱动的位置传参就可以调用驱动。如下图:

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

二、使用selenium进行爬虫

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

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

  1. from selenium import webdriver
  2. from selenium.webdriver.common.key import Keys
  3. driver = webdriver.Chorme()
  4. driver.get('http://www.python.org')
  5. assert 'Python' in driver.title
  6. elem = driver.find_element_by_name('q')
  7. elem.send_key('pycon')
  8. elem.send_keys(Keys.RETURN)
  9. print(driver.page_source)

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

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

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

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

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

三、使用XPath语法进行元素选取

❶ 元素选取

  1. element= driver.find_element_by_id('passwd-id') # 根据id属性查找元素
  2. element= driver.find_element_by_name('passwd') # 根据name属性查找元素
  3. element= driver.find_elements_by_tag_name('input') # 根据标签的name属性查找元素
  4. element= driver.find_element_by_xpath('//input[@id='passwd-id']') # 根据xpath查找元素

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

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

❷ 界面交互

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

❸ 添加到User-Agent

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

  1. from selenium import webdriver
  2. options= webdriver.ChromeOptions()
  3. 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'')
  4. driver=webdriver.Chrome(chrome_options=options)driver.get('http://www.baidu.com/')

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

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

四、百度文库爬虫

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

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

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

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

这个继续阅读的按钮并不能通过selenium访问,因为它调用了js代码里的功能,而js代码我们很难找到是哪一个。

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

  1. js= 'document.getElementsByClassName('moreBtn goBtn')[0].click();'
  2. driver.execute_script(js)

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

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

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

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

  1. # _*_coding : UTF-8_*_
  2. # 开发团队 : 棕熊
  3. # 开发人员 : Administrator
  4. # 开发时间 : 2019/12/2 21:39
  5. # 文件名称 : bug1.py.PY
  6. # 开发工具 : PyCharm
  7. # 任务 : bug1.py
  8. from selenium import webdriver
  9. import re
  10. #from selenium.webdriver.support.wait import WebDriverWait as wt
  11. #driver = webdriver.PhantomJS()
  12. driver = webdriver.Chrome()
  13. driver.get('https://wenku.baidu.com/view/6f8d5ca177232f60dccca1d0.html?from=search')#导入url
  14. #ui = wt(driver,15)
  15. #ui.until(lambdax:x.find_element_by_id('/html/body/div[5]/div[2]/div/div[2]/div[1]/div[1]/div/div[2]/div[1]/div[1]/div/div/div/div/div/div/div[2]/div/p')
  16. #等页面加载完全后根据xpath进行索引,与下面的取其一即可
  17. driver.implicitly_wait(10)#设置浏览器等待时间,让网页完全加载
  18. data1=driver.find_elements_by_xpath('/html/body/div[5]/div[2]/div/div[2]/div[1]/div[1]/div/div[2]/div[1]/div[1]/div/div/div/div/div/div/div[2]/div/p')
  19. #根据xpath进行索引
  20. a = ''
  21. for t in data1: # 遍历把数据导入变量中
  22. try:
  23. m = re.search(r'(\w*)(?P<sign>.*)(\w*)',t.text)
  24. if m:
  25. a+=m.group()
  26. except:
  27. print()
  28. js = 'document.getElementsByClassName('moreBtn goBtn')[0].click();'
  29. driver.execute_script(js)
  30. #模拟按钮点击
  31. driver.implicitly_wait(10)
  32. data2=driver.find_elements_by_xpath('/html/body/div[5]/div[2]/div/div[2]/div[1]/div[1]/div/div[2]/div[1]/div[1]/div[8]/div/div/div/div/div/div[4]/div/p')
  33. for t1 in data2: #遍历输出
  34. try:
  35. m1 = re.search(r'(\w*)(?P<sign>.*)(\w*)',t1.text)
  36. if m1:
  37. a+=m1.group()
  38. except:
  39. print()
  40. with open('百度文库.txt','wb+') as f:
  41. f.write(a.encode('UTF-8'))

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

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

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

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

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

driver = webdriver.PhantomJS()

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

(0)

相关推荐

  • 【编程课堂】selenium 祖传爬虫利器

    一些网页,比如微博,只有在登录状态才能进行页面的访问,或者对数据有比较复杂的验证和保护,直接通过网络请求进行登录并获取数据就会比较麻烦.这种时候,就该本篇的主角 selenium 上场了. Selen ...

  • 学习Python可以从事大数据及爬虫工程师吗?

    Python是一门高级的编程语言,现在越来越多的行业都开始应用Python,也成为大家学习Python的原因.很多人也会问:Python应用行业这么广泛,那么学Python可以从事大数据和爬虫工程师吗 ...

  • python爬虫28 | 你爬下的数据不分析一波可就亏了啊,使用python进行数据可视化

    通过这段时间 小帅b教你从抓包开始 到数据爬取 到数据解析 再到数据存储 相信你已经能抓取大部分你想爬取的网站数据了 恭喜恭喜 但是 数据抓取下来 要好好分析一波 最好的方式就是把数据进行可视化 这样 ...

  • python采集数据的几种途径_详解

    工程师小C的小店 Python编程三剑客:Python编程从入门到实践第2版+快速上手第2版+极客编程(套装共3册) 作者:[美] 埃里克·马瑟斯(Eric Matthes) 出版社:人民邮电出版社 ...

  • 大数据时代大数据技术的应用和面临的挑战

    大数据时代,大数据已经成为了我们生活中一个重要的角色,他在每一个领域都发挥着重要的作用,给我们的生活生产都带来了非常多的便利,那么大数据在我们生活中到底有哪些应用呢?又面临这哪些挑战呢? 一.大数据技 ...

  • python 给定URL 如何获取其内容,并将其保存至HTML文档。

    一,获取URL的内容需要用到标准库urllib包,其中的request模块. ? import urllib.request url='http://www.baidu.com' response=u ...

  • 两会热词:人工智能、大数据技术、信息安全的春天来了吗?可以报考吗?

    最近看到了几篇文章,根据政府工作报告来选择热门专业.确实,两会的议题,尤其是政府工作报告,就是国家今后几年的工作计划.考生要选择专业,当然要跟国家的科技.产业发展一致才会共赢. 在今年的政府报告里面, ...

  • 大数据及大数据技术

    一.大数据的概念 对于互联网行业来说,随着电子商务及互联网的应用越来越多,数据的量呈现指数级的增长,数据的类型也日益多样.海量的数据不仅体量大,而且最为关键的是常规的数据处理技术已经无能为力,大数据处 ...

  • 软件小讲堂 | DEM数据与场地三维地形获取(1)

    Hello~小伙伴们,又到了每周一次的软件小讲堂啦. 对于建筑,景观和城市设计专业的学生而言,场地三维地形的创建是设计过程中不可忽略的重要环节,无论是依据地形进行建筑的布置还是根据坡度选择不同的景观方 ...

  • 软件小讲堂 | DEM数据与场地三维地形获取(2)

    Hello~小伙伴们,又到了每周一次的软件小讲堂啦. 在上周的教程中我们介绍了如何通过google earth来获取场地的DEM高程数据从而在Rhino中构建三维的场地.那么今天我们将学习第二种方法: ...