说在前面的话:
本篇笔记准确地说应该是一篇改进版文章。 其来源于:Python爬取某库并存储为word文档 本文所爬取的文章url:简述基于MATLAB的循环码编译码器设计与仿真胡鑫 需要注意的是,源码中加入很多 time.sleep() 语句,其目的是防止被封IP,即更好的将机器伪装成人为操作。所以,在运行时速度缓慢,请在没有出现报错时,耐心等待。 如若侵权,联系即删
一、源码展示:
这是作者 鹏鹏写代码 文章中的源代码,当我们在运行时,会出现如下图所示的报错:
注:在运行时,我们除了所使用代码中的库时,还需用用到一个软件,即 chromedriver.exe。这是在使用 selenium 必备的。 其具体安装使用情况,详见:Pycharm中错误 ‘chromedriver‘ executable needs to be in PATH 解决
"""author
鹏鹏写代码
"""
import pandas
import selenium
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from docx.oxml.ns import qn
from docx import Document
from docx.shared import Pt
import time
driver = webdriver.Chrome("C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe")
driver.get("http://wenku.baidu.com/view/9f9765542d60ddccda38376baf1ffc4fff47e26c")
time.sleep(5)
driver.refresh()
time.sleep(2)
driver.execute_script("window.scrollTo(0,4004)");
driver.find_element_by_xpath("//div[@class='fold-page-text']").click()
driver.execute_script("window.scrollTo(0,400)");
all_page = driver.find_element_by_xpath("//div[@class='goto-page']").text.replace("/ ", "")
result_text = ""
i = 1
while (i <= int(all_page)):
driver.find_element_by_xpath("//input[@class='cur-page']").clear()
driver.find_element_by_xpath("//input[@class='cur-page']").send_keys(i)
driver.find_element_by_xpath("//input[@class='cur-page']").send_keys(Keys.ENTER, '\ue007')
time.sleep(2)
result_text = result_text + driver.find_element_by_xpath("//div[@id='pageNo-{0}']".format(i)).text
time.sleep(2)
i += 1
result_text = result_text.replace("\n", "")
zf = 0
while zf <= 9:
s = str(zf) + "、"
result_text = result_text.replace(s, "\n" + s)
zf += 1
for zf_s in ('一', '二', '三', '四', '五', '六', '七', 'A', 'B', 'C', 'D', 'E'):
s = zf_s + "、"
t = zf_s + "."
result_text = result_text.replace(s, "\n" + s).replace(t, "\n" + t)
result_text = result_text.replace("\n\n", "\n")
docx_path = "课程设计.docx"
doc = Document()
doc.styles["Normal"].font.name = u"宋体"
doc.styles["Normal"].font.size = Pt(14)
doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
doc.add_paragraph(result_text)
doc.save(docx_path)
其原因是可能文库进行了更新,当我们在点击 继续阅读 时,会弹出需要登录。 所以本文是在上面代码的基础上,解决其登录问题。同时,本人似乎也发现了某库在登录时的一个小小bug。且听我来慢慢细说。
二、完整代码展示及运行效果图
1.完整代码:
import pandas
import selenium
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from docx.oxml.ns import qn
from docx import Document
from docx.shared import Pt
import time
driver = webdriver.Chrome(".\chromedriver.exe")
driver.get("http://wenku.baidu.com/view/9f9765542d60ddccda38376baf1ffc4fff47e26c")
time.sleep(3)
driver.maximize_window()
driver.refresh()
time.sleep(2)
account_login_button = driver.find_element_by_xpath('//div[@class="right-box"]/div[4]')
account_login_button.click()
time.sleep(3)
account_login_button = driver.find_element_by_xpath('//div[@class="tang-pass-footerBar"]/p[2]')
account_login_button.click()
time.sleep(4)
input_account = driver.find_element_by_id('TANGRAM__PSP_11__userName')
input_account.send_keys('请输入账号')
time.sleep(4)
input_password = driver.find_element_by_id('TANGRAM__PSP_11__password')
input_password.send_keys('请输入密码')
time.sleep(2)
login_button = driver.find_element_by_id('TANGRAM__PSP_11__submit')
login_button.click()
time.sleep(2)
account_login_button = driver.find_element_by_xpath('//div[@class="vcode-body vcode-body-spin"]/div[2]')
account_login_button.click()
time.sleep(3)
login_button = driver.find_element_by_id('TANGRAM__PSP_11__submit')
login_button.click()
time.sleep(5)
account_login_button = driver.find_element_by_xpath('//*[@id="app"]/div[3]/div[3]/div[4]/div/div[2]/i')
account_login_button.click()
time.sleep(2)
driver.execute_script("window.scrollTo(0,4004)")
time.sleep(3)
driver.find_element_by_xpath("//div[@class='fold-page-text']").click()
time.sleep(2)
driver.execute_script("window.scrollTo(0,400)")
all_page = driver.find_element_by_xpath("//div[@class='goto-page']").text.replace("/ ", "")
result_text = ""
i = 1
while (i <= int(all_page)):
driver.find_element_by_xpath("//input[@class='cur-page']").clear()
driver.find_element_by_xpath("//input[@class='cur-page']").send_keys(i)
driver.find_element_by_xpath("//input[@class='cur-page']").send_keys(Keys.ENTER, '\ue007')
time.sleep(2)
result_text = result_text + driver.find_element_by_xpath("//div[@id='pageNo-{0}']".format(i)).text
time.sleep(2)
i += 1
result_text = result_text.replace("\n", "")
zf = 0
while zf <= 9:
s = str(zf) + "、"
result_text = result_text.replace(s, "\n" + s)
zf += 1
for zf_s in ('一', '二', '三', '四', '五', '六', '七', 'A', 'B', 'C', 'D', 'E'):
s = zf_s + "、"
t = zf_s + "."
result_text = result_text.replace(s, "\n" + s).replace(t, "\n" + t)
result_text = result_text.replace("\n\n", "\n")
docx_path = "课程设计.docx"
doc = Document()
doc.styles["Normal"].font.name = u"宋体"
doc.styles["Normal"].font.size = Pt(14)
doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
doc.add_paragraph(result_text)
doc.save(docx_path)
2.效果图:
三、解析源码:
1. 问题解决:
问题: 前文说到,当我们在点击 继续阅读 时,会弹出需要登录账号验证才行,否则将不能继续阅读后面的页码,也就会出现上图所示的报错,导致程序无法进行正常运行。 解决方法: 俗话说,“办法总比困难多”。解决这个问题,一个很简单的方法想多不用想,便是进行登录即可。所以便有了后续的代码。
2.自动登录:
小编一开始是想着很简单,那页面不是已经弹出了登录界面吗,便想着好办多了,直接点击 用户名登录 不就行了吗? 但是,现实很残酷,在试了很多次,都无法准确地定位到此按钮(可能是本人能力有限)。 便有了后来的方法。
既然直接登录不行,那便当一打开页面时,便点击登录不就行了。
(1)点击登录: 利用Xpath定位到(如下图所示):
account_login_button = driver.find_element_by_xpath('//div[@class="right-box"]/div[4]')
account_login_button.click()
(2)点击用户名登录:
当点击 登录 后,会弹出如下图所示:
登录方式有很多种,扫码、微博、微信、QQ等,但是能用得到的是 用户名登录 ,其原因在于,其它登录方式肯定需要复杂的验证方式,操作会更难。(小编能力实属不行!)
同样的方法,利用 Xpath语句 定位,并进行点击:
time.sleep(3)
account_login_button = driver.find_element_by_xpath('//div[@class="tang-pass-footerBar"]/p[2]')
account_login_button.click()
(3)输入账号密码:
完成点击 用户名登录操作后,会弹出如下图界面: 这个时候,只需要找到对应的输入框,进行内容输入即可:
输入账号,如下图所示:
input_account = driver.find_element_by_id('TANGRAM__PSP_11__userName')
input_account.send_keys('请输入自己的账号')
time.sleep(4)
输入密码,如下图所示:
input_password = driver.find_element_by_id('TANGRAM__PSP_11__password')
input_password.send_keys('asdfghjkl0707')
time.sleep(2)
(4)点击登录:
账号密码输入完成后,接下来的操作便是点击 登录 ,但是这个时候,出现了一点点小插曲,也就是上文中说到的,小编似乎发现了一个小小的 bug 。
先点击 登录 按钮: 同样的方法,利用 Xpath语句 定位:
login_button = driver.find_element_by_id('TANGRAM__PSP_11__submit')
login_button.click()
(5)发现bug:
我们都知道,99%的网站登陆时,都会进行 安全验证 。 然而,某库这安全验证实属有点难弄(以我的能力而言),在进行了长达数小时的资料查询,都没有找到我所能满意的方式,如需要大量的图片库素材 不知有没有大佬能够解决这种验证方式(如下图所示),求助。
正当放弃时,用鼠标无意中点击 安全验证 右上角的 × ,然后,再重新点击 登录 按钮,居然成功了。( 个人觉得很是意外,不知道这源码在你们的电脑上运行是不是也如此。 )
所以,便有了后面的操作(同样利用 Xpath语句 进行定位):
account_login_button = driver.find_element_by_xpath('//div[@class="vcode-body vcode-body-spin"]/div[2]')
account_login_button.click()
time.sleep(3)
login_button = driver.find_element_by_id('TANGRAM__PSP_11__submit')
login_button.click()
time.sleep(5)
将验证弹窗去掉后,便用重新点击 登录 按钮,进行登录操作,便会成功登录,不会再出现 验证弹窗 了。
(6)叉掉广告:
在成功进行登录后,便又出现了令人讨厌 广告 ,一个小小的 广告 又会影响整个程序的运行,所以,不得不将 广告 叉掉,才能将程序继续运行。 同样的方法,还是利用 Xpath语句 进行右上角 × 的定位,再进行点击,便OK啦!
account_login_button = driver.find_element_by_xpath('//*[@id="app"]/div[3]/div[3]/div[4]/div/div[2]/i')
account_login_button.click()
3.问题解决:
这时,我们再加上之前报错的代码:
time.sleep(2)
driver.execute_script("window.scrollTo(0,4004)")
time.sleep(3)
driver.find_element_by_xpath("//div[@class='fold-page-text']").click()
time.sleep(2)
driver.execute_script("window.scrollTo(0,400)")
会发现不会出现报错了,顺利的点击 继续阅读 ,展示出所有页面,然后 跳转到页面初始位置 ,进行后续操作。
四、总结:
- 后续内容便是 Python爬取某库并存储为word文档 中的代码了。其源码解析小编能力有限,不能做详细的分析,请见谅!
- 所以,本篇文章的重点在于 解决登录、验证以及在登录后所弹出的广告进行叉掉 。
- 目前看来,此代码只适合当前 URL 进行爬取,暂不能对其它文章进行内容获取,但是,有一便有二 ,欢迎各位进行多方面的探索,相互交流。
- 如果你认真的看完了本篇笔记,会发现文中还遗留着一个问题,即 如何破解验证方式 。
- 如若在运行时出现报错等问题,欢迎留言,相互探讨解决,共勉!
|