日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python爬虫之爬取某文库文章

發布時間:2023/12/14 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python爬虫之爬取某文库文章 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 說在前面的話:
  • 一、源碼展示:
  • 二、完整代碼展示及運行效果圖
    • **1.完整代碼:**
    • **2.效果圖:**
  • 三、解析源碼:
    • **1. 問題解決:**
    • **2.自動登錄:**
    • **3.問題解決:**
  • 四、總結:

說在前面的話:

本篇筆記準確地說應該是一篇改進版文章。
其來源于: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 ##需要安裝第三方庫python-docx from docx.shared import Pt # 用于設置字體樣式 import timedriver = 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 += 1result_text = result_text.replace("\n", "") zf = 0 while zf <= 9:s = str(zf) + "、"# print (s)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) # 增加一個paragraph,寫入內容 doc.save(docx_path) # 保存文檔

其原因是可能文庫進行了更新,當我們在點擊 繼續閱讀 時,會彈出需要登錄。

所以本文是在上面代碼的基礎上,解決其登錄問題。同時,本人似乎也發現了某庫在登錄時的一個小小bug。且聽我來慢慢細說。

二、完整代碼展示及運行效果圖

1.完整代碼:

# -*- codeing=utf-8 -*- # @Time:2021/7/30 12:06 # @Atuhor:@lwtyh # @File:demo.py # @Software:PyCharmimport pandas import selenium from selenium.webdriver.common.keys import Keys from selenium import webdriver from docx.oxml.ns import qn # 中文格式 from docx import Document # 需要安裝第三方庫python-docx from docx.shared import Pt # 用于設置字體樣式 import timedriver = webdriver.Chrome(".\chromedriver.exe") # 將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 += 1result_text = result_text.replace("\n", "") zf = 0 while zf <= 9:s = str(zf) + "、"# print (s)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) # 增加一個paragraph,寫入內容 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 進行爬取,暫不能對其它文章進行內容獲取,但是,有一便有二 ,歡迎各位進行多方面的探索,相互交流。
  • 如果你認真的看完了本篇筆記,會發現文中還遺留著一個問題,即 如何破解驗證方式
  • 如若在運行時出現報錯等問題,歡迎留言,相互探討解決,共勉!
  • 總結

    以上是生活随笔為你收集整理的Python爬虫之爬取某文库文章的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。