1. 程式人生 > >使用selenium + chrome爬取中國大學Mooc網的計算機學科的所有課程鏈接

使用selenium + chrome爬取中國大學Mooc網的計算機學科的所有課程鏈接

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網的計算機學科的所有課程鏈接