Как собрать JPEG с помощью Scrapy - PullRequest
1 голос
/ 11 января 2020

Я хочу собрать фотографию идола с помощью Scrapy.

Домашняя страница сбора https://news.mynavi.jp/article/20191229-947707/.

Я написал паук ...

(save_gradol.py)

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

from gradol.items import GradolItem
class SaveGradolSpider(CrawlSpider):
    name = 'save_gradol'
    allowed_domains = ['news.mynavi.jp/']
    start_urls = ['https://news.mynavi.jp/article/20191229-947707/']


    rules = (
      Rule(LinkExtractor(allow=(), unique=True), callback="parse_page", follow=True),
    )


    def parse_page(self, response):
        #print("\n>>> Parse " + response.url + " <<<")
        item = GradolItem()
        item["image_urls"].append(start_urls.rsplit("/", 3)[0] + "/" + response.xpath("//a/@href").extract())
        yield item

Я также написал элемент ...

(items.py)


import scrapy
from scrapy.item import Item, Field

class GradolItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    #image_directory_name = scrapy.Field()
    image_urls = scrapy.Field()
    images = scrapy.Field()

Я также написал конвейеры ...

(pipelines.py)


import scrapy
from scrapy.pipelines.images import ImagesPipeline

class MyImagesPipeline(object):
    def process_item(self, item, spider):
        return item

Я также написал setteing ...

(settings.py)


ITEM_PIPELINES = {'gradol.pipelines.MyImagesPipeline': 1}
IMAGES_STORE = './savedImages'
MEDIA_ALLOW_REDIRECTS = True

Затем я попробовал пауку [sudo scrapy crawl save_gradol], но не сканировать и не собирать фотографии.

Пожалуйста, помогите мне решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Решения с упрощенной терапией.

import os,io,sys,re
from simplified_scrapy.core.utils import md5
from simplified_scrapy.spider import Spider, SimplifiedDoc
class ImageSpider(Spider):
  name = 'mynavi.jp'
  allowed_domains = ['news.mynavi.jp/']
  start_urls = ['https://news.mynavi.jp/article/20191229-947707/']
  # refresh_urls = True # For debug. If efresh_urls = True, start_urls will be crawled again.

  def __init__(self):
    Spider.__init__(self,self.name) #necessary
    if(not os.path.exists('images/')):
      os.mkdir('images/')

  def afterResponse(self, response, url, error=None):
    try:
      if sys.version_info.major == 2: maintype = response.headers.maintype
      else: maintype =response.info().get('Content-Type')
      # save image
      if(response.code==200 and maintype and maintype.find('image')>=0):
        name = 'images/'+md5(url)+'.jpg'
        file = io.open(name, "wb")
        file.write(response.read())
        file.close()
        return None
      else: # If it's not a image, leave it to the frame
        return Spider.afterResponse(self, response, url, error)
    except Exception as err:
      print (err)

  def extract(self,url,html,models,modelNames):
    doc = SimplifiedDoc(html)
    urls = re.compile(u'"url":"[^"]*"').findall(doc.html)
    if(urls):
      urls = [{'url':doc.absoluteUrl(url['url'],u[len('"url":"[^"]*"'):-1])} for u in urls]
      self.saveUrl(urls)

    urls = doc.listA(url=url['url'])
    if(urls):
      self.saveUrl(urls)

    return True

from simplified_scrapy.simplified_main import SimplifiedMain
SimplifiedMain.startThread(ImageSpider())

Примеры упрощенной терапии здесь

0 голосов
/ 12 января 2020

Вы можете сделать это намного проще:

import requests
from tqdm import tqdm

number_of_photos = 26

for i in tqdm(range(1, number_of_photos + 1)):
    image_url = 'https://news.mynavi.jp/article/20191229-947707/images/{:03}l.jpg'.format(i)
    try:
        response = requests.get(image_url)  
    except:
        pass    
    else:
        if response.status_code == 200:
            with open('{:02}.jpg'.format(i), 'wb') as f:
                f.write(response.content)

Наслаждайтесь.

...