{"id":89206,"date":"2020-07-20T07:41:57","date_gmt":"2020-07-20T05:41:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh"},"modified":"2020-07-20T07:41:57","modified_gmt":"2020-07-20T05:41:57","slug":"chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh","title":{"rendered":"What can go wrong with Data Science? Data Collection","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/510944\/\"><img decoding=\"async\" alt=\"What can go wrong with Data Science? Data Collection\" src=\"\/wp-content\/uploads\/2020\/07\/49fb91fc3e45754e437b2c1fc4fec12f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\nToday, there are countless courses on Data Science, and it\u2019s well-known that the most money in Data Science can be earned through Data Science courses (why dig when you can sell shovels?). The main downside of these courses is that they are not related to real work: no one will provide you with clean, processed data in the required format. When you finish the courses and start tackling real problems, many nuances come to light.<\/p>\n<p>That\u2019s why we\u2019re starting a series of notes titled 'What Can Go Wrong with Data Science,' based on real events that have happened to me, my friends, and colleagues. We'll analyze typical Data Science tasks with real examples: how it actually happens. We\u2019ll begin today with the task of data collection.<\/p>\n<p>The first hurdle people encounter when they start working with real data is actually collecting the relevant data we need. The key message of this article is:<\/p>\n<blockquote><p><b>We systematically underestimate the time, resources, and effort needed for data collection, cleaning, and preparation.<\/b><\/p><\/blockquote>\n<p>\nAnd importantly, we\u2019ll discuss what to do to avoid this.<\/p>\n<p>According to various estimates, cleaning, transformation, data processing, feature engineering, etc. take up 80-90% of the time, while analysis only takes 10-20%, yet almost all educational materials focus solely on analysis.<\/p>\n<p>Let's break down a typical simple analytical task in three variations and see what 'aggravating circumstances' arise.<\/p>\n<p>For the example, we will again consider similar variations of the data collection task and community comparison for:<\/p>\n<ol>\n<li>Two Reddit subreddits<\/li>\n<li>Two sections of Habr<\/li>\n<li>Two Odnoklassniki groups<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>A conditional theoretical approach<\/h2>\n<p>\nOpen the website and read examples, allocate several hours for reading, several hours for coding based on examples, and debugging. Add a few hours for collection. Throw in some extra hours for good measure (multiply by two and add N hours).<\/p>\n<p><b>The key point: the time estimation is based on assumptions and guesses about how long this will take.<\/b><\/p>\n<p>The time analysis should start with assessing the following parameters for the conditional task described above:<\/p>\n<ul>\n<li>What is the data size and how much needs to be physically collected (*see below*).<\/li>\n<li>What is the time to collect one record and how long do you need to wait before collecting the second.<\/li>\n<li>Implement code that preserves state and starts a restart when (not if) everything fails.<\/li>\n<li>Determine if we need authentication and set aside time to gain access via API.<\/li>\n<li>Include the number of errors as a function of data complexity \u2014 evaluate based on a specific task: structure, how many transformations, what and how we extract.<\/li>\n<li>Include network errors and issues with non-standard project behavior.<\/li>\n<li>Assess whether the required functions are in the documentation, and if not, how much time is needed for a workaround.<\/li>\n<\/ul>\n<p>\nThe most important factor for estimating time \u2014 you actually need to spend time and effort on 'reconnaissance in action' \u2014 only then will your planning be adequate. So no matter how much you are pushed to say 'how long will it take to collect data' \u2014 make sure to allocate time for preliminary analysis and justify it by how much time will vary based on real task parameters.<\/p>\n<p>Now we will demonstrate specific examples where such parameters will change.<\/p>\n<p><b>Key point: estimation is based on the analysis of key factors affecting the volume and complexity of work.<\/b><\/p>\n<p>Estimation based on guesswork is a good approach when functional elements are relatively small and there are not many factors that can significantly affect the structure of the task. However, in the case of a number of Data Science tasks, such factors become extremely numerous, and this approach becomes inadequate.<\/p>\n<h2>Comparison of Reddit communities<\/h2>\n<p>\nLet's start with the simplest case (as it will turn out later). Honestly, we have an almost ideal case; let's check our complexity checklist:<\/p>\n<ul>\n<li>There is a neat, clear, and documented API.<\/li>\n<li>It is extremely simple, and most importantly, tokens are generated automatically.<\/li>\n<li>There is <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/praw-dev\/praw\">python wrapper<\/a><\/noindex> \u2014 with plenty of examples.<\/li>\n<li>A community that focuses on analysis and data collection on Reddit (including YouTube videos explaining how to use the python wrapper) <noindex><a rel=\"nofollow\" href=\"https:\/\/www.programcreek.com\/python\/example\/86599\/praw.Reddit\">for example,<\/a><\/noindex>.<\/li>\n<li>The methods we need most likely exist in the API. Moreover, the code looks compact and clean; below is an example of a function that collects comments on a post.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"python\">def get_comments(submission_id):\n    reddit = Reddit(check_for_updates=False, user_agent=AGENT)\n    submission = reddit.submission(id=submission_id)\n    more_comments = submission.comments.replace_more()\n    if more_comments:\n        skipped_comments = sum(x.count for x in more_comments)\n        logger.debug('Skipped %d MoreComments (%d comments)',\n                     len(more_comments), skipped_comments)\n    return submission.comments.list()\n<\/code><\/pre>\n<p><i>Taken from <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/timendum\/reddit-utilities\/blob\/master\/thread-export.py\">this<\/a><\/noindex> collection of convenient wrapper utilities.<\/i><\/p>\n<p>Despite the fact that we have the best scenario here, we still need to consider a number of important factors from real life:<\/p>\n<ul>\n<li>API limits \u2014 we are forced to retrieve data in batches (waiting between requests, etc.).<\/li>\n<li>Collection time \u2014 for a complete analysis and comparison, you need to allocate significant time just for the spider to crawl through the subreddit.<\/li>\n<li>The bot must run on a server \u2014 you can't just launch it on your laptop, pack it into your backpack, and go about your business. That\u2019s why I ran everything on a VPS. You can save an additional 10% using the promo code habrahabr10.<\/li>\n<li>The physical inaccessibility of some data (it\u2019s visible only to admins or is too complex to gather) \u2014 this needs to be taken into account; not all data can be collected in a reasonable timeframe.<\/li>\n<li>Network errors: working with the network is a pain.<\/li>\n<li>These are real live data \u2014 they are never clean.<\/li>\n<\/ul>\n<p>\nOf course, the indicated nuances need to be accounted for in the development. The specific hours\/days depend on the development experience or previous work on similar tasks; however, we see that this task is purely engineering and does not require any extra movements to solve \u2014 everything can be evaluated, planned, and executed very well.<\/p>\n<h2>Comparison of Habr sections<\/h2>\n<p>\nMoving on to a more interesting and non-trivial case of comparing flows and\/or sections of Habr.<\/p>\n<p>Let's check our complexity checklist \u2014 here, to understand each point, you\u2019ll need to fiddle a bit with the task itself and experiment.<\/p>\n<ul>\n<li>At first, you think there\u2019s an API, but there isn\u2019t. Yes, Habr has an API, but it\u2019s only available to admins (or maybe it doesn\u2019t work at all).<\/li>\n<li>Then you just start parsing HTML \u2014 \"import requests\", what can go wrong?<\/li>\n<li>And how do you even parse? The simplest and most commonly used approach is to iterate by ID; we note that it's not the most efficient and you'll have to handle different cases \u2014 here's an example of the density of real IDs among all existing ones.\n<p><img decoding=\"async\" alt=\"What can go wrong with Data Science? Data Collection\" src=\"\/wp-content\/uploads\/2020\/07\/2c67fc14f672e92979edd617314210da.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Taken from <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/218607\/\">this<\/a><\/noindex> articles.<\/i><\/li>\n<li>Raw data wrapped in HTML across the network can be a pain. For example, if you want to collect and store the rating of an article: you extracted the score from HTML and decided to save it as a number for further processing.\u00a0\n<p>1) int(score) throws an error: because on Habr a minus, like in the string \"\u20135\" \u2014 this is an en dash, not a minus sign (surprising, right?), so at some point it had to revive the parser with such a horrible fix.<\/p>\n<pre><code class=\"python\">try:\n      score_txt = post.find(class_=\"score\").text.replace(u\"\u2013\",\"-\").replace(u\"+\",\"+\")\n      score = int(score_txt)\n      if check_date(date):\n        post_score += score\n<\/code><\/pre>\n<p>\nThere may not be dates, pluses, or minuses at all (as we see above with the check_date function, this has happened).<\/p>\n<p>2) Unescaped special characters \u2014 they will come, you need to be prepared.<\/p>\n<p>3) The structure changes depending on the type of post.<\/p>\n<p>4) Old posts may have **strange structures**.<\/li>\n<li>Essentially, error handling and what might or might not happen must be managed, and you cannot predict exactly what will go wrong and what the structure could be like, and where something might break \u2014 you will just have to try and account for the errors thrown by the parser.<\/li>\n<li>Then you realize that you need to parse in multiple threads, otherwise parsing in one thread will take 30+ hours (this is purely the execution time of a working single-threaded parser that is sleeping and not subject to any bans). In <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/276383\/\">this<\/a><\/noindex> the article, this led to a pattern like this at some point:<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"What can go wrong with Data Science? Data Collection\" src=\"\/wp-content\/uploads\/2020\/07\/9ad1853f3ee2c9321ee9f1a5e3efea7d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThus, the checklist of complexity:<\/p>\n<ul>\n<li>Working with the network and parsing HTML with iteration and ID enumeration.<\/li>\n<li>Documents have an irregular structure.<\/li>\n<li>There are many places where the code can easily fail.<\/li>\n<li>You need to write || code.<\/li>\n<li>There is a lack of necessary documentation, code examples, and\/or community.<\/li>\n<\/ul>\n<p>\nThe estimated time for this task will be 3-5 times higher than for gathering data from Reddit.<\/p>\n<h2>Comparison of Vkontakte groups<\/h2>\n<p>\nLet's move on to the most technically interesting case described. For me, it was interesting because at first glance, it seems quite trivial, but it turns out not to be \u2014 as soon as you poke it with a stick.<\/p>\n<p>It will start with our checklist of complexity, and we note that many of them will turn out to be much more complicated than they appear at first:<\/p>\n<ul>\n<li>The API exists, but it almost completely lacks the necessary functions.<\/li>\n<li>For certain functions, you need to request access via email, meaning that access issuance is not instantaneous.<\/li>\n<li>It is terribly documented (to begin with, Russian and English terms are mixed everywhere, and completely inconsistently \u2014 sometimes you just have to guess what is expected of you) and, moreover, it is not designed for data retrieval, for example, <noindex><a rel=\"nofollow\" href=\"https:\/\/apiok.ru\/dev\/methods\/rest\/discussions\/discussions.getComments\">the function we need<\/a><\/noindex>.<\/li>\n<li>Documentation requires sessions, yet in practice it doesn\u2019t use them \u2014 and there\u2019s no way to figure out all the intricacies of the API modes except by poking around and hoping something will work.<\/li>\n<li>There are no examples and community support, the only reference point for gathering information is a small <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/alternativshik\/python-odnoklassniki\">wrapper<\/a><\/noindex> in Python (without much usage examples).<\/li>\n<li>The most viable option seems to be Selenium, as many necessary data are locked.<br \/>\n1) That is, authorization is done through a fictitious user (and registration by hand).<\/p>\n<p>2) However, with Selenium, there are no guarantees of correct and repeatable operation (at least in the case of ok.ru for sure).<\/p>\n<p>3) The Ok.ru site contains JavaScript errors and occasionally behaves oddly and inconsistently.<\/p>\n<p>4) Pagination, element loading, etc. have to be managed\u2026<\/p>\n<p>5) API errors returned by the wrapper will need to be awkwardly handled, for example, like this (a snippet of experimental code):<\/p>\n<pre><code class=\"python\">def get_comments(args, context, discussions):\n    pause = 1\n    if args.extract_comments:\n        all_comments = set()\n#makes sense to keep track of already processed discussions\n        for discussion in tqdm(discussions): \n            try:\n                comments = get_comments_from_discussion_via_api(context, discussion)\n            except odnoklassniki.api.OdnoklassnikiError as e:\n                if \"NOT_FOUND\" in str(e):\n                    comments = set()\n                else:\n                    print(e)\n                    bp()\n                    pass\n            all_comments |= comments\n            time.sleep(pause)\n        return all_comments\n<\/code><\/pre>\n<p>\nMy favorite error was:<\/p>\n<p><code>OdnoklassnikiError(\"Error(code: 'None', description: 'HTTP error', method: 'discussions.getComments', params: \u2026)\")<\/code><\/p>\n<p>6) Ultimately, the Selenium + API option looks like the most rational choice.<\/li>\n<li>State preservation and system restart are required, handling numerous errors, including the website's inconsistent behavior \u2014 and these errors are quite difficult to envision (unless you are a professional parser developer, of course).<\/li>\n<\/ul>\n<p>\nThe estimated time for this task will be 3 to 5 times higher than that for data collection from Habr. Despite the fact that in the case of Habr we use a blunt approach with HTML parsing, while in the case of OK we can work with the API in critical areas.<\/p>\n<h2>Conclusions<\/h2>\n<p>\nNo matter how much you're asked to estimate the timelines \"on-site\" (after all, it's planning time today!), evaluating the duration of a substantial data processing pipeline module is almost never feasible without analysis of the task parameters. <\/p>\n<p>If we speak a bit more philosophically, agile estimation strategies work well for engineering tasks, but challenges arise with more experimental and, in some sense, creative and research-oriented tasks, i.e., those that are less predictable. These challenges are similar to the examples discussed here. <\/p>\n<p>Certainly, data collection is just a vivid illustrative example \u2014 this task usually seems incredibly simple and technically straightforward, yet the devil is often in the details. This task vividly demonstrates the full spectrum of possible variations of what can go wrong and how much the work may drag on. <\/p>\n<p>If we glance at the task specifications without additional experiments, Reddit and OK seem similar: there\u2019s an API, a Python wrapper, but in essence, the difference is enormous. Judging by these parameters, parsing Habr seems more complex than OK \u2014 whereas, in practice, it is quite the opposite, and this can be determined through simple experimental analyses of the task parameters.<\/p>\n<p>In my experience, the most effective approach is a rough time estimate for the preliminary analysis and the initial simple experiments, along with reading documentation \u2014 these will allow you to provide an accurate estimate for the entire job. In terms of the popular agile methodology \u2014 I ask for a ticket to be opened for \"task parameter estimation,\" based on which I can assess what might be accomplished within the sprint and give a more precise estimate for each task.<\/p>\n<p>Therefore, the most effective argument seems to be one that demonstrates to a \"non-technical\" specialist how significantly time and resources can vary based on parameters that still need to be evaluated.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=param&amp;utm_content=datascience1#order\"><img decoding=\"async\" alt=\"What can go wrong with Data Science? Data Collection\" src=\"\/wp-content\/uploads\/2020\/07\/2ca567a078c8500d37dfcf982e76252c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/510944\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 100500 \u043a\u0443\u0440\u0441\u043e\u0432 \u043f\u043e Data Science \u0438 \u0434\u0430\u0432\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u0435\u043d\u0435\u0433 \u0432 Data Science \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0443\u0440\u0441\u0430\u043c\u0438 \u043f\u043e Data Science (\u0437\u0430\u0447\u0435\u043c \u043a\u043e\u043f\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u043e\u043f\u0430\u0442\u044b?). \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u0438\u043d\u0443\u0441 \u044d\u0442\u0438\u0445 \u043a\u0443\u0440\u0441\u043e\u0432 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0431\u0449\u0435\u0433\u043e \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439: \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u0447\u0438\u0441\u0442\u044b\u0435, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":89207,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-89206","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a \u0441 Data Science? \u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-20T05:41:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-20T05:41:57+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47What can go wrong with Data Science? Data Collection | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0427\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a \u0441 Data Science? \u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 | ProHoster","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/chto-mozhet-pojti-ne-tak-s-data-science-sbor-dannyh","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-20T05:41:57+00:00","article:modified_time":"2020-07-20T05:41:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"89206","title":null,"description":null,"keywords":null,"keyphrases":{"focus":[],"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:51:09","updated":"2026-08-11 12:50:12","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/89206","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=89206"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/89206\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/89207"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=89206"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=89206"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=89206"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}