• Перефокусировать оптическую мышь. Реально?

    ehles
    @ehles
    Лазерные мышки справляются со стеклянной поверхностью.
    Ответ написан
  • Scrapy: как осуществить генерацию раскрывающихся полей?

    ehles
    @ehles
    Видно, что при изменении полей формы страничка лезет по url: www.booktornado.com/DesktopModules/BookTornado/Ser... значит есть API к которому она стучится чтобы получить данные.
    Я бы поступил примерно так:
    1. Разобрался что отправляет страница и куда чтобы получить ISBN.
    2. Cделал этот запрос через scrapy и в ответе получил ISBN.
    3. Сделал запрос к www.booktornado.com/DesktopModules/BookTornado/Ser...
    с, например:
    ISBN:9780077967963
    couponApi:BT5aiKWKlJqDV2ywKZPA
    apiKey:BT5aiKWKlJqDV2ywKZPA
    4. Profit

    P.S. с ajax scrapy если и сможет работать то через дальнее место, проще самому разобраться откуда и как запрашиваются данные.
    Ответ написан
    Комментировать
  • Scrapy: Response, Request - как получить значение?

    ehles
    @ehles
    Делаем запрос примерно так:
    import json
    from scrapy.contrib.spiders import CrawlSpider
    
    class my_super_spider(CrawlSpider):
        start_urls = ["http://domain.com"]
        url = "http://domain.com/?postcode=123&sku=blablabla"
        def parse(self, response):
            # Тут можно распарсть response (ответ на запрос из start_urls) или просто нагенерить
            # новых запросов, или и то и другое.
            yield Request(url, callback=self.parse_my_url)
        def parse_my_url(self, response):
            # Если сайт отдает ответ в виде json то так:
            data_from_json = json.loads(response.body)
            # Если сайт отдает html то так:
            # xpath можно узнать в панели отладки хрома (правой кнопкой мышки на элементе), например:
            xpath_name = '//*[@id="global"]/div/table/tbody/tr/td[%(col)s]/table/tbody/tr/td/a/text()'
            hxs = HtmlXPathSelector(response)
            column = 100500
            data_from_html = hxs.select(xpath_name % {'col': column}).extract()
            
            # Далее "собираем" items и сохраняем в БД или ещё куда там у вас..


    по комментариям в коде должно стать всё понятно.

    P.S. как делать тут хорошо описано: doc.scrapy.org/en/latest/topics/spiders.html

    P.P.S. Эмулировать куки, со scrapy не надо, он всё сам делает (конечно, если надо, доступ к ним получить можно).
    Ответ написан
    Комментировать
  • Как реализовать выборку из таблиц mysql, связанных как один ко многим?

    ehles
    @ehles Автор вопроса
    Сделал как посоветовал @yamel:
    comment_params = {"comment__author":103}
    blog_records = models.BlogRecord.objects.filter(
         **comment_params
         ).annotate(Count('comment__blogrecord'))


    Всем спасибо!!!

    Да, вот результат, тестировал на небольшом запросе:
    было 50сек, стало 0.9 сек.

    P.S. с кол-вом записей немного наврал, их больше на порядок.)))
    P.P.S. попутно нашел ещё багу что тормозила выполнение запросов вкурив в то какие SQL запросы генерит django.
    Ответ написан
    Комментировать
  • Как решить проблему при парсинге сайтов с помощью фреймворка Scrapy?

    ehles
    @ehles
    Я бы сделал это примерно так:
    class my_spider(CrawlSpider):
        name = "fontanka"
        allowed_domains = ["fontanka.ru"]
        start_urls = ["http://www.fontanka.ru/fontanka/arc/news.html"]
        base_address = "http://www.fontanka.ru/"
    
        def parse(self, response):
            """
            Парсим стартовую страничку, 
            находим ссылки на другие странички        
            """
            for date in (date1, ....):
                # выбираем следующую дату
                site = self.base_address
                url = "%(site)s/%(date)s/news.html" % {
                    "site": site,
                    "date": date,
                }        
                request = Request(url, callback = self.parse_page)
                yield request
    
        def parse_page(self, response):
            """
            Парсим каждую загруженную страничку.
            """
            list_site = sel.xpath('//a[contains(@class, pattern)]/@href')
            for i in list_site:
                #извлекаем содержимое i
                #записываем в базу данных тут или в pipelines
                # http://doc.scrapy.org/en/latest/topics/item-pipeline.html


    P.S. Рассмотрите вариант записи в БД через item pipeline
    Ответ написан
    Комментировать