Python使用Selenium自動化登陸學習通爬取指定課程下的討論(爬取動態加載數據)

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使用起來非常方便,可以直接跳過很多基本的反爬手段,很贊!

喜歡的兄弟們點個贊吧😁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章