数据采集第五次大作业1

 

第五次作业

一、作业内容

  • 作业①:

    • 要求:

      • 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
      • 使用Selenium框架爬取京东商城某类商品信息及图片。
    • 候选网站:http://www.jd.com/

    • 关键词:学生自由选择

    • 输出信息:MYSQL的输出信息如下
mNomMarkmPricemNotemFile
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……,由同学们自行定义设计表头:
IdcCoursecCollegecSchedulecCourseStatuscImgUrl
1 Python网络爬虫与信息提取 北京理工大学 已学3/18课时 2021年5月18日已结束 http://edu-image.nosdn.127.net/C0AB6FA791150F0DFC0946B9A01C8CB2.jpg
2......

  作业思路:进入中国mooc网后首先选中图中的登录按钮,利用selenium选中按钮的功能选中并点击

 

     进入扫码登录界面后,设置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采集数据

  任务一:

    任务二:

 

    任务三:

 

    任务四:

 

    任务五:

 

 

posted @ 2021-12-07 20:47  Kilig_7  阅读(96)  评论(1编辑  收藏  举报