使用selenium + chrome爬取中國大學Mooc網的計算機學科的所有課程鏈接
阿新 • • 發佈:2018-07-12
link_list () cat 圖片 谷歌瀏覽器 dom tps 類名 異步加載
目的:使用selenium + chrome爬取中國大學Mooc網計算機學科的所有的課程鏈接列表
思路:找到每個分頁的節點屬性為class=”m-course-list” 的div元素,再找到該元素下面的類屬性為class = “u-clist f-bg f-cb f-pr j-href ga-click”的div元素的屬性data-href的值,使用xpath獲取。
難點:在網頁源碼裏面,是看不到相關的課程鏈接信息,點擊分頁,發現地址欄的url一直都在變,但改變url的某個值,發現沒什麽作用,抓包發現是異步加載,所以就采用selenium + chrome瀏覽器獲取,但可以第一個分頁的所有課程鏈接,而要獲取點擊下一頁後的網頁源碼,還要借助unitest來解決,通過別的方法獲取源碼過於麻煩。
完整代碼如下:
# -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import unittest import time from lxml import etree class douyuSelenium(unittest.TestCase): ‘‘‘ 利用unittest模塊的測試類來解決獲取下一頁的網頁源碼問題。 正常情況,當點擊下一頁後,獲取當前頁的網頁源碼比較麻煩,而使用測試類的方法則可以很容易解決 ‘‘‘ def setUp(self): ‘‘‘ 初始化方法(固定寫法) ‘‘‘ # 創建谷歌瀏覽器對象。 self.driver = webdriver.Chrome() # 統計鏈接個數 self.num = 0 self.num2 = 1 # 保存鏈接列表 self.link_list = [] # 請求網頁,如果該行代碼放在testMooc方法,會導致抓取的數據有重復,而且漏抓 self.driver.get(‘https://www.icourse163.org/category/computer‘) def testMooc(self): ‘‘‘ 具體的測試用例方法(方法名開頭固定以test開頭) ‘‘‘ while True: # 讓網頁完全加載,避免網頁沒加載完導致獲取的數據丟失 time.sleep(3) # 獲取網頁源碼 html = self.driver.page_source # 把源碼解析為html dom文檔 content = etree.HTML(html) # 使用xpath去匹配所有的課程鏈接 course_list = content.xpath(‘//div[@class="m-course-list"]//div[@class="u-clist f-bg f-cb f-pr j-href ga-click"]/@data-href‘) for item in course_list: # 拼接獲取完整的課程鏈接 link = ‘https://www.icourse163.org‘ + item # 添加課程鏈接到保存的鏈接列表 self.link_list.append(link) # 退出循環條件,從網頁源碼裏面沒找到某個類名,則返回為-1,進而作為當點擊下一頁時,如果沒法點擊時,則此時的返回值不為-1 if (html.find(‘ux-pager_btn ux-pager_btn__next z-dis‘)) != -1: break # 模擬瀏覽器手動點擊下一頁 self.driver.find_element_by_xpath(‘//li[@class="ux-pager_btn ux-pager_btn__next"]/a‘).click() # 輸出課程鏈接及統計個數 for each in self.link_list: if(self.num % 20 == 0): self.num2 print(‘\n‘ + ‘=‘*30 + ‘第‘ + str(self.num2) + ‘頁課程鏈接列表‘ + ‘=‘*30 + ‘\n‘) self.num2 += 1 self.num += 1 print(each) # 輸出該學科的所有課程鏈接的個數 print self.num,len(self.link_list) def tearDown(self): ‘‘‘ 退出方法(固定寫法)‘‘‘ self.driver.quit() if __name__ == ‘__main__‘: unittest.main()
代碼圖片如下:
測試結果如下:
使用selenium + chrome爬取中國大學Mooc網的計算機學科的所有課程鏈接