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

суббота, 2 августа 2014 г.

Добавим к пауку CSV модули для формирования start_urls (На примере topmailru)

Здесь копии двух файлов из паука GitMyScrapycsv2 (компьютер W8). Заданы кортежи для BASE_URL .csv topmailru
Проба кода grab и furl для задачи "Процессинг csv таблиц" Здесь код формирования словаря для start_urls и решение вопросов кодировки кириллицы

Вот вопросы, которые возникли до того, как я написал скрипт

В том первом спайдере я запихнул весь код для формирования списка начальных URL сразу в класс Spider_mail_pages_1. Теперь я знаю про модули и ...еще кое-что, потому попробую разместить модули (или модуль) в отдельной папке проекта.
В модуле сначала зададим константы (списки или словари) ...Сколько их вообще может быть? Надо предусмотреть разные варианты списков и импортировать уже готовые варианты по мере необходимости.
Как их будем обозначать? Например, пол 1) - все 2) - м,ж
Из этих списков (или словарей?) будем формировать наборы. Напрмер, набор: год, пол, марка, или набор2: год, пол, возраст... (сколько всего параметров ?)
Потом сформируем метод для того, чтобы из наборов создавать списки со строками URL. Например, (пол)(месяц)(марка)= 2123= 72 строк URL (24 для каждой марки. Очевидно, что так мы легко можем задавать списки в десятки и сотни строк. Каждый список в отдельный файл?
Каждый список в отдельный файл, например, скачал (набор3: пол, возраст, фирма) за год, очевидно надо будет этот набор сохранить, чтобы скачать тот же набор параметров для другой фирмы, или за другой год ...
А как хранить? Очевидно, что для каждой конфигурации нужно создавать отдельную папку. В нее помещать подпапки со списками насальных URL... Надо додумать здесь же
Очевидно, что для скачаных данных нужны отдельные (от кода) файлохранилища. Поначалу - просто отдельные папки... Можно в них копировать списки URL ... просто копировать модули, в которые мы записали эти списки? В каждую папку вкладывать файл .rst описания структуры проекта?
Над этими вопросами я уже думал (здесь есть посты проекты CSV), потому теперь надо просто попробовать... а уж потом конкретизировать правила

Все вопросы выше от безграмотности

Неделя прошла под флагом ликвидации безграмотности. Я даже разбил файл с книгой Лутца на части по 100-200 страниц, дабы читать легче было... и грузить мегабайты в старенький маломощный "планшет". После внимательного прочтения глав 17 - 30 о модулях и классах в голове прояснилось, и я стал (наконец-то) понимать чужой код без напряжения.
Вопросы возникали детские, но фундаментальные, вот например:

Можно ли присваивать кортежи, как обычные переменные?

In [1]:
t1=('a1','b1','c1',)
In [2]:
t2=()
In [3]:
t2=t1
t2
Out[3]:
('a1', 'b1', 'c1')

После этого я написал шедевр в нового паука два файла для формирования списка unitial_urls (файл URL_parametrs.py)

In [1]:
!dir C:\Users\kiss\Documents\GitMyScrapy\scrapy_csv_2\scrapy_csv_2\initial_urls
 ’®¬ ў гбва®©б⢥ C ­Ґ Ё¬ҐҐв ¬ҐвЄЁ.
 ‘ҐаЁ©­л© ­®¬Ґа ⮬ : 6017-2A0B

 ‘®¤Ґа¦Ё¬®Ґ Ї ЇЄЁ C:\Users\kiss\Documents\GitMyScrapy\scrapy_csv_2\scrapy_csv_2\initial_urls

31.07.2014  13:54    <DIR>          .
31.07.2014  13:54    <DIR>          ..
30.07.2014  17:24             1я732 url_mailru.py
31.07.2014  13:54             1я034 url_mailru.pyc
02.08.2014  17:27             1я724 URL_parametrs.py
29.07.2014  15:06             1я940 URL_parametrs.rst
09.12.2013  15:38                 0 __init__.py
30.07.2014  17:16               124 __init__.pyc
               6 д ©«®ў          6я554 Ў ©в
               2 Ї Ї®Є  394я460я471я296 Ў ©в бў®Ў®¤­®

Сначала мы формируем кортежи из возможных значений в базовой строке (BASE_URL), а потом скрипт перебирает все возможные сочетания из строк кортежей и формирует список всех первоначальных URL
In [2]:
%load "C:\\Users\\kiss\\Documents\\GitMyScrapy\\scrapy_csv_2\\scrapy_csv_2\\initial_urls\\url_mailru.py"
In []:
#### You have to edit this for every Spider  #########  
    # service   http://top.mail.ru/referers?id=85837&period=0&date=&pp=20&gender=0&agegroup=0&filter_type=0&filter=nissan#sids=&percent=0&gtype=line
 # The real CSV file from this service may be without 'date'
BASE_URL="http://top.mail.ru/referers.csv?id=85837&period=2&date=2014-06-30&sf=0&pp=200&filter_type=0&filter=nissan&gender=0&agegroup=0&"  
 # Any number of items in tulip 
DATE = ('date=2014-01-30', 'date=2014-02-30', 'date=2014-03-30', 'date=2014-04-30', 'date=2014-05-30', 'date=2014-06-30', 'date=2014-07-30', 'date=2014-08-30', 'date=2014-09-30', 'date=2014-10-30', 'date=2014-11-30', 'date=2014-12-30',) # "-30" (the day value) does not work for week or month period
FILTER = ('mercedes-benz',) # I decided to use three variants to filter by firm name. Every item of FILTER can be more complex...
 
 # You have to select from two variants of tulip- all, or many items
AGEGROUP = ('0',) #('1','2','3','4','5','6','7','8','9',) 
 #{"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"} 
GENDER = ('0',) #('1','2',) #{"0":"All", "1":"Male","2":"Female"} 
    
 # One item in tulip only !!!
PERIOD = ('2',) #{"0":"День", "1":"Неделя","2":"Месяц"}
FILTER_TYPE = ('0',) #{"0":"Только", "1":"Кроме"} # "toyota" only or except "toyota"
PP = ('200',) #["10","20","50","100","200"] # Number of rows in output file
 # If you want to load more then 200 rows add items to this tulip  
SF =  ('0',) #{"0":"1-st page", "200":"2-nd page","400":"3-st page", ...}  # sum of rows on previous pages. This is example for pp=200
 
В URL_parametrs.py мы сначала загружаем модуль с кортежами, а потом запускаем вложенные циклы для всех кортежей. Таким образом, вся настройка списка происходит в файле url_mailru.py
Для некоторых кортежей есть два взаимоисключающих варианта настройки, например пол - "0"("все") или пол "1","2"...
In [3]:
%load "C:\\Users\\kiss\\Documents\\GitMyScrapy\\scrapy_csv_2\\scrapy_csv_2\\initial_urls\\URL_parametrs.py"
In []:
from furl import furl #url parser 
from scrapy_csv_2.initial_urls.url_mailru import *

# assign tulips with parts of URLs  

"""       
       We use furl library opportunities to select and reassign named URL.args  
       New tulips with values for args we take from imported module like this:
       
       from scrapy_csv_2.initial_urls.url_mailru import * 
       
       New values are inserted to args of url like this string:
       
       BASE_URL="http://top.mail.ru/referers.csv?
       id=85837&period=2&date=2014-06-30&sf=0&pp=200
       &filter_type=0&filter=nissan&gender=0&agegroup=0&"
       """
initial_urls=[]
def listtopmail():
   i_urls=[]
   f = furl(BASE_URL)
   #self.result_counter = 0 # couner for URL list     
   for i1 in AGEGROUP:
       f.args['agegroup']=i1
       for i2 in GENDER:
           f.args['gender']=i2
           for i3 in FILTER:
               f.args['filter']=i3
               for i4 in FILTER_TYPE:
                   f.args['filter_type']=i4
                   for i5 in PP:
                       f.args['pp']=i5
                       for i6 in SF:
                           f.args['sf']=i6
                           for i7 in DATE:
                               f.args['date']=i7                           
                               for i8 in PERIOD:
                                   f.args['period']=i8
                                   #print  '"это в цикле f.url= %s  /n' % f.url
                                   i_urls.append(f.url)
                                           
   return  i_urls                       
#
if __name__ == '__main__':
    initial_urls=makelist()

Простое лучше, чем сложное... Simple is better than complex

In [6]:
import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

In []:



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

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

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