数据采集第五次大作业1
第五次作业
一、作业内容
-
作业①:
-
要求:
- 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
- 使用Selenium框架爬取京东商城某类商品信息及图片。
-
候选网站:http://www.jd.com/
-
关键词:学生自由选择
- 输出信息:MYSQL的输出信息如下
-
mNo | mMark | mPrice | mNote | mFile |
---|---|---|---|---|
000001 | 三星Galaxy | 9199.00 | 三星Galaxy Note20 Ultra 5G... | 000001.jpg |
000002...... |
作业思路:第一题为代码复现,代码分解如下:
启动程序,建立数据库表:
def startUp(self, url, key): chrome_options = Options() chrome_options.add_argument("——headless") chrome_options.add_argument("——disable-gpu") self.driver = webdriver.Chrome(chrome_options=chrome_options) self.threads = [] self.No = 0 self.imgNo = 0 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) try: if not os.path.exists(JD.imagepath): os.mkdir(JD.imagepath) images = os.listdir(JD.imagepath) for image in images: s = os.path.join(JD.imagepath, image) 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 processJD(self): time.sleep(10) try: print(self.driver.current_url) lis = self.driver.find_elements_by_xpath("//div[@id='J_goodsList']//li[@class='gl-item']") time.sleep(1) for li in lis: time.sleep(1) try: src1 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("src") time.sleep(1) except: src1 = "" try: src2 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("data-lazy-img") time.sleep(1) except: src2 = "" try: price = li.find_element_by_xpath(".//div[@class='p-price']//i").text time.sleep(1) except: price = "0" 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(",", "") time.sleep(1) 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.downloadDB, args=(src1, src2, mFile)) T.setDaemon(False) T.start() self.threads.append(T) else: mFile = "" self.insertDB(no, mark, price, note, mFile) 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) def showDB(self): try: con = sqlite3.connect("phones.db") cursor = con.cursor() print("%-8s%-16s%-8s%-16s%s" % ("No", "Mark", "Price", "Image", "Note")) cursor.execute("select mNO,mMark,mPrice,mFile,mNote from phones order by mNo") rows = cursor.fetchall() for row in rows: print("%-8s%-16s%-8s%-16s%s" % (row[0], row[1], row[2], row[3], row[4])) con.close() except Exception as err: print(err)
结果截图:
数据库展示:
代码地址:https://gitee.com/kilig-seven/crawl_project/tree/master/%E7%AC%AC%E4%BA%94%E6%AC%A1%E5%A4%A7%E4%BD%9C%E4%B8%9A
作业②:
-
要求:
- 熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
- 使用Selenium框架+MySQL模拟登录慕课网,并获取学生自己账户中已学课程的信息保存到MySQL中(课程号、课程名称、授课单位、教学进度、课程状态,课程图片地址),同时存储图片到本地项目根目录下的imgs文件夹中,图片的名称用课程名来存储。
-
候选网站:中国mooc网:https://www.icourse163.org
- 输出信息:MYSQL数据库存储和输出格式
- 表头应是英文命名例如:课程号ID,课程名称:cCourse……,由同学们自行定义设计表头:
Id | cCourse | cCollege | cSchedule | cCourseStatus | cImgUrl |
---|---|---|---|---|---|
1 | Python网络爬虫与信息提取 | 北京理工大学 | 已学3/18课时 | 2021年5月18日已结束 | http://edu-image.nosdn.127.net/C0AB6FA791150F0DFC0946B9A01C8CB2.jpg |
2...... |
作业思路:进入中国mooc网后首先选中图中的登录按钮,利用selenium选中按钮的功能选中并点击
![](https://img2020.cnblogs.com/blog/2546863/202112/2546863-20211207175046311-409423844.png)
进入扫码登录界面后,设置sleep时间为10秒,其间用户使用手机进行扫码登录(也可以选择将账户密码写入代码中使用账号密码登录,但是由于我的慕课账号出现了一些问题只能使用短信验证码登录,所以在此处我选择使用扫码登录的方式)
完成登录操作后继续点击“我的课程”按钮
此时进入我们需要爬取的页面,利用F12找到我们所需的信息的xpath路径,完成爬取功能
代码实现:
首先是主体部分,也就是整个爬取的过程:
browser.get(url) # 获取网页 time.sleep(1) # 等待网页加载 button1 = wait.until( EC.element_to_be_clickable((By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div'))) # 登录按钮 button1.click() time.sleep(5) # 等待扫码登录 button2 = wait.until( EC.element_to_be_clickable((By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[4]/div'))) # 我的课程按钮 button2.click() get_data() insert_database()
get_data()函数用于爬取我们所需的信息
def get_data(): global data id = 0 try: tr = browser.find_elements_by_xpath('//*[@id="j-coursewrap"]/div/div[1]/div') for i in range(len(tr)): id = id + 1 course = browser.find_elements_by_xpath('//*[@id="j-coursewrap"]/div/div[1]/div/div[1]/a/div[2]/div[1]/div[1]/div/span[2]')[i].text college = browser.find_elements_by_xpath('//*[@id="j-coursewrap"]/div/div[1]/div/div[1]/a/div[2]/div[1]/div[2]/a')[i].text schedule = browser.find_elements_by_xpath('//*[@id="j-coursewrap"]/div/div[1]/div/div[1]/a/div[2]/div[2]/div[1]/div[1]/div[1]/a/span')[i].text coursestatus = browser.find_elements_by_xpath('//*[@id="j-coursewrap"]/div/div[1]/div/div[1]/a/div[2]/div[2]/div[2]')[i].text imgurl = browser.find_elements_by_xpath('//*[@id="j-coursewrap"]/div/div[1]/div/div[1]/a/div[1]/img')[i].get_attribute("src") data.append([id, course, college, schedule, coursestatus, imgurl]) except TimeoutError: get_data()
insert_database()函数用于将爬取下来的数据存入数据库当中
def insert_database(): try: con = pymysql.connect(host='localhost', port=3306, user='root', password='root', db='spider', charset='utf8') # 连接数据库,事先已经创建好表 cursor = con.cursor(pymysql.cursors.DictCursor) cursor.execute("delete from mooc") opened = True except Exception as err: print(err) opened = False try: if opened: for i in range(len(data)): li = data[i] cursor.execute( "insert into mooc (id, cCourse, cCollege, cSchedule, cCourseStatus, CImgUrl) values (%s,%s,%s,%s,%s,%s)", (li[0], li[1], li[2], li[3], li[4], li[5])) con.commit() con.close() except Exception as err: print(err)
结果截图:
数据库展示:
心得体会:在登录的过程中发现,账号密码的输入框采用的是动态的xpath地址,每次xpath都会随着id而改变,在登录的过程中也有可能会遇到人机验证,这是普通的爬取代码难以跳过的环节,想要实现全自动的爬取还是得先完成手动的登录。除此之外,利用selenium框架爬取信息时,大部分框架都不尽相同。
代码地址:https://gitee.com/kilig-seven/crawl_project/tree/master/%E7%AC%AC%E4%BA%94%E6%AC%A1%E5%A4%A7%E4%BD%9C%E4%B8%9A
作业③:Flume日志采集实验
- 要求:掌握大数据相关服务,熟悉Xshell的使用
- 完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
- 环境搭建
- 任务一:开通MapReduce服务
- 实时分析开发实战:
- 任务一:Python脚本生成测试数据
- 任务二:配置Kafka
- 任务三:安装Flume客户端
- 任务四:配置Flume采集数据
任务一:
任务二:
任务三:
任务四:
任务五: