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的功能:
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
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等文件夹。
也可以直接引入插件的工具类也是可以的:
from selenium import webdriver
browser = webdriver.Chorme('')
browser = webdriver.Firefox('')
browser.get('http://www.baidu.com')
这里注意括号中的单引号中的地址为安装驱动文件的绝对路径,通过驱动的位置传参就可以调用驱动。如下图:
这样就可以实现浏览器的自动浏览了,那么这又和爬虫有什么关系呢?
二、使用selenium进行爬虫
接下来我们写一个小程序,大家应该就能知道为什么selenium可以应用到爬虫技术里面!
下面的代码实现了模拟提交搜索的功能,首先等页面加载完成,然后输入到搜索框文本,点击提交,然后使用page_source打印提交后的页面的源代码。
from selenium import webdriver
from selenium.webdriver.common.key import Keys
driver = webdriver.Chorme()
driver.get('http://www.python.org')
assert 'Python' in driver.title
elem = driver.find_element_by_name('q')
elem.send_key('pycon')
elem.send_keys(Keys.RETURN)
print(driver.page_source)
其中driver.get方法会打开请求的URL(网址,WebDriver会等待页面完全加载完成之后才会返回,即程序会等待页面的所有内容加载完成,JS渲染完毕之后才继续往下执行。注意:如果这里用到了特别多的Ajax的话,程序可能不知道是否已经完全加载完毕。
WebDriver 提供了许多寻找网页元素的方法,譬如find_element_by_*的方法。例如一个输入框可以通过find_element_by_name方法寻找name属性来确定。
然后我们输入文本再模拟点击了回车,就像我们敲击键盘一样。我们可以利用Keys这个类来模拟键盘输入。
最后也最重要的一点是可以获取网页渲染后的源代码。通过输出page_source属性即可。这样,我们就可以做到网页的动态爬取了!
最后我们再简单介绍一下selenium的功能,以下功能每个会其中一个就足以写爬虫程序啦。不过有时候可能一种方法不管用,那么我们就可以尝试一下其他方法。
三、使用XPath语法进行元素选取
❶ 元素选取
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的代码如下:
from selenium 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('http://www.baidu.com/')
使用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!
# _*_coding : UTF-8_*_
# 开发团队 : 棕熊
# 开发人员 : Administrator
# 开发时间 : 2019/12/2 21:39
# 文件名称 : bug1.py.PY
# 开发工具 : PyCharm
# 任务 : bug1.py
from selenium import webdriver
import re
#from selenium.webdriver.support.wait import WebDriverWait as wt
#driver = webdriver.PhantomJS()
driver = webdriver.Chrome()
driver.get('https://wenku.baidu.com/view/6f8d5ca177232f60dccca1d0.html?from=search')#导入url
#ui = wt(driver,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')
#等页面加载完全后根据xpath进行索引,与下面的取其一即可
driver.implicitly_wait(10)#设置浏览器等待时间,让网页完全加载
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')
#根据xpath进行索引
a = ''
for t in data1: # 遍历把数据导入变量中
try:
m = re.search(r'(\w*)(?P<sign>.*)(\w*)',t.text)
if m:
a+=m.group()
except:
print()
js = 'document.getElementsByClassName('moreBtn goBtn')[0].click();'
driver.execute_script(js)
#模拟按钮点击
driver.implicitly_wait(10)
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')
for t1 in data2: #遍历输出
try:
m1 = re.search(r'(\w*)(?P<sign>.*)(\w*)',t1.text)
if m1:
a+=m1.group()
except:
print()
with open('百度文库.txt','wb+') as f:
f.write(a.encode('UTF-8'))
结果会生成这样一个txt文档:
不过格式,就需要我们自己调整一下了。
然而并没有结束,因为虽然我们看着浏览器自动控制很帅,但是一次两次还好,次数一多未免太慢了。我们的时间要献给人类的发展,怎么能浪费在这里呢!!再给大家介绍一个好东西——phantomjs。
我们要做的就是python+selenium+phantomjs,一个高效稳定的爬虫就搞定了!
用法其实只需要改一下,代码中已经注释起来了:
driver = webdriver.PhantomJS()
当然,千万别忘了下载phantomjs,驱动文件的导入和之前的一样。