【資料採集與融合】第五次實驗
資料探勘第五次實踐
作業一
京東資訊爬取實驗
作業內容
- 要求:熟練掌握 Selenium 查詢HTML元素、爬取Ajax網頁資料、等待HTML元素等內容。 使用Selenium框架爬取京東商城某類商品資訊及圖片。
- 候選網站:http://www.jd.com/
- 關鍵詞:學生自由選擇
實踐過程
復現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爬取實驗
作業內容
-
要求:熟練掌握 Selenium 查詢HTML元素、實現使用者模擬登入、爬取Ajax網頁資料、等待 HTML元素等內容。 使用Selenium框架+MySQL爬取中國mooc網課程資源資訊(課程號、課程名稱、教學 進度、課程狀態,課程圖片地址),同時儲存圖片到本地專案根目錄下的imgs資料夾 中,圖片的名稱用課程名來儲存。
-
候選網站:中國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實驗
作業內容
-
要求:理解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