Python 从url列表下载图像(Scrapy每个url发送2个请求)

Python 从url列表下载图像(Scrapy每个url发送2个请求),python,scrapy,imagedownload,crawlera,Python,Scrapy,Imagedownload,Crawlera,因此,我上周运行了一个爬虫程序,生成了一个CSV文件,其中列出了我的项目所需的所有图像URL。在将CSV读入python列表后,我不确定如何使用Scrapy通过管道简单地下载它们。我尝试了很多东西,最近我成功了,但它很难看,也不太正确。对于我列出的10个图像URL,Scrapy完成了20个请求,即使10个图像被正确存储。我可能是在做一些愚蠢的事情,因为我对Scrapy还比较陌生,但我已经阅读了Scrapy的大部分文档,以及谷歌搜索结果的一些尝试和错误 我只是希望Scrapy为每个URL发送一个请

因此,我上周运行了一个爬虫程序,生成了一个CSV文件,其中列出了我的项目所需的所有图像URL。在将CSV读入python列表后,我不确定如何使用Scrapy通过管道简单地下载它们。我尝试了很多东西,最近我成功了,但它很难看,也不太正确。对于我列出的10个图像URL,Scrapy完成了20个请求,即使10个图像被正确存储。我可能是在做一些愚蠢的事情,因为我对Scrapy还比较陌生,但我已经阅读了Scrapy的大部分文档,以及谷歌搜索结果的一些尝试和错误

我只是希望Scrapy为每个URL发送一个请求并下载相应的图像。任何帮助都将不胜感激。我已经用头撞了三天了。我的代码:

spider.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
如果您想查看其他文件,我可以编辑此文件以添加它们。我只是想这就是问题的根源,因为它在技术上是可行的。再次感谢,感谢您的帮助或重定向。

感谢,我发现这一点正在改变

start_urls = urls 

start\u url=[']
修复了我的请求数问题!谢谢。

另一种方法

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

您在
开始URL
中有什么内容?若URL指向图像,那个么它可能首先从服务器获取,因为你们把它们放在
start\uURL
中,它将它们作为页面处理。之后,它使用管道将其作为图像下载。坦白地说,我不会用
Scrapy
来做这件事,但是
requests
或者
urllib.request
是的,我已经成功地使用了requests,但是它对于我要处理的URL数量来说太慢了,即使是在线程化之后。所以我想我可以学习Asyncio并使用它,或者使用Scrapy,它与我的代理管理器Crawlera集成得非常好。Async的问题是我读到它不能与https代理一起工作。但我还没有深入研究。无论如何,在start_URL中,它是一个直接的.jpg URL列表(https..website…/blahblah.jpg),我想问题是,有没有办法不包括start_URL?否则yea Scrapy不适合这样做,我只会在
start\u url
中添加一个url(即到主页
https..website…/
),然后您已经在
项['image\u url']=url
中添加了所有图像。我现在就去试试。如果这能奏效,我会很兴奋,但也会对自己生气。我会让你知道的。这无疑解决了请求数量问题。(掌心)。非常感谢你的帮助,先生。我将开始大规模测试。
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