从相对路径构造绝对路径的非重复列表

2024-04-25 01:14:00 发布

您现在位置:Python中文网/ 问答频道 /正文

问题如何使用Scrapy从img src标记下的相对路径创建绝对路径的非重复列表?你知道吗

背景:我正在尝试使用Scrapy对站点进行爬网,拉取img src标记下的任何链接,将相对路径转换为绝对路径,然后以CSV或列表数据类型生成绝对路径。我计划将上述功能与实际下载文件相结合,使用Scrapy和并发抓取链接,但当我到达它时,我会越过这座桥。以下是关于假设目标站点的一些其他详细信息,以供参考:

  • 相对路径看起来像img src="/images/file1.jpg",其中images是一个目录(www.example.com/products/images),无法直接对文件路径进行爬网。你知道吗
  • 这些图像的相对路径不遵循任何逻辑命名约定(例如,file1.jpg、file2.jpg、file3.jpg)。你知道吗
  • 不同文件的图像类型不同,最常见的是PNG和JPG。你知道吗

遇到的问题:即使在彻底阅读了冗长的文档和大量过时的Stackoverflow问题(例如,this question)之后,我似乎也无法得到我想要的精确输出。我可以提取相关路径并重建它们,但是输出是关闭的。以下是我在当前代码中注意到的问题:

  • 在CSV输出中,有填充行和空行。我最好的猜测是,每一行代表的结果,刮一个特定的页面相对路径,这意味着一个空行是一个负的结果。

  • CSV中的每一个非空白行都包含一个由逗号分隔的url列表,而我只希望行中有一个单独的、不重复的值。用逗号分隔的列表填充一行似乎支持了我对引擎盖下发生的事情的怀疑。

当前代码:我使用'scrapy crawl relpathfinder-o在命令行中执行以下代码输出.csv-t csv'。你知道吗

from scrapy.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.item import Item, Field

class MyItem(Item):
    url=Field()

class MySpider(CrawlSpider):
    name='relpathfinder'
    allowed_domains=['example.com']
    start_urls=['https://www.example.com/']
    rules = (Rule(LinkExtractor(allow=()), callback='url_join', follow=True),)

    def url_join(self,response):
        item=MyItem()
        item['url']=[]
        relative_url=response.xpath('//img/@src').extract()
        for link in relative_url:
            item['url'].append(response.urljoin(link))
        yield item

谢谢你!你知道吗


Tags: 文件csv代码fromsrccomurl列表
2条回答

关于:

def url_join(self,response):
    item=MyItem()
    item['url']=[]
    relative_url=response.xpath('//img/@src').extract()
    for link in relative_url:
        item['url'] = response.urljoin(link)
        yield item

我将使用项目管道来处理重复的项目。你知道吗

# file: yourproject/pipelines.py
from scrapy.exceptions import DropItem

class DuplicatesPipeline(object):

    def __init__(self):
        self.url_seen = set()

    def process_item(self, item, spider):
        if item['url'] in self.url_seen:
            raise DropItem("Duplicate item found: %s" % item)
        else:
            self.url_seen.add(item['url'])
            return item

并将此管道添加到settings.py

# file: yourproject/settings.py
ITEM_PIPELINES = {
    'your_project.pipelines.DuplicatesPipeline': 300,
}

然后您只需要运行spider scrapy crawl relpathfinder -o items.csv,管道就会为您删除重复的项。所以在csv输出中不会看到任何重复。你知道吗

相关问题 更多 >