Подпишитесь на рассылку о самых интересных материалах в мире веб-разработки :)

Как увеличить производительность и количество процессов?


(Gtufc) #1
require 'open-uri'
require 'JSON'


def scrape_instagram_city_page(page)
	cityArray = []
	id = 0
	begin
		instagram_source = open(page).read
		content = JSON.parse(instagram_source.split("window._sharedData = ")[1].split(";</script>")[0])
		locationName = content['entry_data']['LocationsDirectoryPage'][0]['city_info']['name']
		nextpage = content['entry_data']['LocationsDirectoryPage'][0]['next_page'] 
		Dir.mkdir("#{locationName}")
		loop do
			id +=1
			instagram_source = open(page+"?page=#{id}").read
			content = JSON.parse(instagram_source.split("window._sharedData = ")[1].split(";</script>")[0])
			locationsList = content['entry_data']['LocationsDirectoryPage'][0]['location_list']
			locationsList.each do |hash|
				cityArray.push(hash['id'].to_i)
			end
			if nextpage == "null"
				break
			end
		Dir.chdir("#{locationName}") do
			fileName = "#{locationName}.txt"
			File.open(fileName, 'w') do |file|
				cityArray.each do |item|
					file << "https://www.instagram.com/explore/locations/#{item}/\n"
				end
			end
		end
		end
	rescue Exception => e
		return nil
	end
end
threads = []

["https://www.instagram.com/explore/locations/c267804/sangradouro-brazil/","https://www.instagram.com/explore/locations/c259302/maranguape-brazil/","https://www.instagram.com/explore/locations/c253583/frutal-brazil/","https://www.instagram.com/explore/locations/c273827/venancio-ayres-brazil/"].each do |page|
	threads << Thread.new do
		scrape_instagram_city_page "#{page}"
	end
end

threads.each(&:join)

И исключить ошибку

 warning: conflicting chdir during another chdir block

(Kvokka) #2

для начала не плохо бы понять, что хочется увеличивать- процессы или потоки. и для второго, ошибка закономерна.
Dir.chdir замените на относительный путь. если без деталей, то проблема тут.


(Gtufc) #3

Можете объяснить разницу(потоки, процессы), как лучше и что лучше использовать, а то я мало понимаю в этом? Как прописать относительный путь?
как организовать цикл if Dir.exist?, то переходим в каталог выполняем цикл и записываем File.open(filename, “a+”) else создаем новый каталог и в нем новый файл, пройдя цикл, т.е. проверка существует ли каталог, то дописать файл в нем иначе создать новый каталог с файлом?


(Kvokka) #4

про процессы и потоки есть 1001 статья, это гуглится изи

про цикл- можно так, FileUtils.mkdir_p и туда уже все закидывать. после этого каталог будет :wink:

про пути- есть модуль File в руби. и модуль Pathname, там все ответы


(Gtufc) #5

а про относительный путь, чтобы пофиксить пролему c chdir? это типа Dir["/#{locationName}/"].each do


(Kvokka) #6

::chdir нельзя использовать ибо оно меняет путь для проекта, а новый тред не может стартовать с другого пути, только с пути своего родителя.
процессу же наплевать.

у Dir есть ::[],так что работать то оно будет. и я не понимаю в чем вопрос-то?

берешь доки, запускаешь irb и повышаешь свой уровень образования


(Gtufc) #7

т.е. без создания папок тред будет стартовать с родительского пути и будет выполняться корректно, так как тогда организовать структуру новых папок с вложенными файлами
Если прописать Dir.pwd+#{locationName} чтобы изменить родительскую директорию, то тред будет стартовать с измененной родительской директории или как использовать? можете на примере показать?


(Kvokka) #8

вот тебе все папки в пути path_arr =Dir.pwd.split('/').reject(&:empty?) это если дубово
Pathname.new(Dir.pwd).parent.join('my_folder') так уже по-взрослому можно ползать по папкам

прочитай stllib про Pathname, File и FileUtils. тупо все методы. это быстрее, чем писать на форуме и больше пользы

locationName - так не пишут в руби, тут snake_case