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

问题描述 投票:1回答:2

问题:如何使用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最常见。

遇到的问题:即使在彻底阅读了Scrapy文档并经历了大量相当陈旧的Stackoverflow问题[例如,this question]之后,我似乎无法获得我想要的精确输出。我可以拉相对路径并重建它们,但输出关闭。以下是我用当前代码注意到的问题:

  • 在CSV输出中,有填充的行和空行。我最好的猜测是每行代表相对路径抓取特定页面的结果,这意味着空行是否定结果。
  • CSV中的每个非空行都包含以逗号分隔的URL列表,而我只想在一行中使用单个非重复值。具有逗号分隔列表的行的填充似乎支持了我对引擎盖下发生的事情的怀疑。

当前代码:我使用'scrapy crawl relpathfinder -o output.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

谢谢!

python html python-3.x web-scraping scrapy
2个回答
0
投票

关于什么:

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

1
投票

我会使用Item Pipeline来处理重复的项目。

# 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,
}

然后你只需要运行你的蜘蛛scrapy crawl relpathfinder -o items.csv,管道将为你删除重复的项目。所以在csv输出中看不到任何重复。

© www.soinside.com 2019 - 2024. All rights reserved.