问题:我的代码中缺少什么(请参阅下面的“当前代码”部分),这使我能够使用Scrapy从绝对路径和相对路径下载文件?我很感激帮助。我对所有这些组件如何协同工作以及如何获得所需行为感到迷茫。
背景:我使用了对Scrapy文档的粗略组合,在GitHub上找到可比较的示例,并在StackOverflow中搜索答案,但我无法让Scrapy文件管道工作在我希望它的方式。我正在寻找具有大量文件(主要是PDF和JPG)的相当基本的目标网站,这些文件在 a href
或 {{1}下作为绝对或相对路径链接选择器。选择器。我想下载所有这些文件。我的理解是 response.follow 将遵循相对路径和绝对路径,但我不确定该函数是否总是会产生可以通过文件下载的路径管道。我想出了爬行的绝对路径和相对路径,我想通过提供给my earlier question的答案来解释。
遇到的问题:有两个主要问题。首先,我似乎无法让蜘蛛遵循绝对路径和相对路径。其次,我似乎无法获取文件管道来实际下载文件。这很可能是我无法理解四个.py文件如何协同工作的功能。如果有人可以提供一些基本的观察和指导,我相信我可以超越这个基本的进/出点并开始分层更复杂的功能。
当前代码:以下是myspider.py,items.py,pipelines.py和settings.py的相关内容。
myspider.py :注意, parse_items 功能不完整,但我不明白是什么该功能应包括。
img src
items.py
from scrapy import Spider
from ..items import MyspiderItem
# Using response.follow for different xpaths
class MySpider(Spider):
name='myspider'
allowed_domains=['example.com']
start_urls=['http://www.example.com/']
# Standard link extractor
def parse_all(self, response):
# follow <a href> selector
for href in response.xpath('//a/@href'):
yield response.follow(href, self.parse_items)
# follow <img src> selector
for img in response.xpath('//img/@src'):
yield response.follow(img, self.parse_items)
# This is where I get lost
def parse_items(self, response):
# trying to define item for items pipeline
MyspiderItem.item['file_urls']=[]
settings.py :这是启用文件管道的相关部分。
import scrapy
class MyspiderItem(scrapy.Item):
file_urls=scrapy.Field()
files=scrapy.Field()
pipelines.py :
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'scrapy.pipelines.files.FilesPipeline': 1}
FILES_STORE = '/home/me/Scraping/myspider/Downloads'
答案 0 :(得分:0)
我认为你的蜘蛛myspider.py错了!
def parse_all()
可能名称错误,因为您未在蜘蛛中定义def start_requests()
并将其回拨给parse_all()
,scrapy默认只会理解parse()
!
我认为您应该将parse_all()
的名称更改为parse()
关于绝对/相对路径的问题。有一个技巧,你可以注意到网站的资产路径。如果您的链接包含该路径(可能是http://domain/...
的形式),则它应该是绝对链接。使用相对路径,您可以手动将资产路径附加到它们并处理下载!
检测链接是否可以是要下载the file usually contain the extension, e.g. .pdf, .jpg ...