scraping mapillary sequences user script
This commit is contained in:
parent
233e483804
commit
2b4b809bf1
38
mapillary_sequences_userscript/images_par_username.py
Normal file
38
mapillary_sequences_userscript/images_par_username.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import requests, json
|
||||||
|
import argparse
|
||||||
|
from urllib.parse import quote
|
||||||
|
|
||||||
|
def parse_args(argv =None):
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument('--access_token', type=str, help='Your mapillary access token')
|
||||||
|
parser.add_argument('--username', type=str, help='Username to get the sequences id of')
|
||||||
|
parser.add_argument('--pictures', type=str, help='Limit of pictures to fetch')
|
||||||
|
|
||||||
|
global args
|
||||||
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parse_args()
|
||||||
|
|
||||||
|
if args.access_token == None:
|
||||||
|
print('please provide the access_token')
|
||||||
|
exit()
|
||||||
|
|
||||||
|
mly_key = args.access_token
|
||||||
|
creator_username = args.username
|
||||||
|
max_img= args.pictures
|
||||||
|
|
||||||
|
url = f'https://graph.mapillary.com/images?access_token={mly_key}&creator_username={creator_username}&limit={max_img}&fields=id,sequence'
|
||||||
|
|
||||||
|
response = requests.get(url)
|
||||||
|
|
||||||
|
if response.status_code == 200:
|
||||||
|
json = response.json()
|
||||||
|
|
||||||
|
# tri des séquences uniques
|
||||||
|
sequences_ids = [obj['sequence'] for obj in json['data']]
|
||||||
|
unique_ids = list(set(sequences_ids))
|
||||||
|
print(unique_ids)
|
||||||
|
else:
|
||||||
|
print(response)
|
66
mapillary_sequences_userscript/index.js
Normal file
66
mapillary_sequences_userscript/index.js
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
// script à lancer dans le navigateur pour récupérer toutes les séquences d'un compte
|
||||||
|
// pour que cela fonctionne il faut aller sur la page d'un utilisateur, https://www.mapillary.com/app/user/tykayn
|
||||||
|
// puis scroller pour voir toutes les séquences
|
||||||
|
// et lancer ce script dans la console js pour avoir à la fin un tableau de toutes les séquences.
|
||||||
|
|
||||||
|
// ouvrir le drawer de séquene key
|
||||||
|
function toggle_advanced_info () {
|
||||||
|
let _dots = document.querySelector('.three-dots')
|
||||||
|
_dots.click
|
||||||
|
}
|
||||||
|
|
||||||
|
sequences_list = []
|
||||||
|
|
||||||
|
function filter_sequences_id () {
|
||||||
|
|
||||||
|
filteredArray = sequences_list.filter(function (item, pos) {
|
||||||
|
return sequences_list.indexOf(item) == pos
|
||||||
|
})
|
||||||
|
console.log('sequences_list', filteredArray)
|
||||||
|
}
|
||||||
|
|
||||||
|
function click_block_number (num) {
|
||||||
|
console.log('click block num', num)
|
||||||
|
let sequence_block = document.querySelector('drawer-sequence-item.ng-star-inserted:nth-child(' + num + ') > a:nth-child(1) > div:nth-child(1) > div:nth-child(1) > i:nth-child(2)')
|
||||||
|
if (sequence_block) {
|
||||||
|
sequence_block.click()
|
||||||
|
} else {
|
||||||
|
console.info('pas de block')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_sequence_id () {
|
||||||
|
|
||||||
|
let id_sequence_container = document.querySelector('.content > div:nth-child(1) > div:nth-child(2) > app-copy-field:nth-child(2) > div:nth-child(1) > div:nth-child(1)')
|
||||||
|
id = id_sequence_container.innerText
|
||||||
|
sequences_list.push(id)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function iterate_blocks (initial_block = 4, max_block = 6, waiting = 300) {
|
||||||
|
|
||||||
|
// compter les blocs
|
||||||
|
let listing_blocs = document.querySelectorAll('drawer-sequence-item')
|
||||||
|
console.log('listing_blocs', listing_blocs.length)
|
||||||
|
|
||||||
|
// sequences_list = []
|
||||||
|
let ii = 1 * initial_block
|
||||||
|
let jj = 1 * initial_block
|
||||||
|
|
||||||
|
listing_blocs.forEach((elem) => {
|
||||||
|
if (ii <= max_block) {
|
||||||
|
setTimeout(() => {
|
||||||
|
jj++
|
||||||
|
click_block_number(jj)
|
||||||
|
add_sequence_id()
|
||||||
|
}, ii * waiting)
|
||||||
|
ii++
|
||||||
|
}
|
||||||
|
})
|
||||||
|
filter_sequences_id()
|
||||||
|
}
|
||||||
|
|
||||||
|
// toggle_advanced_info()
|
||||||
|
// le premier bloc qui permet de cliquer sur une séquence est le 5e à partir de zéro
|
||||||
|
// on définit un max d'itérations à 20 pour tester, et 300 milisecondes entre chaque
|
||||||
|
iterate_blocks(20, 25, 300)
|
14
mapillary_sequences_userscript/readme.md
Normal file
14
mapillary_sequences_userscript/readme.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# export de séquences mapillary
|
||||||
|
|
||||||
|
script à lancer dans le navigateur pour récupérer toutes les séquences d'un compte
|
||||||
|
pour que cela fonctionne il faut aller sur la page d'un utilisateur, https://www.mapillary.com/app/user/tykayn
|
||||||
|
puis scroller pour voir toutes les séquences
|
||||||
|
et lancer ce script dans la console js en le copiant collant pour avoir à la fin un tableau de toutes les séquences.
|
||||||
|
|
||||||
|
Pour que ça fonctionne bien il faut que le popup d'info soit ouvert.
|
||||||
|
Vous pouvez le recopier avec un clic dans la console de votre navigateur.
|
||||||
|
|
||||||
|
|
||||||
|
J'utilise ensuite un script qui lit un fichier texte contenant un tableau python listant des strings d'identifiants de séquences pour générer un script bash qui lance une commande par séquence pour télécharger toutes les images de la séquence en renommant les fichiers et en ajoutant les infos exif: le mapillary_download de stefmani pour lancer le téléchargement de chaque séquence à la suite.
|
||||||
|
https://github.com/Stefal/mapillary_download
|
||||||
|
|
@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
import argparse
|
||||||
|
def parse_args(argv =None):
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
# parser.add_argument('--access_token', type=str, help='Your mapillary access token')
|
||||||
|
parser.add_argument('--username', type=str, help='Username to get the sequences id of')
|
||||||
|
|
||||||
|
global args
|
||||||
|
args = parser.parse_args(argv)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parse_args()
|
||||||
|
|
||||||
|
username=args.username
|
||||||
|
input_file = f"sequences_{username}.txt"
|
||||||
|
output_file = f"script_bash_get_sequences_for_user_{username}.sh"
|
||||||
|
|
||||||
|
access_token = "--access_token=\"mly_token_A_REMPLACERRRRRRRRRRRR\" "
|
||||||
|
format_string = "python download.py {} --sequence_id={}\n"
|
||||||
|
|
||||||
|
|
||||||
|
with open(output_file, "w") as output:
|
||||||
|
with open(input_file, "r") as input_handle:
|
||||||
|
content = input_handle.read()
|
||||||
|
sequences = eval(content)
|
||||||
|
for seq in sequences:
|
||||||
|
full_cmd = f"python download.py {access_token} --sequence_id={seq} --username={username}\n"
|
||||||
|
output.write(full_cmd)
|
||||||
|
|
||||||
|
print(f"Script Bash généré : {output_file}")
|
||||||
|
|
||||||
|
print(output_file)
|
Loading…
Reference in New Issue
Block a user