Python3⽹络爬⾍(九):使⽤Selenium爬取百度⽂库word⽂章
1 前⾔
⼤家都应该有过从百度⽂库下载东西的经历,对于下载需要下载券的⽂章,我们可以办理⽂库VIP(⼟豪的选择):
有的⼈也会在某宝购买⼀定的下载券,然后进⾏下载。⽽另⼀些勤勤恳恳的⼈,则会选择上传⽂章,慢慢攒下载券。任劳任怨的⼈,则会⾃⼰⼀点⼀点的复制粘贴,复制到word⾥⽂字太⼤,那就复制到txt⽂件⾥。⽽既不想花钱⼜不想攒下载券,也不想⼀点⼀点复制粘贴的⼈,会选择“冰点⽂库”这样的下载软件,不过貌似现在“冰点⽂库”已经不能使⽤了。当然,还有⼀些其他破解⽅法,⽐如放到⼿机的百度⽂库APP⾥,另存为⽂章,不需要下载券就可以下载⽂章。诸如此类的⽅法,可谓五花⼋门。⽽对于学习爬⾍的⼈来说,⾯对怎样免费下载⼀个付费的word⽂章的问题,第⼀个想到的应该就是:⾃⼰写个程序搞下来。
2 问题分析
我们以如何下载下⾯这篇⽂章为例,分析问题:
我想,看到这样的⼀个⽂章,如果爬取当前页⾯的内容还是很好爬的吧。感觉so easy!⾄少我当时是这么想的,但是当把⽂章翻到最下⽅的时候,我看到了如下内容:
呃….需要点击“继续阅读”才能显⽰后续的内容,我单爬这⼀页内容,是爬不到后续的内容的。第⼀个想到的⽅法是,抓包分析下,然
后我⼜⼀次蒙逼了:
scripta materialia影响因子Request URL这么长!!最后的expire时间信息好解决,其他的信息呢?不想做⽆谓的挣扎,因此,我果断地放弃这个⽅法。
问题:获取当前页的内容好办,怎么获取接下来页⾯的内容?
blob怎么读带着这个思考,Selenium神器⾛⼊了我的视线。
3 预备知识
3.1 Selenium
3.1.1 简介
Selenium 是什么?⼀句话,⾃动化测试⼯具。它⽀持各种浏览器,包括 Chrome,Safari,Firefox 等主流界⾯式浏览器,如果你在这
些浏览器⾥⾯安装⼀个 Selenium 的插件,那么便可以⽅便地实现Web界⾯的测试。换句话说叫 Selenium ⽀持这些浏览器驱动。
Selenium⽀持多种语⾔开发,⽐如 Java,C,Ruby等等,⽽对于Python,当然也是⽀持的!
3.1.2 安装
pip3 install selenium
3.1.3 基础知识
3.1.3.1 ⼩试⽜⼑
我们先来⼀个⼩例⼦感受⼀下 Selenium,这⾥我们⽤ Chrome 浏览器来测试。
运⾏这段代码,会⾃动打开浏览器,然后访问百度。
如果程序执⾏错误,浏览器没有打开,那么应该是没有装 Chrome 浏览器或者 Chrome 驱动没有配置在环境变量⾥。下载驱动,然后将驱动⽂件路径配置在环境变量即可。
windows下设置环境变量的⽅法: win+r ,输⼊sysdm.cpl
,点击确定,出现如下对话框:
选择⾼级->环境变量。在系统变量的Path变量中,添加驱动⽂件路径即可(注意:分号)。 Linux的环境变量也好设置,在~/.bashrc ⽂件中export即可,记得source ~/.bashrc 。
当然,你不设置环境变量也是可以的,程序可以这样写: 上⾯的path\to\ 是你的chrome驱动⽂件位置,可以使⽤绝对路径。我们通过驱动的位置传递参数,也可以调⽤驱动,结果如下图所⽰:
from selenium import webdriver
browser = webdriver.Chrome()
< ('www.baidu/')
from selenium import webdriver
browser = webdriver.Chrome('path\to\')
< ('www.baidu/')
爬虫软件 app3.1.3.2 模拟提交
下⾯的代码实现了模拟提交提交搜索的功能,⾸先等页⾯加载完成,然后输⼊到搜索框⽂本,点击提交,然后使⽤page_source打印提交后的页⾯的信息。 全⾃动的哦,程序操控!是不是很酷炫?
from selenium import webdriver
from selenium .webdrivermon.keys import Keys
driver = webdriver .Chrome ()
driver .get ("")
assert "Python" in driver .title
elem = driver .find _element_by_name("q")
elem .send _keys("pycon")
elem .send _keys(Keys .RETURN )
print(driver .page _source)
其中 ⽅法会打开请求的URL,WebDriver 会等待页⾯完全加载完成之后才会返回,即程序会等待页⾯的所有内容加载完成,JS渲染完毕之后才继续往下执⾏。注意:如果这⾥⽤到了特别多的 Ajax 的话,程序可能不知道是否已经完全加载完毕。 WebDriver 提供了许多寻⽹页元素的⽅法,譬如 find_element_by_* 的⽅法。例如⼀个输⼊框可以通过 find_element_by_name ⽅法寻 name 属性来确定。
然后我们输⼊来⽂本然后模拟点击了回车,就像我们敲击键盘⼀样。我们可以利⽤ Keys 这个类来模拟键盘输⼊。 最后最重要的⼀点是可以获取⽹页渲染后的源代码。通过,输出 page_source 属性即可。这样,我们就可以做到⽹页的动态爬取了。
3.1.3.3 元素选取
关于元素的选取,有如下API:汽车编程怎么入门
单个元素选取:
多个元素选取: 另外还可以利⽤ By 类来确定哪种选择⽅式:find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name find_element_by_css_selector
find_elements_by_name
支持phpfind_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
cmd列出磁盘列表find_elements_by_css_selector
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论