1

因此,我上周运行了一个爬虫并生成了一个 CSV 文件,其中列出了我的项目所需的所有图像 URL。在将 CSV 读取到 python 列表后,我不确定如何使用 Scrapy 通过管道简单地下载它们。我尝试了很多东西,最近我让它工作了,但它很丑而且不太正确。对于我的 10 个图像 URL 列表,即使正确存储了 10 个图像,Scrapy 也会发出 20 个请求来完成抓取。我可能在做一些愚蠢的事情,因为我对 Scrapy 还很陌生,但是我已经阅读了 Scrapy 的大部分文档,并且对谷歌结果进行了很多试验和错误。

我只是想让 Scrapy 为每个 URL 发送一个请求并下载相应的图像。任何帮助,将不胜感激。我已经为此撞了3天。我的代码:

蜘蛛.py

import scrapy
import csv
import itertools
from ..items import ImgItem

urls=[]
with open('E:/Chris/imgUrls.csv') as csvDataFile:
    csvReader = csv.reader(csvDataFile)
    for elem in itertools.islice(csvReader, 0, 10):
        urls.append(elem[0])                #Just doing first 10 for testing
                                            #My Csv file is not the problem
                                            # ...1 url per row
class DwImgSpider(scrapy.Spider):
    name = 'dw-img'
    start_urls = urls

    def parse(self, response):
        item = ImgItem()
        img_urls = urls
        item['image_urls'] = img_urls
        return item

如果您想查看其他文件,我可以对其进行编辑以添加它们。我只是认为这就是问题所在,因为它在技术上确实有效。再次感谢,感谢任何帮助或重定向。

4

2 回答 2

1

感谢furas,我发现改变

start_urls = urls 

start_urls = ['<just one url, the main website>']

修复了我的请求数问题!谢谢弗拉斯。_

于 2020-06-28T02:40:03.953 回答
1

另一种方法。

import csv,os
import itertools
from simplified_scrapy import Spider, SimplifiedMain, utils
class ImageSpider(Spider):
  name = 'images'
  start_urls = []
  def __init__(self):
      with open('E:/Chris/imgUrls.csv') as csvDataFile:
          csvReader = csv.reader(csvDataFile)
          for elem in itertools.islice(csvReader, 0, 10):
              self.start_urls.append(elem[0])
      Spider.__init__(self,self.name) # Necessary
      if(not os.path.exists('images/')):
          os.mkdir('images/')
          
  def afterResponse(self, response, url, error=None, extra=None):
    try:
        utils.saveResponseAsFile(response,'images/','image')
    except Exception as err:
        print (err)
    return None 

SimplifiedMain.startThread(ImageSpider()) # Start download
于 2020-07-01T01:32:03.573 回答