scrapy - 如何在抓取文件类型网站时跳过父目录?
问题描述
在浏览使用目录存储文件的基本文件夹系统网站时,
yield scrapy.Request(url1, callback=self.parse)
跟踪链接并抓取已爬取链接的所有内容,但我通常会遇到爬虫通过根目录链接传递的情况,它会获取具有不同 url 的所有相同文件,因为根目录介于两者之间。
http://example.com/root/sub/file
http://example.com/root/sub/../sub/file
任何帮助,将不胜感激。
这是代码示例的片段
class fileSpider(Spider):
name = 'filespider'
def __init__(self, filename=None):
if filename:
with open(filename, 'r') as f:
self.start_urls = [url.strip() for url in f.readlines()]
def parse(self, response):
item = Item()
for url in response.xpath('//a/@href').extract():
url1 = response.url + url
if(url1[-4::] in videoext):
item['name'] = url
item['url'] = url1
item['depth'] = response.meta["depth"]
yield item
elif(url1[-1]=='/'):
yield scrapy.Request(url1, callback=self.parse)
pass
解决方案
您可以使用os.path.normpath
规范化所有路径,因此您不会得到重复:
import os
import urlparse
...
def parse(self, response):
item = Item()
for url in response.xpath('//a/@href').extract():
url1 = response.url + url
# =======================
url_parts = list(urlparse.urlparse(url1))
url_parts[2] = os.path.normpath(url_parts[2])
url1 = urlparse.urlunparse(url_parts)
# =======================
if(url1[-4::] in videoext):
item['name'] = url
item['url'] = url1
item['depth'] = response.meta["depth"]
yield item
elif(url1[-1]=='/'):
yield scrapy.Request(url1, callback=self.parse)
pass
推荐阅读
- bash - 如何在os x中将日期的字符串格式转换为毫秒?
- react-admin - SimpleRestProvider 空资源
- python - Pandas 中序列的相似性匹配
- javascript - 如何使用 JavaScript 将一系列 .u3d 模型嵌入 PDF?
- python - 如何为draw.text中的文本分配不同的颜色
- react-native - 我应该怎么做才能在 React Native Expo 中创建 iOS 构建?
- javascript - 即使在卸载并重新安装后,身份验证状态仍然存在于 react-native(iOS) 中!使用 Firebase 身份验证
- node.js - AWS Cognito 组管理限制
- android - Android Studio 在文件中搜索不起作用?
- go - 导入 proto 文件并编译