Python实现数据技术|爬虫便可获取免费百度文库付费文档
相信大家在百度文檔中看到了比較合適的文檔之后就有了想下載學(xué)習(xí)一下的想法,但是有些時(shí)候文章更多的需要付費(fèi)下載,針對(duì)于文檔中能發(fā)現(xiàn)語句是分為一個(gè)一個(gè)的標(biāo)簽中的文本進(jìn)行輸出的。如果你有耐心和任勞任怨的想法,可以檢查頁面的元素進(jìn)行一條一條的粘貼復(fù)制。這里提供一個(gè)不用花錢、不用浪費(fèi)時(shí)間的方法進(jìn)行快速而又簡潔的方法實(shí)現(xiàn)以上功能。
搜索百度文庫查找到自己想要的文檔,復(fù)制下來URL網(wǎng)址保存到記事本以作備用。
接下來開始具體步驟:
一、學(xué)習(xí)預(yù)熱
1、Selenium及相關(guān)軟件介紹
Selenium是一種支持多種瀏覽器進(jìn)行實(shí)現(xiàn)Web界面測(cè)試的自動(dòng)化測(cè)試工具,主流瀏覽器如Chrome,Safari,Firefox等都能使用。也可以說Selenium是支持多種語言開發(fā)的插件,C、Java、Ruby、Python等都是可以使用的。
2、PyCharm、Anaconda3的Jupyter Notebook、Anaconda3的Jupyter Navigator等python開發(fā)工具
筆者這里使用PyCharm開發(fā)工具實(shí)現(xiàn)selenium的安裝,下面給出上面幾種工具的下載鏈接,以供讀者選擇:
PyCharm:https://www.jetbrains.com/pycharm/download/
Anaconda3:https://www.anaconda.com/distribution/
Anaconda指的是一個(gè)開源的Python發(fā)行版本,其包含了conda、Python等180多個(gè)科學(xué)包及其依賴項(xiàng)。因?yàn)榘舜罅康目茖W(xué)包,Anaconda 的下載文件比較大,其中也包括了Jupyter?Notebook。
3、selenium的安裝方式多種多樣
(1)這里使用 Pycharm的本地控制臺(tái)Terminal中輸入:
pip install selenium(下載3.0版本)
(2)win+R輸入cmd,彈出cmd窗口輸入指令也可以下載。
這里我們先嘗試一個(gè)能否使用selenium的功能:
from selenium import webdriver browser = webdriver.Chrome() browser = webdriver.Firefox() browser.get('http://www.baidu.com')這里使用了谷歌瀏覽器和火狐瀏覽器驅(qū)動(dòng)文件的功能,這里筆者建議在本地創(chuàng)建的項(xiàng)目下的第一級(jí)目錄下載驅(qū)動(dòng)文件。
火狐瀏覽器需要網(wǎng)上下載geckodriver,這里給出Windows64位的下載地址:
http://pan.baidu.com/s/1gfP8CON
其他系統(tǒng)以及最新的geckodriver可以到github社區(qū)中下載:
http://github.com/mozilla/geckodriver/releases
谷歌瀏覽器chromedriver下載地址:
http://npm.taobao.org/mirrors/chromedriver
Windows下,下載好軟件直接解壓,然后復(fù)制geckodriver.exe(或chromedriver.exe)到任何已添加到環(huán)境變量的文件夾比如下圖的:C:\Python36等文件夾。
也可以直接引入插件的工具類也是可以的:
from selenium import webdriverbrowser = webdriver.Chorme('') browser = webdriver.Firefox('') browser.get('http://www.baidu.com')這里注意括號(hào)中的單引號(hào)中的地址為安裝驅(qū)動(dòng)文件的絕對(duì)路徑,通過驅(qū)動(dòng)的位置傳參就可以調(diào)用驅(qū)動(dòng)。如下圖:
?
這樣就可以實(shí)現(xiàn)瀏覽器的自動(dòng)瀏覽了,那么這又和爬蟲有什么關(guān)系呢?
二、使用selenium進(jìn)行爬蟲
接下來我們寫一個(gè)小程序,大家應(yīng)該就能知道為什么selenium可以應(yīng)用到爬蟲技術(shù)里面!
下面的代碼實(shí)現(xiàn)了模擬提交搜索的功能,首先等頁面加載完成,然后輸入到搜索框文本,點(diǎn)擊提交,然后使用page_source打印提交后的頁面的源代碼。
from selenium import webdriver from selenium.webdriver.common.key import Keysdriver = 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方法會(huì)打開請(qǐng)求的URL(網(wǎng)址,WebDriver會(huì)等待頁面完全加載完成之后才會(huì)返回,即程序會(huì)等待頁面的所有內(nèi)容加載完成,JS渲染完畢之后才繼續(xù)往下執(zhí)行。注意:如果這里用到了特別多的Ajax的話,程序可能不知道是否已經(jīng)完全加載完畢。
WebDriver 提供了許多尋找網(wǎng)頁元素的方法,譬如find_element_by_*的方法。例如一個(gè)輸入框可以通過find_element_by_name方法尋找name屬性來確定。
然后我們輸入文本再模擬點(diǎn)擊了回車,就像我們敲擊鍵盤一樣。我們可以利用Keys這個(gè)類來模擬鍵盤輸入。
最后也最重要的一點(diǎn)是可以獲取網(wǎng)頁渲染后的源代碼。通過輸出page_source屬性即可。這樣,我們就可以做到網(wǎng)頁的動(dòng)態(tài)爬取了!
最后我們?cè)俸唵谓榻B一下selenium的功能,以下功能每個(gè)會(huì)其中一個(gè)就足以寫爬蟲程序啦。不過有時(shí)候可能一種方法不管用,那么我們就可以嘗試一下其他方法。
?
三、使用XPath語法進(jìn)行元素選取
? 元素選取
element= driver.find_element_by_id("passwd-id") # 根據(jù)id屬性查找元素 element= driver.find_element_by_name("passwd") # 根據(jù)name屬性查找元素 element= driver.find_elements_by_tag_name("input") # 根據(jù)標(biāo)簽的name屬性查找元素 element= driver.find_element_by_xpath("//input[@id='passwd-id']") # 根據(jù)xpath查找元素XPath即為XML路徑語言,它是一種用來確定XML(標(biāo)準(zhǔn)通用標(biāo)記語言)的子集,文檔中某部分位置的語言。
具體的索引方式大家可以直接查看xpath參考手冊(cè),百度xpath即可搜到。不過我之前說過不需要任何基礎(chǔ)就能實(shí)現(xiàn)爬蟲的過程,大家繼續(xù)看下去就知道怎么回事了。
? 界面交互
通過元素選取,我們能夠找到元素的位置,我們可以根據(jù)這個(gè)元素的位置進(jìn)行相應(yīng)的事件操作,例如輸入文本框內(nèi)容、鼠標(biāo)單擊、填充表單、元素拖拽等等。具體我就不細(xì)講了,想學(xué)的可以查看官方文檔進(jìn)行學(xué)習(xí)。
? 添加到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就先介紹這么多,對(duì)于本次實(shí)戰(zhàn)內(nèi)容,已經(jīng)足夠~~
四、百度文庫爬蟲
之前我賣了個(gè)關(guān)子,接下來我可以告訴大家哪怕你不懂xpath的知識(shí),也能很輕松地在python爬蟲中用xpath找到你需要地信息。
我們先看一下我們要爬取的這個(gè)百度文庫的網(wǎng)站,以火狐瀏覽器為例。
我們可以右鍵單擊繼續(xù)閱讀的部分,左鍵點(diǎn)擊查看元素。
我們可以看到這是一個(gè)在spanclass = “moreBtn goBtn”里的代碼,那我們用selenium里模擬點(diǎn)擊的方法就可以解決后續(xù)內(nèi)容的爬取了。
這個(gè)繼續(xù)閱讀的按鈕并不能通過selenium訪問,因?yàn)樗{(diào)用了js代碼里的功能,而js代碼我們很難找到是哪一個(gè)。
不過解決這個(gè)問題也不難,反正是模擬真實(shí)的瀏覽器登錄嘛。那我們繼續(xù)模擬調(diào)用js訪問(簡單來說,就是模擬點(diǎn)擊了繼續(xù)閱讀的按鈕),代碼如下:
js= 'document.getElementsByClassName("moreBtn goBtn")[0].click();' driver.execute_script(js)這樣就搞定了,如果大家寫其他爬蟲時(shí)不能直接模擬一些操作,那么就可以考慮是不是要調(diào)用js,這個(gè)方法還是屢試不爽的。
好了,接下來我們就要用xpath索引到網(wǎng)頁源代碼里的文字部分。
還是和之前一樣找到內(nèi)容部分,然后查看這部分的代碼(左鍵單擊查看元素)。
我們直接右鍵點(diǎn)擊該源代碼,然后按照下圖進(jìn)行選擇,這樣就可以直接得到這部分的xpath了,而不需要自己根據(jù)xml的規(guī)則去推xpath的寫法,不需要任何基礎(chǔ),鼠標(biāo)點(diǎn)一點(diǎn)就能搞定了,這就很nice!
# _*_coding : UTF-8_*_ # 開發(fā)團(tuán)隊(duì) : 棕熊 # 開發(fā)人員 : Administrator # 開發(fā)時(shí)間 : 2019/12/2 21:39 # 文件名稱 : bug1.py.PY # 開發(fā)工具 : PyCharm # 任務(wù) : bug1.pyfrom 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')#導(dǎo)入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") #等頁面加載完全后根據(jù)xpath進(jìn)行索引,與下面的取其一即可 driver.implicitly_wait(10)#設(shè)置瀏覽器等待時(shí)間,讓網(wǎng)頁完全加載 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") #根據(jù)xpath進(jìn)行索引 a = "" for t in data1: # 遍歷把數(shù)據(jù)導(dǎo)入變量中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) #模擬按鈕點(diǎn)擊 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'))結(jié)果會(huì)生成這樣一個(gè)txt文檔:
不過格式,就需要我們自己調(diào)整一下了。
然而并沒有結(jié)束,因?yàn)殡m然我們看著瀏覽器自動(dòng)控制很帥,但是一次兩次還好,次數(shù)一多未免太慢了。我們的時(shí)間要獻(xiàn)給人類的發(fā)展,怎么能浪費(fèi)在這里呢!!再給大家介紹一個(gè)好東西——phantomjs。
我們要做的就是python+selenium+phantomjs,一個(gè)高效穩(wěn)定的爬蟲就搞定了!
用法其實(shí)只需要改一下,代碼中已經(jīng)注釋起來了:
driver = webdriver.PhantomJS()當(dāng)然,千萬別忘了下載phantomjs,驅(qū)動(dòng)文件的導(dǎo)入和之前的一樣。
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Python实现数据技术|爬虫便可获取免费百度文库付费文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UI自动化测试(APP测试)
- 下一篇: 车路协同发展挑战与影响解析