Selenium使用
經過一段時間對python的學習,自己對於爬蟲使用的庫也開始逐漸的增多,從最開始接觸的requests庫,BeautifulSoup庫,到後來的re庫,lxml庫,等等一些主要的關於python網絡爬蟲的庫,再到現在的Selenium庫,慢慢一點一點深入學習python,越來越發現python的樂趣。
Selenium庫是一種自動話的測試工具,利用它可以驅動瀏覽器執行特定的動作,如點擊,下拉等操作,同時還可以獲取瀏覽器當前呈現頁面的源代碼,做到了可見即爬。對於一些JavaScript動態渲染的頁面來說,此抓取方式非常有效。(可以不用構造請求頭喔🙃)
我用的是Chrome瀏覽器,所以在編寫代碼前一定先要裝好Chrome瀏覽器並配置好對應版本的ChromeDriver,另外,當然是裝好Selenium庫啦。
因爲是瀏覽器驅動,不需要太多的分析,先上代碼(url爲學習通登陸頁面):
#聲明瀏覽器,初始化瀏覽器
driver = webdriver.Chrome()
#打開相應的網頁
driver.get('http://passport2.chaoxing.com/login?fid=&refer=http://i.mooc.chaoxing.com')
效果(可以看到Chrome正在接受自動化測試軟件的控制字樣,說明使用正確):
登陸分析(直接用Elements箭頭指向你想要找的元素,找到輸入框和登陸按鈕,模擬登錄):
有上面這四張圖很容易可以通過id或者name來確定登錄信息輸入框並且定位到登陸按鈕,所以開始模擬登陸代碼(結合每個輸入框的關鍵屬性來理解代碼):
name = input('請輸入賬號:')
password = input('請輸入密碼:')
yanzhengma = input('請輸入驗證碼:')
#找到登陸輸入框
input_name = driver.find_element_by_id('unameId')
input_password = driver.find_element_by_id('passwordId')
input_yanzheng = driver.find_element_by_id('numcode')
#向登陸輸入框中輸入值
input_name.send_keys(name)
input_password.send_keys(password)
input_yanzheng.send_keys(yanzhengma)
#time.sleep(1)
#找到登陸按鈕
button = driver.find_element_by_class_name('zl_btn_right')
#模擬點擊
button.click()
這樣就可以模擬登陸,瀏覽器自動跳轉進入自己的課程頁面(由於涉及個人信息截圖不全,給出我想進入的課程圖片):
分析該課程網頁源代碼:
可發現href中便是網頁跳轉的鏈接(我的思路,拿到網頁鏈接,進行跳轉,也可之間拿到登陸按鈕,點擊登陸,這裏爲了多加練習…):
#等待網頁相應,否則可能返回不到網頁源碼
time.sleep(1)
#跳轉到該頁的子Fream,拿到對應的網頁源碼
driver.switch_to.frame('frame_content')
time.sleep(2)
#拿到網頁的源碼信息
text = driver.page_source
#print(text)
tree_one = etree.HTML(text)
#找到鏈接
href = tree_one.xpath('//h3[@class="clearfix"]/a[@title="信息論與大數據安全"]/@href')
for url in href:
href = url
#進行網頁的跳轉
driver.get(href)
這樣我們就入了對應的課程頁面:
圖中給出了我想拿到的討論內容入口,用相同的方法分析再次跳轉(圖中帶有參數信息,不展示圖片):
time.sleep(1)
#print(driver.page_source)
tree_two = etree.HTML(driver.page_source)
href_ = tree_two.xpath('//div[@class="fr stuRight"]/a[@title="1.2"]/@href')
#https://mooc1-1.chaoxing.com/bbscircle/gettopicdetail?courseId=208086050&clazzid=16240167&topicid=153518799&ut=s&cpi=44754234
for url in href_:
href_ = 'https://mooc1-1.chaoxing.com' + url
#print(href_)
driver.get(href_)
之後就進去了含有討論內容的頁面,觀察發現,這個頁面的數據是動態加載的,要向獲取全部數據,得使用一定的方法。
思路:獲取更多按鈕,並點擊按鈕,並下拉到網頁最底部,此時就可得到所有數據的網頁源碼
driver.get(href_)
#定位 查看更多 按鈕
button = driver.find_element_by_id('more_reply_152637979')
#點擊
button.click()
#下拉滾動條,到頁面最底部,拿到所有數據的網頁源碼
for i in range(100):
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
接下來就是正常的分析網頁源碼,拿到數據了,我就不再多的分析,因爲每個人的方法不一樣,我用的是正則和Xpath:
time.sleep(2)
etree_three = etree.HTML(driver.page_source)
name = etree_three.xpath('//span[@class="name"]/text()')
#print(name)
# text = etree_three.xpath('//h3[contains(@class,"bt") and @name="replyfirstname"]/text()')
# print(text)
text = re.findall('<h3.*?bt.*?replyfirstname.*?>(.*?)</h3>',str(driver.page_source),re.S)
text_new = re.findall('<h3.*?class="bt ol">(.*?)</h3>',str(driver.page_source),re.S)
#print(text_new)
result_text = []
#調換文本中的換行符還有空格等字符
for i in text:
a = re.sub('\xa0', '', i)
b = re.sub('<br />', ',', a)
result_text.append(b)
for i in range(len(text_new)-1):
result_text.append(text_new[i+1])
#print(result_text)
length = str(len(result_text))
for i in range(len(result_text)):
with open('text.txt','a',encoding = 'utf-8') as file:
#file.write('總討論數:' + length)
file.write('\n')
file.write(name[i+1] + ':' + result_text[i])
file.write('\n')
保存爲文本文件,給老師發過去:
length = str(len(result_text))
for i in range(len(result_text)):
with open('text.txt','a',encoding = 'utf-8') as file:
#file.write('總討論數:' + length)
file.write('\n')
file.write(name[i+1] + ':' + result_text[i])
file.write('\n')
with open('text.txt', 'a', encoding='utf-8') as file:
file.write('\n')
file.write('總討論數:' + length)
這樣就完成啦,結果如下(截圖的一部分):
我再次體會到python的樂趣,可以說這個selenium使用起來非常方便,可以直接跳過很多基本的反爬手段,很贊!
喜歡的兄弟們點個贊吧😁