背景
我需要獲得新聞,然后tts
,在每天上班的路上可以聽一下。具體的方案后期我也會做一次分享。先看我喜歡的萬能的老路:獲得html內容-> python的工具庫解析,獲得元素中的內容,完成。
好家伙,我知道我爬取失敗了。一堆js代碼,看得我煩。我一去看頁面發現:原來新聞的獲得是走的接口,然后js插入文檔的,于是啃接口。
又被難住了!接口的pageCallback
是什么,感覺我的經驗,這個是復雜的js加密之后的,因為沒有帶這個參數,可以輕易的通過接口獲得想要的數據。
假如沒有這個參數,我其實可以為所欲為
了。所以,分析pageCallback
這個參數的加密非常耗時間了。也不打算研究,我決定換一種方式去研究。?拿出我的終極大招:
Selenium
。模擬用戶的操作,該不會攔截我吧。
爬蟲2.0
使用Selenium
模擬用戶爬取頁面內容,并輸出成文件。關于Selenium
是什么,歡迎看這篇文章:selenium Python教程。在這里,我只講我主要的實現。
首先作為一款工具腳本,我們應該不喜歡窗口界面吧,除非你需要動態的觀察程序的操作。所以,我開啟了無頭瀏覽器
模式。
# 無頭瀏覽器
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
關鍵的driver
拿到之后,剩下的過程就簡單了。和一般的requests
、spider
爬蟲一樣,需要獲得頁面的代碼,然后解析對應的元素,拿到屬性或者文本。
# titles
title_elems = driver.find_elements(by=By.CLASS_NAME, value="item-title")
titles = [title_elem.text for title_elem in title_elems]
是不是很神奇,看到了By.CLASS_NAME
,是不是一下子聯想到了CSS了。是的,你的預感足夠的正確。如果以上的內容帶給你足夠的震撼和驚奇,請繼續往下看,
# 所有的更新時間
related_elems = driver.find_elements(by=By.CSS_SELECTOR, value="div.item-related > span.time")
relateds = [related_elem.text for related_elem in related_elems]
# 所有的描述信息
desc_elems = driver.find_elements(by=By.CSS_SELECTOR, value="div.item-desc > span")
# 需要去除新聞摘要結尾的()內容
descs = [desc_item.text[:desc_item.text.rfind('(')] for desc_item in desc_elems]
沒錯,"div.item-related > span.time"
這個是什么選擇起來著?后代選擇器。nice,CSS的選擇器它都支持。
來個小插曲:你知道的CSS選擇器有哪些?
- 元素選擇器?
p div
- 類選擇器?
.highlight
- ID選擇器?
#id
- 屬性選擇器?
[type='text']
- 后代選擇器?
ul li
- 子元素選擇器?
ul > li
- 相鄰兄弟選擇器?
h2+p
- 通用選擇器?
*
不要覺得我是多余的了,其實這些選擇器會了,基本上在頁面的爬取上就是無敵了。另外,selenium
還有這幾種選擇器:
class By:"""Set of supported locator strategies."""ID = "id"XPATH = "xpath"LINK_TEXT = "link text"PARTIAL_LINK_TEXT = "partial link text"NAME = "name"TAG_NAME = "tag name"CLASS_NAME = "class name"CSS_SELECTOR = "css selector"
常用的還是XPATH
?TAD_NAME
?CLASS_NAME
?CSS_SELECTOR
?大家感興趣的話可以自行的研究。
最后插一句話哈,作為后端的開發人員,我很希望我的接口、網站是可以正常訪問的,給用戶提供穩定的服務。但是,爬蟲的話,對網站的危害很大的,特別是計算機的運行速度要比人快很多倍,相當于一下子加重了服務器的負擔,類似于DOS攻擊了。一旦爬蟲劫持了流量,其它的用戶就不能正常的訪問了。
所以,在后端的接口設計上一般采取的是限流,但是也會降低用戶的使用體驗。所以,適當的學習學習就可以啦。也得守住法律的底線,話說:“python是包四餐的學科”。