Өгөгдлийн шинжлэх ухаанд юу буруу байж болох вэ? Өгөгдөл цуглуулах

Өгөгдлийн шинжлэх ухаанд юу буруу байж болох вэ? Өгөгдөл цуглуулах
Өнөөдөр 100500 Дата Шинжлэх Ухааны курс байдаг бөгөөд Дата Шинжлэх Ухааны чиглэлээр хамгийн их мөнгийг Дата Шинжлэх Ухааны хичээлээр дамжуулан олох боломжтой гэдгийг эрт дээр үеэс мэддэг болсон (хүрз зарж байхад яагаад ухах вэ?). Эдгээр курсуудын гол сул тал нь бодит ажилтай ямар ч холбоогүй юм: хэн ч танд шаардлагатай форматаар цэвэр, боловсруулсан өгөгдлийг өгөхгүй. Мөн та курсээ орхиж, бодит асуудлыг шийдэж эхлэхэд олон нюанс гарч ирдэг.

Тиймээс бид надад, миний нөхдүүд, хамтран ажиллагсаддаа тохиолдсон бодит үйл явдлуудад тулгуурлан "Дата шинжлэх ухаанд юу нь болохгүй вэ" цуврал тэмдэглэлийг эхлүүлж байна. Бид өгөгдлийн шинжлэх ухааны ердийн ажлуудад бодит жишээнүүдийг ашиглан дүн шинжилгээ хийх болно: энэ нь хэрхэн тохиолддог. Өнөөдөр мэдээлэл цуглуулах ажлаас эхэлцгээе.

Хүмүүс бодит өгөгдөлтэй ажиллаж эхлэхэд хамгийн түрүүнд бүдэрдэг зүйл бол бидэнд хамгийн их хамааралтай энэ өгөгдлийг цуглуулах явдал юм. Энэ нийтлэлийн гол мессеж:

Бид мэдээлэл цуглуулах, цэвэрлэх, бэлтгэхэд шаардагдах цаг хугацаа, нөөц, хүчин чармайлтыг системтэйгээр дутуу үнэлдэг.

Хамгийн гол нь үүнээс урьдчилан сэргийлэхийн тулд юу хийх талаар ярилцах болно.

Төрөл бүрийн тооцооллоор цэвэрлэх, хувиргах, өгөгдөл боловсруулах, инженерчлэл хийх гэх мэт ажилд 80-90%, дүн шинжилгээ хийх 10-20% зарцуулдаг бол бараг бүх боловсролын материал зөвхөн дүн шинжилгээнд чиглэгддэг.

Энгийн нэг аналитик бодлогыг энгийн жишээ болгон гурван хувилбараар авч үзээд “хүндрүүлэх нөхцөл” гэж юу болохыг харцгаая.

Жишээлбэл, бид мэдээлэл цуглуулах, нийгэмлэгүүдийг харьцуулах ажлын ижил төстэй хувилбаруудыг дахин авч үзэх болно:

  1. Хоёр Reddit дэд материал
  2. Хабрын хоёр хэсэг
  3. Одноклассники хоёр бүлэг

Онолын хувьд болзолт хандлага

Сайтыг нээж, жишээнүүдийг уншаарай, хэрвээ ойлгомжтой бол уншихад хэдэн цаг, жишээнүүд болон дибаг хийхэд хэдэн цаг зарцуулаарай. Цуглуулга хийхэд хэдэн цаг нэмнэ үү. Нөөцөд хэдхэн цагийн дотор хая (хоёроор үржүүлж, N цаг нэмнэ).

Гол санаа: Цаг хугацааны тооцоолол нь хэр удаан үргэлжлэх талаарх таамаглал, таамаглал дээр суурилдаг.

Дээр дурдсан нөхцөлт асуудлын дараах параметрүүдийг тооцоолж цаг хугацааны шинжилгээг эхлүүлэх шаардлагатай.

  • Мэдээллийн хэмжээ хэд вэ, тэдгээрийн хэдийг нь физик байдлаар цуглуулах шаардлагатай вэ (*доороос харна уу*).
  • Нэг бичлэгийг цуглуулах хугацаа хэд вэ, хоёр дахь бичлэгээ цуглуулахаас өмнө хэр удаан хүлээх хэрэгтэй вэ?
  • Бүх зүйл бүтэлгүйтвэл (хэрэв биш) төлөвийг хадгалж, дахин эхлүүлэх код бичих талаар бодож үзээрэй.
  • Бидэнд зөвшөөрөл хэрэгтэй эсэхийг олж мэдээд API-ээр дамжуулан нэвтрэх хугацааг тохируулна уу.
  • Алдааны тоог өгөгдлийн нарийн төвөгтэй байдлын функц болгон тохируулна уу - тодорхой даалгаварыг үнэлнэ үү: бүтэц, хэдэн хувиргалт, юу, хэрхэн гаргаж авах.
  • Төслийн стандарт бус үйлдэлтэй холбоотой сүлжээний алдаа болон асуудлуудыг засах.
  • Шаардлагатай функцууд баримт бичигт байгаа эсэх, хэрэв байхгүй бол тойрч гарахад хэрхэн, хэр их шаардлагатайг үнэл.

Хамгийн чухал зүйл бол цагийг тооцоолохын тулд та "хүчтэй тагнуул" хийхэд цаг хугацаа, хүчин чармайлт гаргах хэрэгтэй - зөвхөн тэр үед л таны төлөвлөлт хангалттай байх болно. Тиймээс, "мэдээлэл цуглуулахад хэр их хугацаа шаардагдах вэ" гэж хэлэхийг хичнээн их шахаж байсан ч гэсэн урьдчилсан дүн шинжилгээ хийхэд цаг зав гаргаж, асуудлын бодит параметрээс хамааран цаг хугацаа хэр их өөрчлөгдөх талаар маргаарай.

Одоо бид ийм параметрүүд өөрчлөгдөх тодорхой жишээнүүдийг үзүүлэх болно.

Гол санаа: Тооцоолол нь ажлын цар хүрээ, нарийн төвөгтэй байдалд нөлөөлж буй гол хүчин зүйлсийн шинжилгээнд үндэслэсэн болно.

Таамаглалд суурилсан тооцоолол нь функциональ элементүүд нь хангалттай бага, асуудлын загварт мэдэгдэхүйц нөлөө үзүүлэх олон хүчин зүйл байхгүй тохиолдолд сайн арга юм. Гэвч өгөгдлийн шинжлэх ухааны хэд хэдэн асуудлын хувьд ийм хүчин зүйлүүд маш олон болж, ийм арга барил нь хангалтгүй болдог.

Reddit нийгэмлэгүүдийн харьцуулалт

Хамгийн энгийн тохиолдлоос эхэлцгээе (дараа нь тодорхой болно). Ерөнхийдөө, үнэнийг хэлэхэд бидэнд бараг тохиромжтой тохиолдол байгаа тул нарийн төвөгтэй байдлын хяналтын хуудсыг шалгая:

  • Цэвэр, ойлгомжтой, баримтжуулсан API байдаг.
  • Энэ нь маш энгийн бөгөөд хамгийн чухал нь токеныг автоматаар авдаг.
  • Байдаг питон боодол - олон жишээгээр.
  • Reddit дээрх өгөгдөлд дүн шинжилгээ хийж, цуглуулдаг нийгэмлэг (python wrapper хэрхэн ашиглахыг тайлбарласан YouTube видео хүртэл) Жишээлбэл.
  • Бидэнд хэрэгтэй аргууд нь API-д байгаа байх. Нэмж дурдахад, код нь авсаархан, цэвэрхэн харагдаж байна, доор нь нийтлэл дээр сэтгэгдэл цуглуулдаг функцийн жишээг доор харуулав.

def get_comments(submission_id):
    reddit = Reddit(check_for_updates=False, user_agent=AGENT)
    submission = reddit.submission(id=submission_id)
    more_comments = submission.comments.replace_more()
    if more_comments:
        skipped_comments = sum(x.count for x in more_comments)
        logger.debug('Skipped %d MoreComments (%d comments)',
                     len(more_comments), skipped_comments)
    return submission.comments.list()

-аас авсан энэ нь бооход тохиромжтой хэрэгслүүдийн сонголт.

Энэ нь хамгийн сайн тохиолдол хэдий ч бодит амьдралаас хэд хэдэн чухал хүчин зүйлийг харгалзан үзэх нь зүйтэй юм.

  • API хязгаарлалтууд - бид өгөгдлийг багцаар авахаас өөр аргагүй болдог (хүсэлтүүдийн хооронд унтах гэх мэт).
  • Цуглуулга хийх хугацаа - бүрэн дүн шинжилгээ хийх, харьцуулахын тулд аалзыг дэд материалаар алхахад хангалттай хугацаа зарцуулах шаардлагатай болно.
  • Бот нь сервер дээр ажиллах ёстой - та үүнийг зүгээр л зөөврийн компьютер дээрээ ажиллуулж, үүргэвчиндээ хийгээд бизнесээ хийж чадахгүй. Тиймээс би бүх зүйлийг VPS дээр ажиллуулсан. Habrahabr10 сурталчилгааны кодыг ашигласнаар та зардлынхаа 10 хувийг хэмнэх боломжтой.
  • Зарим өгөгдлийн бие махбодийн хүртээмжгүй байдал (тэдгээрийг администраторуудад харагдах эсвэл цуглуулахад хэтэрхий хэцүү байдаг) - үүнийг анхаарч үзэх хэрэгтэй; зарчмын хувьд бүх өгөгдлийг хангалттай хугацаанд цуглуулж чадахгүй.
  • Сүлжээний алдаа: Сүлжээний асуудал бол зовлон юм.
  • Энэ бол амьд бодит өгөгдөл бөгөөд хэзээ ч цэвэр байдаггүй.

Мэдээжийн хэрэг, эдгээр нюансуудыг хөгжилд оруулах шаардлагатай. Тодорхой цаг/өдөр нь хөгжлийн туршлага эсвэл ижил төстэй ажлууд дээр ажиллаж байсан туршлагаас хамаардаг боловч энд даалгавар нь зөвхөн инженерийн шинж чанартай бөгөөд шийдвэрлэхийн тулд биеийн нэмэлт хөдөлгөөн шаарддаггүй - бүх зүйлийг маш сайн үнэлж, төлөвлөж, хийж болно.

Хабр хэсгүүдийн харьцуулалт

Хабрын хэлхээ ба/эсвэл хэсгүүдийг харьцуулах илүү сонирхолтой, өчүүхэн тохиолдол руу шилжье.

Нарийн төвөгтэй байдлын хяналтын хуудсыг шалгацгаая - энд цэг бүрийг ойлгохын тулд та даалгавраа өөрөө бага зэрэг ухаж, туршилт хийх хэрэгтэй болно.

  • Эхлээд та API байдаг гэж боддог, гэхдээ байхгүй. Тийм ээ, тийм ээ, Habr нь API-тай, гэхдээ энэ нь хэрэглэгчдэд хандах боломжгүй (эсвэл энэ нь огт ажиллахгүй байж магадгүй).
  • Дараа нь та html-г задлан шинжилж эхэлнэ - "импортын хүсэлт", юу нь буруу болж болох вэ?
  • Ямартай ч яаж задлан шинжлэх вэ? Хамгийн энгийн бөгөөд хамгийн түгээмэл хэрэглэгддэг арга бол ID-г давтах явдал бөгөөд энэ нь хамгийн үр дүнтэй биш бөгөөд өөр өөр тохиолдлуудыг шийдвэрлэх шаардлагатай болно - энд байгаа бүх ID-уудын нягтралын жишээ энд байна.

    Өгөгдлийн шинжлэх ухаанд юу буруу байж болох вэ? Өгөгдөл цуглуулах
    -аас авсан энэ нь нийтлэл.

  • Вэб дээр HTML дээр ороосон түүхий өгөгдөл нь зовлон юм. Жишээлбэл, та нийтлэлийн үнэлгээг цуглуулж, хадгалахыг хүсч байна: та html-ээс оноогоо хасаад цаашдын боловсруулалтанд зориулж тоо болгон хадгалахаар шийдсэн: 

    1) int (оноо) алдаа гаргадаг: Хабре дээр хасах тэмдэг байгаа тул жишээлбэл, "–5" мөрөнд энэ нь хасах тэмдэг биш (санамсаргүй, тийм үү?) зураас юм. Хэзээ нэгэн цагт би задлан шинжлэгчийг ийм аймшигтай засвараар амилуулах хэрэгтэй болсон.

    try:
          score_txt = post.find(class_="score").text.replace(u"–","-").replace(u"+","+")
          score = int(score_txt)
          if check_date(date):
            post_score += score
    

    Огноо, нэмэх, хасах зүйл огт байхгүй байж магадгүй (бид дээр дурдсан check_date функцээс харахад ийм зүйл тохиолдсон).

    2) Зугтаж чадаагүй тусгай дүрүүд - тэд ирэх болно, та бэлтгэлтэй байх хэрэгтэй.

    3) Шуудангийн төрлөөс хамааран бүтэц өөрчлөгддөг.

    4) Хуучин нийтлэлүүд **хачирхалтай бүтэцтэй** байж болно.

  • Үндсэндээ алдаатай харьцах, юу тохиолдох, юу тохиолдохгүй байх зэрэг асуудлыг шийдвэрлэх шаардлагатай бөгөөд та юу нь буруу болж, ямар бүтэцтэй болох, хаана юу унахыг урьдчилан таамаглах боломжгүй - та зүгээр л хичээж, анхаарч үзэх хэрэгтэй. задлан шинжлэгчийн гаргадаг алдаанууд.
  • Дараа нь та хэд хэдэн хэлхээг задлан шинжлэх хэрэгтэй гэдгийг ойлгох болно, эс тэгвээс нэг хэлхээнд задлан шинжлэхэд 30 гаруй цаг шаардагдана (энэ нь аль хэдийн ажиллаж байгаа нэг урсгалтай задлагчийн ажиллах хугацаа бөгөөд ямар ч хоригт ордоггүй). IN энэ нь нийтлэлд энэ нь зарим үед ижил төстэй схемд хүргэсэн:

Өгөгдлийн шинжлэх ухаанд юу буруу байж болох вэ? Өгөгдөл цуглуулах

Нарийн төвөгтэй байдлын дагуу нийт шалгах хуудас:

  • Сүлжээтэй ажиллах, давталттай html задлан шинжлэх, ID-аар хайх.
  • Нэг төрлийн бус бүтцийн баримт бичиг.
  • Код амархан унах олон газар байдаг.
  • || гэж бичих шаардлагатай код.
  • Шаардлагатай баримт бичиг, кодын жишээ болон/эсвэл нийгэмлэг дутуу байна.

Энэ даалгаврын тооцоолсон хугацаа нь Reddit-ээс мэдээлэл цуглуулахаас 3-5 дахин их байх болно.

Одноклассники бүлгүүдийн харьцуулалт

Тодорхойлсон техникийн хамгийн сонирхолтой тохиолдол руу шилжье. Миний хувьд энэ нь маш сонирхолтой байсан, учир нь эхлээд харахад энэ нь өчүүхэн мэт санагдаж байсан ч энэ нь огтхон ч тийм биш юм - та түүн рүү саваа хатгамагц.

Хэцүү байдлын шалгах хуудсаа эхэлцгээе, тэдний олонх нь анх харж байснаас хамаагүй хэцүү байх болно гэдгийг анхаарна уу.

  • API байдаг боловч шаардлагатай функцүүд бараг бүрэн дутмаг байдаг.
  • Зарим функцүүдэд та шуудангаар хандах хүсэлт гаргах хэрэгтэй, өөрөөр хэлбэл нэвтрэх эрх нь шууд биш юм.
  • Энэ нь аймшигтай баримтжуулсан (эхлэхдээ орос, англи хэллэгүүд хаа сайгүй холилдож, огт нийцэхгүй байдаг - заримдаа та тэднээс хаа нэгтээ юу хүсч байгааг таах хэрэгтэй болдог) бөгөөд үүнээс гадна дизайн нь өгөгдөл авахад тохиромжгүй байдаг. , бидэнд хэрэгтэй функц.
  • Баримт бичигт сесс хийх шаардлагатай боловч үнэндээ үүнийг ашигладаггүй - ямар нэг зүйл ажиллах болно гэж найдаж, эргэлзэхээс өөр API горимуудын бүх нарийн ширийнийг ойлгох арга байхгүй.
  • Ямар ч жишээ, нийгэм байхгүй, мэдээлэл цуглуулахад туслах цорын ганц цэг бол жижиг Угсармал Python дээр (ашиглалтын олон жишээ байхгүй).
  • Шаардлагатай олон өгөгдөл түгжигдсэн тул селен нь хамгийн үр дүнтэй сонголт юм.
    1) Өөрөөр хэлбэл, зөвшөөрөл нь зохиомол хэрэглэгчээр дамждаг (мөн гараар бүртгүүлэх).

    2) Гэсэн хэдий ч Selenium-ийн тусламжтайгаар зөв, дахин давтагдах ажлын баталгаа байхгүй (наад зах нь ok.ru тохиолдолд).

    3) Ok.ru вэб сайт нь JavaScript алдаа агуулсан, заримдаа хачирхалтай, зөрчилтэй байдаг.

    4) Та хуудаслах, элементүүдийг ачаалах гэх мэтийг хийх хэрэгтэй ...

    5) Боодолоос гаргаж буй API алдааг эвгүй байдлаар зохицуулах шаардлагатай болно, жишээлбэл, иймэрхүү (туршилтын кодын хэсэг):

    def get_comments(args, context, discussions):
        pause = 1
        if args.extract_comments:
            all_comments = set()
    #makes sense to keep track of already processed discussions
            for discussion in tqdm(discussions): 
                try:
                    comments = get_comments_from_discussion_via_api(context, discussion)
                except odnoklassniki.api.OdnoklassnikiError as e:
                    if "NOT_FOUND" in str(e):
                        comments = set()
                    else:
                        print(e)
                        bp()
                        pass
                all_comments |= comments
                time.sleep(pause)
            return all_comments
    

    Миний хамгийн дуртай алдаа нь:

    OdnoklassnikiError("Error(code: 'None', description: 'HTTP error', method: 'discussions.getComments', params: …)”)

    6) Эцсийн эцэст Selenium + API нь хамгийн оновчтой хувилбар мэт харагдаж байна.

  • Энэ нь төлөвийг хадгалах, системийг дахин эхлүүлэх, олон алдаа, тэр дундаа сайтын тогтворгүй үйлдлийг зохицуулах шаардлагатай бөгөөд эдгээр алдааг төсөөлөхөд маш хэцүү байдаг (мэдээжийн хэрэг та мэргэжлийн шинж чанараар задлан шинжлэгч бичихгүй бол).

Энэ даалгаврыг гүйцэтгэх нөхцөлт хугацааны тооцоо нь Хабраас мэдээлэл цуглуулахаас 3-5 дахин их байх болно. Хэдийгээр Habr-ийн хувьд бид HTML задлан шинжлэлийн урд талын хандлагыг ашигладаг бөгөөд OK тохиолдолд бид API-тай чухал газруудад ажиллах боломжтой.

үр дүн нь

Их хэмжээний мэдээлэл боловсруулах дамжуулах хоолойн модулийн эцсийн хугацааг "газар дээр нь" (бид өнөөдөр төлөвлөж байна!) тооцоолохыг хичнээн их шаардаж байгаагаас үл хамааран гүйцэтгэлийн хугацааг ажлын параметрүүдэд дүн шинжилгээ хийхгүйгээр чанарын хувьд ч тооцоолох бараг боломжгүй юм.

Бага зэрэг философийн үүднээс авч үзвэл, Agile үнэлгээний стратеги нь инженерийн даалгаварт сайнаар нөлөөлдөг боловч илүү туршилтын шинж чанартай, нэг ёсондоо "бүтээлч", эрэл хайгуулын шинж чанартай, өөрөөр хэлбэл таамаглах боломжгүй асуудлууд нь ижил төстэй сэдвүүдийн жишээнүүдийн адил хүндрэлтэй байдаг. Үүнийг бид энд хэлэлцсэн.

Мэдээжийн хэрэг, мэдээлэл цуглуулах нь зүгээр л нэг жишээ юм - энэ нь ихэвчлэн гайхалтай энгийн бөгөөд техникийн хувьд төвөггүй ажил бөгөөд чөтгөр ихэнхдээ нарийн ширийн зүйлд байдаг. Яг энэ даалгавар дээр бид юу нь буруу болж, ажил хэр удаан үргэлжлэх боломжтойг харуулах боломжтой.

Хэрэв та нэмэлт туршилтгүйгээр даалгаврын шинж чанаруудыг харвал Reddit болон OK нь ижил төстэй харагдаж байна: API, python боодол байдаг, гэхдээ үндсэндээ ялгаа нь асар их юм. Эдгээр параметрүүдээс харахад Хабрын парс нь OK-ээс илүү төвөгтэй харагдаж байна - гэхдээ практик дээр энэ нь эсрэгээрээ бөгөөд асуудлын параметрүүдийг шинжлэх энгийн туршилтуудыг хийснээр яг үүнийг олж мэдэх боломжтой юм.

Миний туршлагаас харахад хамгийн үр дүнтэй арга бол урьдчилсан дүн шинжилгээ хийх, энгийн анхны туршилт хийхэд шаардагдах хугацааг ойролцоогоор тооцоолох, баримт бичгийг унших явдал юм - энэ нь бүхэл бүтэн ажлын үнэн зөв тооцоог гаргах боломжийг танд олгоно. Алдартай agile аргачлалын хувьд би танаас "даалгаврын параметрүүдийг тооцоолох" тасалбар үүсгэхийг хүсч байна, үүний үндсэн дээр би "спринт" -ын хүрээнд юу хийж болох талаар үнэлгээ өгч, тус бүрийг илүү нарийвчлалтай тооцоолж болно. даалгавар.

Тиймээс хамгийн үр дүнтэй аргумент бол "техникийн бус" мэргэжилтэнд хараахан үнэлэгдээгүй байгаа параметрүүдээс хамааран хэр их цаг хугацаа, нөөц өөрчлөгдөхийг харуулах явдал юм.

Өгөгдлийн шинжлэх ухаанд юу буруу байж болох вэ? Өгөгдөл цуглуулах

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх