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