Во время владения Macbook Pro написано несколько программ на Swift для MacOS, IOS (в режиме эмуляции)
СОЗДАНИЕ ПОИСКОВОГО РОБОТА НА ЯЗЫКЕ SWIFT 3.0
Пример создания простой программы поискового робота (crawler) для поиска информации на вебсайте
на языке Swift 3.0 XCODE 8 Beta (последняя бета версия языка программирования для платформ MAC OS X, iOS, WatchOS, TVOS, Linux)
ссылка на полный текст программы https://github.com/Mityugin/crawler/blob/master/wp7/wp7/main.swift
Проект выполнен в виде утилиты командной строки для запуска в терминале системы MAC OS X (в дальнейшем планируется запуск на сервере Linux)
Не используем никакие дополнительные библиотеки и парсеры, только стандартный модуль Foundation:
import Foundationимеем входные данные для поиска (домен, протокол, строка для поиска):
let domain = "mityugin.com"let htp = "http://"let searchStr = "15 лет"Функция для выборки гиперссылок из HTML текста с использованием регулярных выражений:
func matchesForRegexInText(regex: String, text: String) -> [String] {do {
let regex = try RegularExpression(pattern: regex, options: [.caseInsensitive])let range = NSMakeRange(0, text.characters.count)let results = regex.matches(in: text, options: [], range: range)let nsString = text as NSStringlet urls: [String] = results.map { result in
return nsString.substring(with: result.range(at: 1))}
return urls} catch let error as NSError {
print("invalid regex: \(error.localizedDescription)")return []}}
Создаем HTTP сессию и загружаем страницу в память, проверяем кодировку текста
let url = htp+domainlet session = URLSession.shared()let request = URLRequest(url: URL(string: url)!)let task = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void invar usedEncoding = String.Encoding.utf8 // Some fallback value
if let encodingName = response?.textEncodingName {let encoding = CFStringConvertIANACharSetNameToEncoding(encodingName)if encoding != kCFStringEncodingInvalidId {usedEncoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(encoding))}}
Сохраняем всю страницу в файл с расширением .html
if let myString = String(data: data!, encoding: usedEncoding) {do {
try myString.write(toFile: "\(domain).html", atomically: true, encoding: usedEncoding)
} catch {
// failed to write file – bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding
}
Создаем набор гиперссылок из текста страницы и также сохраняем в файл .links
let matches = matchesForRegexInText(regex: "href=\"([^\"]*?)\"", text: myString)var pageUrls: Set<String> = []
for var matchStr in matches {if (matchStr.hasPrefix(url) || matchStr.hasPrefix("/")) && !(matchStr.hasSuffix(".png") || matchStr.hasSuffix(".jpg") || matchStr.hasSuffix("/")) && matchStr != url {if matchStr.hasPrefix("/") {matchStr = url+matchStr}
pageUrls.insert(matchStr)} let lineset = pageUrls.sorted().joined(separator: ",")
do {try lineset.write(toFile: "\(domain).links", atomically: true, encoding: usedEncoding)} catch {// failed to write file – bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding}
Ищем строку в тексте и сохраняем результат поиска в файл .search
// Search for one string in another.var result = myString.range(of: searchStr, options: NSString.CompareOptions.literalSearch, range: myString.startIndex..<myString.endIndex, locale: nil)
// See if string was found.if let range = result {
// Display range.let start = range.lowerBoundlet end = myString.index(start, offsetBy: 140)let mySubString = myString.substring(with: start..<end)
do {try mySubString.write(toFile: "\(domain).search", atomically: true, encoding: usedEncoding)} catch {
// failed to write file – bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding}
Добавляем немного обработки ошибок, запускаем сессию на получение данных из ссылки и зацикливаем программу для продолжения работы в терминале пока не будет прерывания
}} else {
print("failed to decode data")
}})
// Running URLSession
task.resume()
// Terminate execution with CTRL+C
RunLoop.main().run()
Простейший поисковый робот готов, теперь можно создавать поисковую базу и вебморду для запросов, получать прибыль с рекламы или вообще создавать свой интернет с блэкджеком и секретаршами :)