1. 程式人生 > 其它 >【資料採集與融合】第五次實驗

【資料採集與融合】第五次實驗

資料探勘第五次實踐

作業一

京東資訊爬取實驗

作業內容

  1. 要求:熟練掌握 Selenium 查詢HTML元素、爬取Ajax網頁資料、等待HTML元素等內容。 使用Selenium框架爬取京東商城某類商品資訊及圖片。
  2. 候選網站:http://www.jd.com/
  3. 關鍵詞:學生自由選擇

實踐過程

復現selenium爬取京東商城,核心爬取程式碼

    def processSpider(self):
        try:
            time.sleep(1)
            print(self.driver.current_url)
            lis =self.driver.find_elements_by_xpath("
//div[@id='J_goodsList']//li[@class='gl-item']") for li in lis: # We find that the image is either in src or in data-lazy-img attribute self.count += 1 # 數量加一 try: src1 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("
src") except: src1 = "" try: src2 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("data-lazy-img") except: src2 = "" try: price = li.find_element_by_xpath("
.//div[@class='p-price']//i").text except: price = "0" try: note = li.find_element_by_xpath(".//div[@class='p-name p-name-type-2']//em").text mark = note.split(" ")[0] mark = mark.replace("愛心東東\n", "") mark = mark.replace(",", "") note = note.replace("愛心東東\n", "") note = note.replace(",", "") except: note = "" mark = "" self.No = self.No + 1 no = str(self.No) while len(no) < 6: no = "0" + no print(no, mark, price) if src1: src1 = urllib.request.urljoin(self.driver.current_url, src1) p = src1.rfind(".") mFile = no + src1[p:] elif src2: src2 = urllib.request.urljoin(self.driver.current_url, src2) p = src2.rfind(".") mFile = no + src2[p:] if src1 or src2: T = threading.Thread(target=self.download, args=(src1, src2, mFile)) T.setDaemon(False) T.start() self.threads.append(T) else: mFile = "" self.insertDB(no, mark, price, note, mFile) # 插入資料庫 if self.count >= 100: # 如果數量超過100退出 print("爬取到了100件商品,結束爬取") return # 取下一頁的資料,直到最後一頁 try: self.driver.find_element_by_xpath("//span[@class='p-num']//a[@class='pn-next disabled']") except: nextPage = self.driver.find_element_by_xpath("//span[@class='p-num']//a[@class='pn-next']") time.sleep(1) nextPage.click() self.processSpider() except Exception as err: print(err)

儲存到資料庫中的程式碼

    def startUp(self, url, key):
        # Initializing Chrome browser
        chrome_options = Options()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('--disable-gpu')
        self.driver = webdriver.Chrome(chrome_options=chrome_options)

        # Initializing variables
        self.threads = []
        self.No = 0
        self.imgNo = 0
        self.count = 0  # 記錄商品數量
        # Initializing database
        try:
            self.con = sqlite3.connect("phones.db")
            self.cursor = self.con.cursor()
            try:
                # 如果有表就刪除
                self.cursor.execute("drop table phones")
            except:
                pass
            try:
                sql = "create  table  phones  (mNo  varchar(32) primary key, mMark varchar(256),mPrice varchar(32),mNote varchar(1024),mFile varchar(256))"
                self.cursor.execute(sql)
            except:
                pass
        except Exception as err:
            print(err)
        # Initializing images folder
        try:
            if not os.path.exists(MySpider.imagePath):
                os.mkdir(MySpider.imagePath)
            images = os.listdir(MySpider.imagePath)
            for img in images:
                s = os.path.join(MySpider.imagePath, img)
                os.remove(s)
        except Exception as err:
            print(err)
        self.driver.get(url)   # 獲取網頁
        keyInput = self.driver.find_element_by_id("key")  # 尋找輸入框
        keyInput.send_keys(key)   # 輸入關鍵詞
        keyInput.send_keys(Keys.ENTER)

    def closeUp(self):
        try:

            self.con.commit()
            self.con.close()
            self.driver.close()

        except Exception as err:
            print(err)


    def insertDB(self, mNo, mMark, mPrice, mNote, mFile):
        try:
            sql = "insert into phones (mNo,mMark,mPrice,mNote,mFile) values (?,?,?,?,?)"
            self.cursor.execute(sql, (mNo, mMark, mPrice, mNote, mFile))
        except Exception as err:
            print(err)

實驗結果

控制檯結果,我控制了只會爬取100商品

資料庫儲存結果

圖片儲存結果:

實驗心得

這次實驗我鞏固了對於selenium爬取網站的知識,深刻學習了selenium相關操作,以及學會了將資料庫儲存到兩種資料庫中,包括MYSQL和SQLite,收益匪淺

作業二

MOOC爬取實驗

作業內容

  1. 要求:熟練掌握 Selenium 查詢HTML元素、實現使用者模擬登入、爬取Ajax網頁資料、等待 HTML元素等內容。 使用Selenium框架+MySQL爬取中國mooc網課程資源資訊(課程號、課程名稱、教學 進度、課程狀態,課程圖片地址),同時儲存圖片到本地專案根目錄下的imgs資料夾 中,圖片的名稱用課程名來儲存。

  2. 候選網站:中國mooc網:https://www.icourse163.org

實踐過程

1.模擬登入,找到登入按鈕,點選登入按鈕,找到賬號密碼輸入框,sendkey()輸入登入資訊,點選登入按鈕,唯一一個比較卡殼的地方就是會出現滑塊驗證,後面去檢視百度,有一篇部落格裡面也遇到了這樣的問題,他是使用一個叫browser.switch_to.frame() 的方法,就不會出現滑塊驗證,我試了一下確實可以

def search(url):
    try:
        browser.get(url)
        time.sleep(1)  # 停頓一秒
        browser.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div').click()
        # 點選登入按鈕
        time.sleep(1)  # 停頓一秒
        browser.find_element_by_xpath('/html/body/div[13]/div[2]/div/div/div/div/div[2]/span').click()
        # 點選其他登入方式
        time.sleep(1)  # 停頓一秒
        browser.find_element_by_xpath('/html/body/div[13]/div[2]/div/div/div/div/div/div[1]/div/div[1]/div[1]/ul/li[2]').click()
        # 點選手機號登入
        time.sleep(1)  # 停頓一秒
        browser.switch_to.frame(browser.find_elements_by_tag_name("iframe")[1])
        # 跳轉手機登入介面
        time.sleep(1)  # 停頓一秒
        browser.find_element_by_xpath("//input[@id='phoneipt']").send_keys("15160468797")
        browser.find_element_by_xpath('//input[@placeholder="請輸入密碼"]').send_keys("@huan301505")
        # 輸入登入資訊
        time.sleep(1)  # 停頓一秒
        browser.find_element_by_xpath('//*[@id="submitBtn"]').click()
        # 點選登入
        time.sleep(3)  # 停頓三秒,登入進去後
        browser.find_element_by_xpath('//*[@id="privacy-ok"]').click()
        # 點選“我的課程”這個按鈕
        time.sleep(1)  # 停頓一秒
        browser.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div[3]/div[4]/div').click()
        time.sleep(1)
        print("課程資訊如下:")
        get_data()  # 獲取第一頁課程資料內容
    except Exception as err:
        print(err)

2.爬取相關資訊,並且儲存資料

def get_data():
    global total_num
    name_and_img = browser.find_elements_by_xpath('//div[@class="course-card-wrapper"]//div[@class="box"]//div[@class="img"]//img')
    school = browser.find_elements_by_xpath('//div[@class="course-card-wrapper"]//div[@class="box"]//div[@class="body"]//div[@class="school"]//a')
    schedule = browser.find_elements_by_xpath('//div[@class="course-card-wrapper"]//div[@class="box"]//div[@class="body"]//div[@class="text"]//a')
    course_status = browser.find_elements_by_xpath('//div[@class="course-card-wrapper"]//div[@class="box"]//div[@class="body"]//div[@class="course-status"]')
    for i in range(len(name_and_img)):
        name = name_and_img[i].get_attribute('alt')  # 名稱
        image_url = name_and_img[i].get_attribute('src')  # 圖片網址
        school_name = school[i].text
        C_schedule = schedule[i].text
        C_course_status = course_status[i].text
        print(name + "\t\t" + school_name + "\t\t" + C_schedule + "\t\t" + C_course_status + "\t\t" + image_url)
        image_name = "./img/第" + str(page_num) + "頁第" + str(i+1) + "張.jpg"  # 圖片要儲存的路徑位置
        urllib.request.urlretrieve(image_url, filename=image_name)  # 儲存圖片
        mooc_DB.insertDB(total_num, name, school_name, C_schedule, C_course_status, image_url)  # 插入資料
        total_num += 1 # 總數量+1

3.翻頁實現,我使用的是.click()的方法,找到下一頁的按鈕然後直接去點選它,就可以實現翻頁

def next_page():
    search(url)
    global page_num
    while page_num < 2:
        browser.find_element_by_xpath('//*[@id="j-coursewrap"]/div/div[2]/ul/li[4]/a').click()
        # 點選下一頁
        time.sleep(1)
        page_num += 1
        get_data()  # 獲取我的課程的資料
    mooc_DB.closeDB()  # 關閉資料庫

4.最後還有資料庫儲存的程式碼,和前一次程式碼都很相似,連線,關閉,插入

class mooc:
    # 開啟資料庫
    def openDB(self):
        print("open")
        try:
            self.con = pymysql.connect(host="127.0.0.1", port=3306, user="root",
                                       passwd="huan301505", db="scraw", charset="utf8")
            # 第一步先連線mysql資料庫
            self.cursor = self.con.cursor()  # 設定遊標
            # 需要事先在外面建立好一個數據庫
            self.cursor.execute("delete from mooc")  # 清空資料表
            self.opened = True
        except Exception as err:
            print(err)
            self.opened = False

    # 關閉資料庫
    def closeDB(self):
        try:
            if self.opened:
                self.con.commit()  # 提交
                self.con.close()  # 關閉連線
                self.opened = False
            print("closed")
            print("爬取成功!")
        except Exception as err:
            print(err)

    # 插入資料庫
    def insertDB(self, id, name, school, schedule, course_status, image_url):
        try:
            self.cursor.execute(
                "insert into mooc(id,name,school,schedule,course_status,image_url) values (%s,%s,%s,%s,%s,%s)",
                (id, name, school, schedule, course_status, image_url))
        except Exception as err:
            print(err)

實驗結果

控制檯結果:

資料庫結果,我這個使用的插入mysql,然後檢視是使用mysql自帶的work_bench視覺化介面:

圖片儲存結果:

實驗心得

這次實驗我鞏固了對於selenium爬取網站的知識,深刻學習了selenium相關操作,以及學會了將資料庫儲存到兩種資料庫中,包括MYSQL和SQLite,收益匪淺

作業三

Flume實驗

作業內容

  1. 要求:理解Flume架構和關鍵特性,掌握使用Flume完成日誌採集任務。 完成Flume日誌採集實驗,包含以下步驟:

    任務一:開通MapReduce服務

    任務二:Python指令碼生成測試資料

    任務三:配置Kafka

    任務四:安裝Flume客戶端

    任務五:配置Flume採集資料

實踐過程

任務一:開通MapReduce服務

這個按照老師釋出的pdf一步一步操作,最後開通MRS,進入manager介面如下

任務二:Python指令碼生成測試資料

1.開啟xshell,建立連線

2.傳輸autodatapython.py檔案到opt/client/資料夾內

3.執行

任務三:配置Kafka

  • 首先設定環境變數,執行source命令,使變數生效
  • 在kafka中建立topic
  • 檢視topic資訊:

任務四:安裝Flume客戶端

進入MRS Manager叢集管理介面,開啟服務管理,點選flume,進入Flume服務,點選下載客戶端

解壓flume客戶端檔案,校驗檔案包,解壓“MRS_Flume_ClientConfig.tar”檔案

安裝flume環境變數

解壓flume客戶端

安裝flume客戶端

重啟flume服務

任務五:配置Flume採集資料

修改配置檔案,直接從外面傳入檔案

登入master節點,source配置檔案,執行如下命令

再開一個視窗,執行2.2.1中的python測試指令,原來的視窗就可以捕獲資料

實驗心得

這次實驗主要介紹了通過Flume來完成實時流資料的採集,初步瞭解了flume日誌採集的相關知識,收益匪淺。

最後附上我的前面作業的程式碼:資料採集與融合: 資料採集與融合實踐作業 - Gitee.com