Поиск по блогу

вторник, 28 января 2014 г.

Формируем список URL для скачивания файлов CSV со счетчика

Выберем в качестве счетчика top.mail.ru Здесь есть великолепныя возможности: 1) Скачивать CSV файлы, 2) выбирать период (год, день, неделя, месяц),3) выбирать параметры пол, возраст...
Все параметры передаются в подстроке запроса URL. Таким образом, задавая разные параметры в строках URL, мы можем сформировать список файлов для скачивания. Здесь мы напишем функции для формирования списка URL на Python 2.7
In [1]:
from IPython.display import Image
Image(filename='C:\\Users\\kiss\\Pictures\\for_blogs\\topm.PNG')
Out[1]:
Выше показан пример графического интерфейса. Однако, мы будем формировать непосредственно строку URL. Начнем с параметров строки:
In []:
#### You have to edit this for every Spider  ######### 
     url='http://top.mail.ru/pages?id=85837&period=2&date=2013-12-17&pp=20&gender=0&agegroup=0&filter_type=0&filter=catalogue%2Fnissan'
А вот строки URL для скачивания в форматах .html .csv .xls
http://top.mail.ru/pages.html?id=85837&period=2&date=2013-12-17&sf=0&pp=20&filter_type=0&filter=catalogue/nissan&gender=0&agegroup=0&    
http://top.mail.ru/pages.csv?id=85837&period=2&date=2013-12-17&sf=0&pp=20&filter_type=0&filter=catalogue/nissan&gender=0&agegroup=0&
http://top.mail.ru/pages.xls?id=85837&period=2&date=2013-12-17&sf=0&pp=20&filter_type=0&filter=catalogue/nissan&gender=0&agegroup=0&
In []:
# Основной адрес
http://top.mail.ru/referers.csv
# id счетчика
id=85837
# Период сбора данных (0-день, 1-неделя, 2-месяц)
period=2
# Дата (число не влияет, если период - месяц) 
date=2013-12-17
# Формат выгружаемого файла (0-csv,1-,2-,
sf=0
# Количество страниц в таблице (10,20,50,100,200)
pp=20
# Тип фильтра (не ясен)
filter_type=0
# Строка фильтра (возможны ли подстановки?)
filter=catalogue/nissan
# Пол (0-all,1-male,2-female)
gender=1
# Возрастная группа (смотри ссловарь ниже)
agegroup=0
#

Зададим возможные параметры строки URL с помощью словарей.

In []:
period={"0":"day", "1":"week","2":"month"}
In []:
# Define Dictionaries
    agegd = {"0":"Все", "1":"до 12","2":"12-18","3":"19-24","4":"25-30","5":"31-35","6":"36-40","7":"41-45","8":"46-50","9":"старше 50"} 
    genderd = {"0":"All", "1":"Male","2":"Female"} 
In []:
# Этот длинный словарь нужен, поскольку нужны точные обозначения для названий фирм. 
autod = {"mercedes-benz":"Mercedes", "toyota":"Toyota","volkswagen":"VW"}   

Параметры даты

In []:
# Чтобы загрузить все месяцы, нужен цикл от 1 до 12
2013-12-17
Поскольку вариантов перебора параметров может быть много, как, впрочем, и вариантов строк... Сначала конкретизируем задачку - выберем примерный URL. Он нам определит шаблон запроса. В этом шаблоне будем менять некоторые параметры. Возможные значения параметров зададим в кортежах, имена которых будут начинаться с "all_"
После этого можно будет распарсить примерный URL в список, а потом в итераторах менять выбранные элементы списка и формировать из них новые URL. Это проще, чем формировать строки URL самим. Для этого есть библиотека furl Примеры и описание из репозитория библиотеки на GitHub
In [7]:
# It parse URL into dictionary
from furl import furl #url parser
In [3]:
#def parametersURL
    #### You have to select this for every Spider  #########  
sample_url='http://top.mail.ru/referers.csv?id=85837&period=2&date=&sf=0&pp=20&filter_type=0&filter=nissan&gender=1&agegroup=0&'
    # assign tulips with parts of URLs  
all_auto=('mercedes-benz',)#,'nissan','toyota','volkswagen')#
all_gender=('1','2')#There is not comma between '1''2'
all_age=('4',) # don`t forget coma if there is single ctring in tulip
Хорошо бы иметь поблизости кортежи со всеми возможными параметрами...
А вот три вложеных цикла, точнее, итератора, собирающие строки по заданым выше кортежам ... Итак, сначала создаем объект furl, потом задаем пустой список и добавляем в него URL, количество новых строк URL будет равно произведению всех вариантов параметров.
In [10]:
#### Warning: the number of URL = len( all_auto)*len( all_gender)*len( all_age)
f = furl(sample_url)
    # Выставляем счетчик и объявляем список  initial_urls 
    #  в него будем добавлять новые URL    
result_counter = 0 # couner for URL list
initial_urls=[] #URL list
for auto1 in all_auto:
             f.args['filter']=auto1
             for g in all_gender:
                f.args['gender']=g
                for age in all_age:
                   f.args['agegroup']=age
                   print  '"это в цикле f.url= %s  /n' % f.url
                   initial_urls.append(f.url)
initial_urls                   
"это в цикле f.url= http://top.mail.ru/referers.csv?id=85837&period=2&date=&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=1&agegroup=4  /n
"это в цикле f.url= http://top.mail.ru/referers.csv?id=85837&period=2&date=&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=2&agegroup=4  /n

Out[10]:
['http://top.mail.ru/referers.csv?id=85837&period=2&date=&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=1&agegroup=4',
 'http://top.mail.ru/referers.csv?id=85837&period=2&date=&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=2&agegroup=4']
Стоит ли разделить процесс формирование кортежей и циклы формирования строк? Теоретически - да. Но и тот и другой процесс зависят от шаблона строки sample_url. Пока не будем ломат голову, а сделаем более универсальный цикл по параметрам строки.
Можно еще добавить год и месяц... Мы начали перебирать марки фирм, может быть предусмотреть вариант с перебором месяцев... и недель?

Цикл Фильтр(фирма)-год-месяц-пол-возраст

Сачала добавим кортежи параметров. Здесь для all_day использован не кортеж, а список с автозаполнением. Полагаю все же, что надо использовать самые "тупые" кортежи (списки), чтобы не вспоминать, что такое "for x in range(30)"
In []:
# Define Dictionaries
#    agegd = {"0":"Все", "1":"до 12","2":"12-18","3":"19-24","4":"25-30","5":"31-35","6":"36-40","7":"41-45","8":"46-50","9":"старше 50"} 
#    genderd = {"0":"All", "1":"Male","2":"Female"} 
Все же, вот пример сокращения тупого кортежа..., чтобы сократить длинную строку фильтра пришлось использовать список
Кроме того, мы здесь использовали вставку "]#" для отсечения списка ... гордится здесь нечем... , но иметь в виду надо.
In [33]:
# tulip of filters or firms
all_auto=['mercedes-benz',]#,'nissan','toyota','volkswagen']
all_auto = ['catalogue/'+c for c in all_auto]
print all_auto
['catalogue/mercedes-benz']

Остальные параметры можно задавать вот так. В строке комментария список всех возможных значений, а в строчке под ним только часть. При этом мы можем, например выбрать месяцы не подряд...
In [23]:
#all_month=('1','2','3','4','5','6','7','8','9','10','11','12')
all_month=('1','2','3','4')
all_year=('2011','2012')#,'2013','2014')
Третья группа параметров - это пол и возраст. Здесь есть значение "0" - оба пола, или все возрасты. Соответственно, в комментариях два списка.
In []:
# all_gender=('0',)
all_gender=('1','2')#male, female or ('0') - all
#all_age=('0',) ('1','2','3','4','5','6','7','8','9')
all_age=('1','2','3','4')# all or items ... look in dictionary above
И наконец, ниже вариант, который я решил не использовать, или использовать только в крайних случаях.
In []:
all_day=[(x) for x in range(30)] # attention, this is a list, not tulip
In [17]:
all_year,  all_day
Out[17]:
(('2011', '2012', '2013', '2014'),
 [0,
  1,
  2,
  3,
  4,
  5,
  6,
  7,
  8,
  9,
  10,
  11,
  12,
  13,
  14,
  15,
  16,
  17,
  18,
  19,
  20,
  21,
  22,
  23,
  24,
  25,
  26,
  27,
  28,
  29])
In [18]:
sample_url='http://top.mail.ru/pages.csv?id=85837&period=2&date=2013-12-17&sf=0&pp=20&filter_type=0&filter=catalogue/nissan&gender=0&agegroup=0&'
In [19]:
f = furl(sample_url)
In [24]:
initial_urls=[] #URL list
for auto1 in all_auto:
    f.args['filter']=auto1
    for yer in all_year:
        for mnth in all_month:
             f.args['date']=yer+'-'+mnth+'-17' #2013-12-17
             for g in all_gender:
                f.args['gender']=g
                for age in all_age:
                   f.args['agegroup']=age
                   #print  '"это в цикле f.url= %s  /n' % f.url
                   initial_urls.append(f.url)
initial_urls             
Out[24]:
['http://top.mail.ru/pages.csv?id=85837&period=2&date=2011-1-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=1&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2011-1-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=2&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2011-2-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=1&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2011-2-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=2&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2011-3-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=1&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2011-3-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=2&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2011-4-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=1&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2011-4-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=2&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2012-1-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=1&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2012-1-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=2&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2012-2-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=1&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2012-2-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=2&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2012-3-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=1&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2012-3-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=2&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2012-4-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=1&agegroup=4',
 'http://top.mail.ru/pages.csv?id=85837&period=2&date=2012-4-17&sf=0&pp=20&filter_type=0&filter=mercedes-benz&gender=2&agegroup=4']
Ну вот, мы получили итоговый список строк. Он нам и нужен. Далее мы сможем передать его в прорамму-парсер файлов, можем просто сохранить...
Здесь мы не рассматривали такие периоды, как дни и недели. Во-первых, пока нет необходимости, во-вторых, добавлять итератор ( к пяти имеющимся) не хочется, поскольку изменятся не только параметры даты, но и период... Потому не будем заранее усложнять код, а будем надеятся, что этот пост поможет нам через несколько месяцев быстро "вспомнить все", чтобы написать новые итераторы..., если понадобится...


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий