使用scrapy下载图片时遇到问题
Trouble downloading images using scrapy
我在 python scrapy 中编写了一个脚本,用于从网站下载一些图片。当我 运行 我的脚本时,我可以在控制台中看到 link 图像(所有图像都是 .jpg
格式)。但是,当我打开下载完成后应该保存图像的文件夹时,我什么也得不到。我哪里出错了?
这是我的蜘蛛(我来自 sublime 文本编辑器 运行ning):
import scrapy
from scrapy.crawler import CrawlerProcess
class YifyTorrentSpider(scrapy.Spider):
name = "yifytorrent"
start_urls= ['https://www.yify-torrent.org/search/1080p/']
def parse(self, response):
for q in response.css("article.img-item .poster-thumb"):
image = response.urljoin(q.css("::attr(src)").extract_first())
yield {'':image}
c = CrawlerProcess({
'USER_AGENT': 'Mozilla/5.0',
})
c.crawl(YifyTorrentSpider)
c.start()
这是我在 settings.py
中为要保存的图像定义的:
ITEM_PIPELINES = {
'scrapy.pipelines.images.ImagesPipeline': 1,
}
IMAGES_STORE = "/Desktop/torrentspider/torrentspider/spiders/Images"
为了让事情更清楚:
- 我希望保存图像的文件夹名为
Images
,我已将其放置在项目 torrentspider
.[=35 下的 spider
文件夹中=]
Images
文件夹的实际地址是 C:\Users\WCS\Desktop\torrentspider\torrentspider\spiders
。
这与在 items.py
文件的帮助下 运行 成功地执行脚本无关。因此,使用 items.py
文件进行下载的任何解决方案都不是我想要的。
扫描上面的代码,首先让我印象深刻的是 IMAGES_STORE
的路径。 /
意味着你要去你机器的绝对根路径,所以你要么把绝对路径放在你想保存的地方,要么只做一个相对路径从你所在的地方 运行 你的爬虫
我在 linux 机器上,所以我的绝对路径类似于 IMAGES_STORE = /home/pk/myProjects/scraper/images
或
IMAGES_STORE = 'images'
此外,最重要的是,如果您使用的是默认管道,则保存提取图像的变量(extract_first()
所在的位置)必须字面意思是 image_urls
。
您还遗漏了几个步骤。在您的蜘蛛中,添加以下内容:
class ImgData(Item):
image_urls=scrapy.Field()
images=scrapy.Field()
在yield
这一步,修改为:
yield ImgData(image_urls=response.urljoin(q.css("::attr(src)").extract_first()))
您生成的项目不符合 Scrapy 的文档。正如他们 media pipeline documentation 中所详述的,该项目应该有一个名为 image_urls
的字段。您应该将您的解析方法更改为与此类似的方法。
def parse(self, response):
images = []
for q in response.css("article.img-item .poster-thumb"):
image = response.urljoin(q.css("::attr(src)").extract_first())
images.append(image)
yield {'image_urls': images}
我刚刚测试了这个并且它有效。此外,正如 Pruthvi Kumar 所评论的那样,IMAGES_STORE 应该就像
IMAGES_STORE = 'Images'
我在 python scrapy 中编写了一个脚本,用于从网站下载一些图片。当我 运行 我的脚本时,我可以在控制台中看到 link 图像(所有图像都是 .jpg
格式)。但是,当我打开下载完成后应该保存图像的文件夹时,我什么也得不到。我哪里出错了?
这是我的蜘蛛(我来自 sublime 文本编辑器 运行ning):
import scrapy
from scrapy.crawler import CrawlerProcess
class YifyTorrentSpider(scrapy.Spider):
name = "yifytorrent"
start_urls= ['https://www.yify-torrent.org/search/1080p/']
def parse(self, response):
for q in response.css("article.img-item .poster-thumb"):
image = response.urljoin(q.css("::attr(src)").extract_first())
yield {'':image}
c = CrawlerProcess({
'USER_AGENT': 'Mozilla/5.0',
})
c.crawl(YifyTorrentSpider)
c.start()
这是我在 settings.py
中为要保存的图像定义的:
ITEM_PIPELINES = {
'scrapy.pipelines.images.ImagesPipeline': 1,
}
IMAGES_STORE = "/Desktop/torrentspider/torrentspider/spiders/Images"
为了让事情更清楚:
- 我希望保存图像的文件夹名为
Images
,我已将其放置在项目torrentspider
.[=35 下的spider
文件夹中=] Images
文件夹的实际地址是C:\Users\WCS\Desktop\torrentspider\torrentspider\spiders
。
这与在 items.py
文件的帮助下 运行 成功地执行脚本无关。因此,使用 items.py
文件进行下载的任何解决方案都不是我想要的。
扫描上面的代码,首先让我印象深刻的是 IMAGES_STORE
的路径。 /
意味着你要去你机器的绝对根路径,所以你要么把绝对路径放在你想保存的地方,要么只做一个相对路径从你所在的地方 运行 你的爬虫
我在 linux 机器上,所以我的绝对路径类似于 IMAGES_STORE = /home/pk/myProjects/scraper/images
或
IMAGES_STORE = 'images'
此外,最重要的是,如果您使用的是默认管道,则保存提取图像的变量(extract_first()
所在的位置)必须字面意思是 image_urls
。
您还遗漏了几个步骤。在您的蜘蛛中,添加以下内容:
class ImgData(Item):
image_urls=scrapy.Field()
images=scrapy.Field()
在yield
这一步,修改为:
yield ImgData(image_urls=response.urljoin(q.css("::attr(src)").extract_first()))
您生成的项目不符合 Scrapy 的文档。正如他们 media pipeline documentation 中所详述的,该项目应该有一个名为 image_urls
的字段。您应该将您的解析方法更改为与此类似的方法。
def parse(self, response):
images = []
for q in response.css("article.img-item .poster-thumb"):
image = response.urljoin(q.css("::attr(src)").extract_first())
images.append(image)
yield {'image_urls': images}
我刚刚测试了这个并且它有效。此外,正如 Pruthvi Kumar 所评论的那样,IMAGES_STORE 应该就像
IMAGES_STORE = 'Images'