Collecting data about books from mdk-arbat.
To select a book we can browse the categories. Clicking on the selected book from the list of books we get its description.
We expect a stable structure of the files - they are generated by software.
http://mdk-arbat.ru/catalog/?subj_id=2145
We can use the lists to get the book numbers.
> library(XML) > url2 <- "http://mdk-arbat.ru/catalog/?subj_id=" > subj <- 1118; pid <- 5 > Subj <- as.character(subj); Pid <- as.character(pid) > cata <- paste(url2,Subj,"&pid=",Pid,sep='') > Cata <- readLines(con<-url(cata)); close(con) > P <- Cata[nchar(Cata)>0] > length(P) [1] 1404 > Encoding(P) <- "UTF-8" > P[450:550] ... [469] " <i class=\"fa fa-shopping-basket\"></i>" [470] " <em>В корзину</em>" [471] " </a>" [472] " </div>" [473] " </div>" [474] " </div>" [475] " <div class=\"col-xs-6 col-sm-6 col-md-4 col-lg-3\">" [476] " <div class=\"tg-postbook\">" [477] " <figure class=\"tg-featureimg\">" [478] " <a class=\"tg-bookimg\" title=\"Google BigQuery. Все о хранилищах данных, аналитике и машинном обучении\" href=\"/book/77607\">" [479] " <div class=\"tg-frontcover\"><img src=\"http://img.mdk-arbat.ru/main/77/60/77607.jpg\"></div>" [480] " <div class=\"tg-backcover\"><img src=\"http://img.mdk-arbat.ru/main/77/60/77607.jpg\"></div>" [481] " </a>" [482] " <a class=\"mdk-btnaddtowishlist\" rel=\"nofollow\" href=\"/wishlist/add/77607\">" [483] " <i class=\"icon-heart\"></i>" [484] " <span>в список желаний</span>" [485] " </a>" [486] " </figure>" [487] " <div class=\"tg-postbookcontent\">" [488] " <ul class=\"tg-bookscategories\">" [489] " <li><a href=\"/catalog?subj_id=3072\">Базы данных</a></li>" [490] " </ul>" [491] " <div class=\"tg-booktitle\">" [492] " <h3><a href=\"/book/77607\" title=\"Google BigQuery. Все о хранилищах данных, аналитике и машинном обучении\">Google BigQuery. Все о хранилищах данных, аналитике и машинном обучении</a></h3>" [493] " </div>" [494] " <span class=\"tg-bookwriter\">" [495] " <a href=\"/book/77607\">Лакшманан, В.</a>" [496] " </span>" [497] " <span class=\"tg-bookprice\">" [498] " 2570 ₽" [499] "\t\t\t</span>" [500] " <a class=\"mdk-btn mdk-btnstyletwo quick--add-basket\" href=\"javascript:void(0);\" data-id=\"77607\" data-cnt=\"1\" onmousedown=\"try { rrApi.addToBasket(77607) } catch(e) {};\" " [501] ">" [502] " <i class=\"fa fa-shopping-basket\"></i>" [503] " <em>В корзину</em>" [504] " </a>" [505] " </div>" [506] " </div>" [507] " </div>" [508] " <div class=\"col-xs-6 col-sm-6 col-md-4 col-lg-3\">" [509] " <div class=\"tg-postbook\">" [510] " <figure class=\"tg-featureimg\">" [511] " <a class=\"tg-bookimg\" title=\"Чистый код : создание, анализ и рефакторинг\" href=\"/book/77606\">" [512] " <div class=\"tg-frontcover\"><img src=\"http://img.mdk-arbat.ru/main/77/60/77606.jpg\"></div>" [513] " <div class=\"tg-backcover\"><img src=\"http://img.mdk-arbat.ru/main/77/60/77606.jpg\"></div>" ...
> parse <- htmlParse(P) > books <- xpathSApply(parse,'//div[@class="tg-postbook"]') > length(books) [1] 20 > books[[2]]
To make the obtained value more readable we make some formating
<div class="tg-postbook"> <figure class="tg-featureimg"> <a class="tg-bookimg" title="Мифический человеко-месяц, или Как создаются программные системы" href="/book/77614"> <div class="tg-frontcover"><img src="http://img.mdk-arbat.ru/main/77/61/77614.jpg"/></div> <div class="tg-backcover"><img src="http://img.mdk-arbat.ru/main/77/61/77614.jpg"/></div> </a> <a class="mdk-btnaddtowishlist" rel="nofollow" href="/wishlist/add/77614"> <i class="icon-heart"/> <span>в список желаний</span> </a> </figure> <div class="tg-postbookcontent"> <ul class="tg-bookscategories"> <li><a href="/catalog?subj_id=3007">Теория и технология программирования</a></li> </ul> <div class="tg-booktitle"> <h3><a href="/book/77614" title="Мифический человеко-месяц, или Как создаются программные системы">Мифический человеко-месяц, или Как создаются программные системы</a></h3> </div> <span class="tg-bookwriter"><a href="/book/77614">Брукс, Ф.</a></span> <span class="tg-bookprice">1650 ₽</span> <a class="mdk-btn mdk-btnstyletwo quick--add-basket" href="javascript:void(0);" data-id="77614" data-cnt="1" onmousedown="try { rrApi.addToBasket(77614) } catch(e) {};"> <i class="fa fa-shopping-basket"/> <em>В корзину</em> </a> </div> </div>
> bks <- xpathSApply(parse,'//h3//a',xmlAttrs)["href",] > bks [1] "/book/2458709" "/book/77614" "/book/77607" "/book/77606" "/book/77546" [6] "/book/2458661" "/book/7620614" "/book/77053" "/book/76628" "/book/76292" [11] "/book/3374253" "/book/3374250" "/book/2563170" "/book/76215" "/book/76213" [16] "/book/76210" "/book/2458298" "/book/2458301" "/book/2458295" "/book/2458291" > bks <- substr(xpathSApply(parse,'//h3//a',xmlAttrs)["href",],7,15) > bks [1] "2458709" "77614" "77607" "77606" "77546" "2458661" "7620614" "77053" "76628" [10] "76292" "3374253" "3374250" "2563170" "76215" "76213" "76210" "2458298" "2458301" [19] "2458295" "2458291" > > tis <- xpathSApply(parse,'//h3//a',xmlAttrs)["title",] > Encoding(tis) <- "UTF-8" > tis [1] "Гибкая разработка на Java и C++ : принципы, паттерны и методики" [2] "Мифический человеко-месяц, или Как создаются программные системы" [3] "Google BigQuery. Все о хранилищах данных, аналитике и машинном обучении" [4] "Чистый код : создание, анализ и рефакторинг" [5] "Все секреты Minecraft. Моды" [6] "Программирование на С в примерах и задачах" [7] "Не заставляйте меня думать. Веб-юзабилити и здравый смысл" [8] "Паттерны проектирования на платформе .NET" [9] "Microsoft Excel 2016 : новейший самоучитель" [10] "Секреты безопасности и анонимности в Интернете" [11] "PHP и MySQL : 25 уроков для начинающих" [12] "Совершенный код : мастер-класс" [13] "Карьера программиста : прохождение собеседования, разработка программного обеспечения, структуры данных и алгоритмы" [14] "Site Reliability Workbook : практическое применение" [15] "Высоконагруженные приложения : программирование, масштабирование, поддержка" [16] "Программирование квантовых компьютеров. Базовые алгоритмы и примеры кода" [17] "Разработка информационного контента : учебник для студентов учреждений среднего профессионального образования (ФГОС)" [18] "Проектная графика : учебник для студентов учреждений среднего профессионального образования" [19] "Ловушка для багов. Полевое руководство по веб-хакингу" [20] "BPF для мониторинга Linux" > pr <- xpathSApply(parse,'//span[@class="tg-bookprice"]',xmlValue) > pr[1:2] [1] "\n 2370 \u20bd\n\t\t\t" "\n 1650 \u20bd\n\t\t\t" > trimws(pr) [1] "2370 \u20bd" "1650 \u20bd" "2570 \u20bd" "890 \u20bd" "440 \u20bd" "1080 \u20bd" [7] "840 \u20bd" "910 \u20bd" "300 \u20bd" "740 \u20bd" "1180 \u20bd" "1880 \u20bd" [13] "1670 \u20bd" "2570 \u20bd" "2800 \u20bd" "1660 \u20bd" "1230 \u20bd" "1180 \u20bd" [19] "1640 \u20bd" "1410 \u20bd" > price <- as.integer(gsub(" \u20bd","",trimws(pr))) > price [1] 2370 1650 2570 890 440 1080 840 910 300 740 1180 1880 1670 2570 2800 1660 1230 1180 [19] 1640 1410
http://mdk-arbat.ru/book/80969 ; http://mdk-arbat.ru/book/2563016
> wdir <- "C:/Users/batagelj/Documents/papers/2020/moskva/october/EDA/test" > setwd(wdir) > url1 <- "http://mdk-arbat.ru/book/" > book <- "80969"; bookN <- 80969 > page <- paste(url1,book,sep='') > html <- readLines(con<-url(page)); close(con) > S <- html[nchar(html)>0] > length(S) [1] 759 > Encoding(S) <- "UTF-8" > S[500:520] > S[431:533] [1] " <!--************************************" [2] " BOOK Start" [3] " *************************************-->" [4] " <div class=\"tg-sectionspace tg-haslayout\">" [5] " <div class=\"container\">" [6] " <div class=\"row\">" [7] " <div id=\"tg-twocolumns\" class=\"tg-twocolumns\">" [8] " <div class=\"col-xs-12 col-sm-8 col-md-8 col-lg-9 pull-right\">" [9] " <div id=\"tg-content\" class=\"tg-content\">" [10] " " [11] " <div class=\"tg-productdetail\" itemscope itemtype=\"http://schema.org/Book\">" [12] " <link itemprop=\"additionalType\" href=\"http://schema.org/Product\"/>" [13] " <div class=\"row\">" [14] " <div class=\"col-xs-12 col-sm-12 col-md-4 col-lg-4\">" [15] " <div class=\"tg-postbook\">" [16] " <figure class=\"tg-featureimg\">" [17] " <img src=\"http://img.mdk-arbat.ru/main/80/96/80969.jpg\" alt=\"Грокаем алгоритмы : иллюстрированное пособие для программистов и любопытствующих\" itemprop=\"image\">" [18] " </figure>" [19] " <div class=\"tg-postbookcontent\" >" [20] " <span class=\"tg-bookprice\" itemprop=\"offers\" itemscope itemtype=\"http://schema.org/Offer\">" [21] " <meta itemprop=\"price\" content=\"1000\">" [22] " <meta itemprop=\"priceCurrency\" content=\"RUB\">" [23] " <meta itemprop=\"availability\" href=\"http://schema.org/InStock\" content=\"in_stock\">" [24] " <link itemprop=\"url\" href=\"http://mdk-arbat.ru/book/80969\" />" [25] " <ins style=\"color: #000;\">1000 ₽</ins>" [26] " </span>" [27] " <p class=\"inet-shop-price\"><small>ЦЕНА ИНТЕРНЕТ-МАГАЗИНА!</small></p>" [28] " <ul class=\"tg-delevrystock\">" [29] " <li><i class=\"icon-store\"></i><span>Наличие:" [30] " <em style=\"color:#00A000\">есть</em>" [31] " </span></li>" [32] " </ul>" [33] " <div class=\"tg-quantityholder\" data-maxqty=\"14\">" [34] " <em class=\"minus\">-</em>" [35] " <em class=\"plus\">+</em>" [36] " <div>" [37] " <input type=\"text\" class=\"result\" value=\"1\" id=\"quantity\" name=\"quantity\">" [38] " </div>" [39] " </div>" [40] " <a class=\"mdk-btn mdk-active mdk-btn-lg quick--add-basket\" href=\"javascript:void(0);\" data-id=\"80969\" data-cnt=\"1\" onmousedown=\"try { rrApi.addToBasket(80969) } catch(e) {};\" " [41] ">Добавить в корзину</a>" [42] " <a class=\"mdk-btnaddtowishlist\" href=\"javascript:void(0);\">" [43] " <span>В список желаний</span>" [44] " </a>" [45] " </div>" [46] " <div class=\"tg-postbookcontent\">" [47] " <span>Поделиться:</span>" [48] " <script src=\"https://yastatic.net/es5-shims/0.0.2/es5-shims.min.js\"></script>" [49] " <script src=\"https://yastatic.net/share2/share.js\"></script>" [50] " <div class=\"ya-share2\" data-services=\"vkontakte,facebook,odnoklassniki,moimir,twitter,tumblr,whatsapp,skype,telegram\"></div>" [51] " </div>" [52] " </div>" [53] " </div>" [54] " <div class=\"col-xs-12 col-sm-12 col-md-8 col-lg-8\">" [55] " <div class=\"tg-productcontent\">" [56] " <ul class=\"tg-bookscategories\">" [57] " <li><a href=\"/catalog?subj_id=3007\">Теория и технология программирования</a></li>" [58] " </ul>" [59] " <div class=\"tg-booktitlefull\">" [60] " <h2 itemprop=\"name\">Грокаем алгоритмы : иллюстрированное пособие для программистов и любопытствующих</h2>" [61] " </div>" [62] " <span class=\"tg-bookwriter\" itemprop=\"author\"><a href=\"/catalog?q=%D0%91%D1%85%D0%B0%D1%80%D0%B3%D0%B0%D0%B2%D0%B0%2C+%D0%90.\">Бхаргава, А.</a></span>" [63] " <div class=\"tg-description\" itemprop=\"description\">" [64] " <p>Алгоритмы - это всего лишь пошаговые алгоритмы решения задач, и большинство таких задач уже были кем-то решены, протестированы и проверены. Откройте великолепно иллюстрированную книгу и вы сразу поймете, что алгоритмы - это просто. А грокать алгоритмы - это веселое и увлекательное занятие.</p>" [65] " </div>" [66] " <div class=\"tg-sectionhead\">" [67] " <h2>Полная информация о книге</h2>" [68] " </div>" [69] " <ul class=\"tg-productinfo\">" [70] " <li><span><b>Код товара</b>:</span><span><b>80969</b></span></li> <li><span>Вид товара:</span><span>Книги</span></li> <li><span>Целевое назначение:</span><span>Производств.-практич.изд.,практич.рук-во</span></li>" [71] " <li><span>ISBN:</span><span>978-5-4461-0923-4<meta itemprop=\"isbn\" content=\"978-5-4461-0923-4\"></span></li>" [72] " " [73] " <li><span>Серия:</span><span><a href=\"/catalog?ser_id=265\"><u>Библиотека программиста.</u></a></span></li>" [74] " " [75] " <li><span>Издательство:</span>" [76] " <span>Питер<meta itemprop=\"publisher\" content=\"Питер\"></span>" [77] " </li>" [78] " <li><span>Год издания:</span><span>2021</span></li> <li><span>Количество страниц:</span><span>288<meta itemprop=\"numberOfPages\" content=\"288\"></span></li>" [79] " <li><span>Формат:</span><span>70х100/16</span></li> <li><span>Переплет:</span><span>обл.</span></li> </ul>" [80] " </div>" [81] " </div>" [82] " <div class=\"tg-productdescription\">" [83] " <div class=\"col-xs-12 col-sm-12 col-md-12 col-lg-12\">" [84] " <div class=\"tg-sectionhead\">" [85] " <h2>Описание товара</h2>" [86] " </div>" [87] " <ul class=\"tg-themetabs\" role=\"tablist\">" [88] " <li role=\"presentation\" class=\"active\"><a href=\"#instock\" data-toggle=\"tab\">Наличие в магазинах</a></li>" [89] " <li role=\"presentation\"><a href=\"#description\" data-toggle=\"tab\">Аннотация</a></li>" [90] " </ul>" [91] " <div class=\"tg-tab-content tab-content\">" [92] " <div role=\"tabpanel\" class=\"tg-tab-pane tab-pane\" id=\"description\">" [93] " <div class=\"tg-description\">" [94] " <p>Алгоритмы - это всего лишь пошаговые алгоритмы решения задач, и большинство таких задач уже были кем-то решены, протестированы и проверены. Откройте великолепно иллюстрированную книгу и вы сразу поймете, что алгоритмы - это просто. А грокать алгоритмы - это веселое и увлекательное занятие.</p>" [95] " </div>" [96] " </div>" [97] " <div role=\"tabpanel\" class=\"tg-tab-pane tab-pane active\" id=\"instock\">" [98] " <div class=\"tg-description\">" [99] " <div class=\"instock\">" [100] " <hr>" [101] " <div class=\"row\">" [102] " <div class=\"col-xs-12 col-sm-12 col-md-12 col-lg-12\">" [103] " <div class=\"col-md-6 col-sm-6 col-xs-6\"><strong><a href=\"/page/map/1\"><strong>Московский Дом Книги</strong></a></div>" >
> parseS <- htmlParse(S) > auth <- xpathSApply(parseS,'//span[@itemprop="author"]//a',xmlValue) > auth [1] "Бхаргава, А." > titl <- trimws(xpathSApply(parseS,'//div[@class="tg-booktitlefull"]',xmlValue)) > titl [1] "Грокаем алгоритмы : иллюстрированное пособие для программистов и любопытствующих" > cteg <- as.vector(substr(xpathSApply(parseS,'//ul[@class="tg-bookscategories"]//li//a',xmlAttrs),18,25)) > cteg [1] "3007" > desc <- trimws(xpathSApply(parseS,'//div[@id="description"]//div[@class="tg-description"]',xmlValue)) > desc [1] "Алгоритмы - это всего лишь пошаговые алгоритмы решения задач, и большинство таких задач уже были кем-то решены, протестированы и проверены. Откройте великолепно иллюстрированную книгу и вы сразу поймете, что алгоритмы - это просто. А грокать алгоритмы - это веселое и увлекательное занятие." > > price <- as.integer(xpathSApply(parseS,'//meta[@itemprop="price"]',xmlAttrs)["content",1]) > price [1] 1000 > info <- xpathSApply(parseS,'//ul[@class="tg-productinfo"]//li//span',xmlValue) > info [1] "Код товара:" "80969" [3] "Вид товара:" "Книги" [5] "Целевое назначение:" "Производств.-практич.изд.,практич.рук-во" [7] "ISBN:" "978-5-4461-0923-4" [9] "Серия:" "Библиотека программиста." [11] "Издательство:" "Питер" [13] "Год издания:" "2021" [15] "Количество страниц:" "288" [17] "Формат:" "70х100/16" [19] "Переплет:" "обл." > type <- info[6] > ISBN <- info[8] > series <- info[10] > pub <- info[12] > year <- info[14] > pages <- info[16] > format <- info[18] > bind <- info[20]
> library(XML) > url2 <- "http://mdk-arbat.ru/catalog/?subj_id=" > catid <- c(3013,3071) > catmax <- c(4,2) > ncat <- length(catid) > books <- c() > for(i in 1:ncat){ + Subj <- as.character(catid[i]) + for(p in 1:catmax[i]){ + Pid <- as.character(p) + cata <- paste(url2,Subj,"&pid=",Pid,sep='') + Cata <- readLines(con<-url(cata)); close(con) + P <- Cata[nchar(Cata)>0] + parse <- htmlParse(P) + bks <- substr(xpathSApply(parse,'//h3//a',xmlAttrs)["href",],7,15) + books <- c(books,bks) + } + } > books [1] "84278" "84270" "2459473" "79011" "2458291" "2562896" "3373774" "7620262" "62496" [10] "62396" "62390" "61270" "2562696" "59770" "55468" "54862" "2456037" "3372779" [19] "49370" "48495" "44561" "43382" "43372" "43084" "41345" "41331" "40271" [28] "40268" "37831" "37123" "31670" "3371060" "30885" "30884" "30883" "2561820" [37] "30032" "2451862" "24875" "24551" "3370443" "23624" "3369978" "18638" "3369776" [46] "15264" "13274" "9671" "9504" "7919" "7041" "4937" "4858" "1566" [55] "984862" "975543" "970159" "970320" "3365845" "944600" "938078" "916417" "915757" [64] "2557092" "2555750" "885377" "862587" "860804" "854758" "3339303" "851859" "838618" [73] "6618161" "2549867" "8414432" "2547386" "2544319" "80443" "74979" "62486" "62481" [82] "62142" "2562710" "2456733" "59771" "58301" "8233024" "3371383" "32468" "23110" [91] "21540" "19911" "8232530" "7024" "1530" "3366203" "969060" "947416" "918422" [100] "915260" "3353997" "3345066" "829724" >
> E <- rep("",n); Z <- rep(0,n) > B <- data.frame(aut=E,tit=E,cat=E,des=E,pri=Z,typ=E,isbn=E,ser=E,pub=E,year=E,pag=E,fmt=E,bnd=E,row.names=books,stringsAsFactors=FALSE) > for(b in 1:n){ > bk <- books[b] > page <- paste(url1,bk,sep='') > html <- readLines(con<-url(page)); close(con) > S <- html[nchar(html)>0] > Encoding(S) <- "UTF-8" > parseS <- htmlParse(S) > B[bk,"aut"] <- xpathSApply(parseS,'//span[@itemprop="author"]//a',xmlValue) > B[bk,"tit"] <- trimws(xpathSApply(parseS,'//div[@class="tg-booktitlefull"]',xmlValue)) > B[bk,"cat"] <- as.vector(substr(xpathSApply(parseS,'//ul[@class="tg-bookscategories"]//li//a',xmlAttrs),18,25)) > B[bk,"des"] <- trimws(xpathSApply(parseS,'//div[@id="description"]//div[@class="tg-description"]',xmlValue)) > B[bk,"pri"] <- as.integer(xpathSApply(parseS,'//meta[@itemprop="price"]',xmlAttrs)["content",1]) > info <- xpathSApply(parseS,'//ul[@class="tg-productinfo"]//li//span',xmlValue) > B[bk,"typ"] <- info[6] > B[bk,"isbn"] <- info[8] > B[bk,"ser"] <- info[10] > B[bk,"pub"] <- info[12] > B[bk,"year"] <- info[14] > B[bk,"pag"] <- info[16] > B[bk,"fmt"] <- info[18] > B[bk,"bnd"] <- info[20] > cat("\a-"); flush.console(); Sys.sleep(0.25) > if(b%%10==0) cat(" ") > if(b%%50==0) cat("\n") > } > cat("\n") > bn <- B[,"bnd"] > Encoding(bn) <- "UTF-8" > bn [1] "в пер." "обл." "обл." "в пер." "обл." NA "обл." "в пер." "в пер." "в пер." [11] "в пер." "в пер." "обл." "в пер." "обл." "в пер." "обл." "обл." "обл." "обл." [21] "обл." "в пер." "в пер." "в пер." "обл." "обл." "в пер." "обл." "обл." "в пер." [31] "обл." "обл." "обл." "обл." "обл." "в пер." "обл." NA "обл." "в пер." [41] "в пер." "обл." "обл." "обл." "в пер." "в пер." "в пер." "обл." "обл." "в пер." [51] "обл." "обл." "обл." "обл." "в пер." "обл." "обл." "обл." "обл." "обл." [61] "в пер." "обл." "обл." "обл." "обл." "обл." "обл." "обл." "обл." "обл." [71] "обл." "обл." "в пер." "в пер." "обл." "обл." "обл." "обл." "обл." "обл." [81] "в пер." "обл." "обл." "обл." "в пер." "обл." "в пер." "обл." "обл." "обл." [91] "обл." "обл." "обл." "в пер." "в пер." "обл." "обл." "обл." "в пер." "обл." [101] "обл." "обл." "обл." > dim(B) [1] 103 13 > write.csv(B,"Books0.csv",row.names=TRUE)
Larger dataset:
> url2 <- "http://mdk-arbat.ru/catalog/?subj_id=" > # catid <- c(3013,3071) > # catmax <- c(4,2) > catid <- c( 2,7, 9,14,15,16,17,19,24) > catmax <- c(24,3,10,27,12,50,13,50,50) > ncat <- length(catid) > books <- c() > for(i in 1:ncat){ + Subj <- as.character(catid[i]) + cat(paste(Subj,":",as.character(catmax[i]),"\n")); flush.console() + for(p in 1:catmax[i]){ + Pid <- as.character(p) + cata <- paste(url2,Subj,"&pid=",Pid,sep='') + Cata <- readLines(con<-url(cata)); close(con) + P <- Cata[nchar(Cata)>0] + parse <- htmlParse(P) + bks <- substr(xpathSApply(parse,'//h3//a',xmlAttrs)["href",],7,15) + books <- c(books,bks) + } + } 2 : 24 7 : 3 9 : 10 14 : 27 15 : 12 16 : 50 17 : 13 19 : 50 24 : 50 There were 50 or more warnings (use warnings() to see the first 50) > length(books) [1] 4721 > save(books,file="BookList.RData",ascii=TRUE)
https://raw.githubusercontent.com/bavla/HSE/master/EDA/BookList.RData
In processing of a book some unexpected error can appear. To deal with it (skip it) we use the function tryCatch
.
> url1 <- "http://mdk-arbat.ru/book/" > n <- length(books) > E <- rep("",n); Z <- rep(0,n) > B <- data.frame(aut=E,tit=E,cat=E,des=E,pri=Z,typ=E,isbn=E,ser=E,pub=E,year=E,pag=E,fmt=E,bnd=E,row.names=books,stringsAsFactors=FALSE) > for(b in 3201:3300){ > tryCatch({ > bk <- books[b] > page <- paste(url1,bk,sep='') > html <- readLines(con<-url(page)); close(con) > S <- html[nchar(html)>0] > Encoding(S) <- "UTF-8" > parseS <- htmlParse(S) > B[bk,"aut"] <- xpathSApply(parseS,'//span[@itemprop="author"]//a',xmlValue) > B[bk,"tit"] <- trimws(xpathSApply(parseS,'//div[@class="tg-booktitlefull"]',xmlValue)) > B[bk,"cat"] <- as.vector(substr(xpathSApply(parseS,'//ul[@class="tg-bookscategories"]//li//a',xmlAttrs),18,25)) > B[bk,"des"] <- trimws(xpathSApply(parseS,'//div[@id="description"]//div[@class="tg-description"]',xmlValue)) > B[bk,"pri"] <- as.integer(xpathSApply(parseS,'//meta[@itemprop="price"]',xmlAttrs)["content",1]) > info <- xpathSApply(parseS,'//ul[@class="tg-productinfo"]//li//span',xmlValue) > B[bk,"typ"] <- info[6] > B[bk,"isbn"] <- info[8] > B[bk,"ser"] <- info[10] > B[bk,"pub"] <- info[12] > B[bk,"year"] <- info[14] > B[bk,"pag"] <- info[16] > B[bk,"fmt"] <- info[18] > B[bk,"bnd"] <- info[20] > }, error = function(e){ message('Caught an error!'); print(e); print(b) }) > cat("\a-"); flush.console(); # Sys.sleep(0.25) > if(b%%10==0) cat(" ") > if(b%%50==0) cat(" ",b,"\n") > } > cat("\n") > dim(B) [1] 4721 13 > save(B,file="Books.RData") > save(B,file="BooksA.RData",ascii=TRUE) > write.csv(B,file="MDKarbat.csv") > bi <- as.character(B[2559,]) > Encoding(bi) <- "UTF-8" > bi > library(stringi) > UTF8 <- function(s) stri_unescape_unicode(gsub("<U\\+(....)>", "\\\\u\\1",s)) > T <- read.csv("MDKarbat.csv",stringsAsFactor=FALSE) > au <- UTF8(T$aut) > au[1:10] [1] "" "Манько, Ю. В," "Филатова, О. Г." "Недель, А." "Манн, М." [6] "Шанин, Т." "Манн, М." "Манн, М." "Манн, М." "Агапов, П. В."
https://github.com/bavla/HSE/raw/master/EDA/MDKarbat.csv
https://github.com/bavla/HSE/raw/master/EDA/Books.RData