问题:如何使用Scrapy从img src
标签下的相对路径创建绝对路径的非重复列表?
背景:我正在尝试使用Scrapy抓取网站,拉取img src
标记下的任何链接,将相对路径转换为绝对路径,然后生成CSV或列表数据类型的绝对路径。我计划将上述功能与使用Scrapy实际下载文件并同时抓取链接进行组合,但是当我到达时,我会越过那个桥。作为参考,以下是关于假设目标站点的一些其他详细信息:
img src="/images/file1.jpg"
,其中images是一个目录(www.example.com/products/images),无法直接抓取文件路径。遇到的问题:即使在彻底阅读了Scrapy文档并经历了大量相当陈旧的Stackoverflow问题[例如,this question]之后,我似乎无法获得我想要的精确输出。我可以拉相对路径并重建它们,但输出关闭。以下是我用当前代码注意到的问题:
当前代码:我使用'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
谢谢!
关于什么:
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
我会使用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输出中看不到任何重复。