Как скрести все URL изображения и alt тег в нем с помощью scrapy

Моя цель - сканировать URL-адреса изображений и теги alt изображений с помощью scrapy . Я пробовал много комбинаций, но все еще не достиг этого.

Вот что я пробовал

  def parse_item(self, response):
    sel = Selector(response)
    item = imageItem()
    item['crawl_time'] = time.asctime( time.localtime(time.time()))
    item['crawl_date'] = time.asctime( time.localtime(time.strftime("%Y%m%d")))
    item['url'] = response.url
    for img in hxs.select('//img'):
     item['title'] = node.xpath("@alt").extract()
     item['iurl'] = node.xpath("@src").extract()
    if response.meta['depth'] == 1:
     exit
    return item

2 ответа

Решение

Ниже приведен код, с помощью которого я добился результата, но глубина по-прежнему 1

class MySpider(CrawlSpider):
name = 'imageaggr'
start_urls = ['http://www.dmoz.org/','http://timesofindia.indiatimes.com/','http://www.nytimes.com','http://www.washingtonpost.com/','http://www.jpost.com','http://www.rediff.com/']

rules = (
    # Extract links matching 'category.php' (but not matching 'subsection.php')
    # and follow links from them (since no callback means follow=True by default).

    Rule(SgmlLinkExtractor(allow=('', ), deny=('defghi\.txt')), callback='parse_item'),

    # Extract links matching 'item.php' and parse them with the spider's method parse_item
   # Rule(SgmlLinkExtractor(allow=('\.cms','\.html' )), deny=('parse_item\.html'))),


    #Rule(SgmlLinkExtractor(allow=('news', )), callback='parse_item'),
)

def parse_item(self, response):
 sel = Selector(response)
 images = sel.xpath('//img')
 image_count = len(images)
 count = 0
 while(count < image_count):
    item = imageItem()
    item['url'] = response.url
    title = sel.xpath('//img/@alt').extract()[count] or ''
    if title == '':
     break
    item['title'] = title
    iurl = sel.xpath('//img/@src').extract()[count] or ''
    item['iurl'] = iurl
    item['crawl_time'] = time.asctime( time.localtime(time.time()))
    crawl_date = time.strftime("%Y%m%d")
    item['crawl_date'] = crawl_date
    count = count + 1
    return item

Некоторые проблемы там:

  • У тебя уже есть sel селектор. Но вы используете HXS в цикле
  • в цикле, вы используете node вместо img
  • имеет больше смысла, что каждый цикл должен давать один элемент изображения

Это мой проверенный и рабочий код:

def parse_item(self, response):
    sel = Selector(response)
    images = sel.xpath('//img') 
    for img in images: 
        item = imageItem()        

        item['url'] = response.url
        title = img.xpath('./@alt').extract() or ''
        item_title = title[0] if title else ''
        item['title'] = item_title

        iurl = img.xpath('./@src').extract() or ''            
        item_iurl = iurl[0] if iurl else ''
        item['iurl'] = item_iurl
        yield item
Другие вопросы по тегам