Python 从url列表下载图像(Scrapy每个url发送2个请求)
因此,我上周运行了一个爬虫程序,生成了一个CSV文件,其中列出了我的项目所需的所有图像URL。在将CSV读入python列表后,我不确定如何使用Scrapy通过管道简单地下载它们。我尝试了很多东西,最近我成功了,但它很难看,也不太正确。对于我列出的10个图像URL,Scrapy完成了20个请求,即使10个图像被正确存储。我可能是在做一些愚蠢的事情,因为我对Scrapy还比较陌生,但我已经阅读了Scrapy的大部分文档,以及谷歌搜索结果的一些尝试和错误 我只是希望Scrapy为每个URL发送一个请求并下载相应的图像。任何帮助都将不胜感激。我已经用头撞了三天了。我的代码: spider.pyPython 从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发送一个请
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