【发布时间】:2015-10-08 18:01:10
【问题描述】:
我对 Scrapy、Python 和面向对象编程还比较陌生,所以如果我有任何不正确的术语或有任何不清楚的地方,我深表歉意。
我正在尝试编写一个蜘蛛,当它从响应中抓取项目时,它还会创建响应的修改版本以保存到文件。例如,我正在尝试更改“src”链接以指向本地保存的抓取文件。
目前,我正在使用 Scrapy 的选择器抓取数据并使用 lxml 修改响应。但是,我想使用 Scrapy 的方法而不是 lxml 来进行修改,因为同时使用 Scrapy 选择器和 lxml 意味着将代码加倍以在响应中定位相同的元素。
我在下面添加了一些代码来说明我的观点。一切都发生在蜘蛛解析函数中。
def 解析(自我,响应):
# Scrape thumbnail URLs using Scrapy selectors
for post in response.css('.post'): # For each post
for thumb in post.css('.thumb'): # For each thumbnail
item = Item() # Create an image item
item['thumbnail_url'] = []
item['thumbnail_savepath'] = []
for x in thumb.xpath('img/@src').extract():
thumbnail_url = 'https:' + x
thumbnail_filename = re.search('.*/(.*)', thumbnail_url).group(1)
thumbnail_savepath = 'thumbnails/' + thumbnail_filename
item['thumbnail_url'] += [thumbnail_url]
item['thumbnail_savepath'] += [thumbnail_savepath]
# Make modified html using lxml
body_lxml = lxml.html.document_fromstring(response.body)
for thumbnail in body_lxml.xpath('//img'):
thumbnail_src = thumbnail.get('src') # Original link address
thumbnail_path = './thumbnails/' + basename(thumbnail_src) # New link address
thumbnail.set('src',image_path) # Setting new link address
如代码所示,它遍历图像以使用 Scrapy 选择器抓取项目,然后使用 lxml 进行第二次迭代以修改响应。我必须使用两种不同的方法来遍历相同的元素,这是我试图避免的。如果可能的话,我想在同一个 for 循环中进行抓取和修改。
我认为可以使用 response.request() 方法,但我很难从文档和在线搜索中了解如何使用它。是否有某种方法允许 Scrapy 修改响应中的单个元素或字段?任何帮助将不胜感激。
谢谢。
【问题讨论】:
-
请阅读scrapy pipelines 的文档并尝试更具体地回答您的问题。见How to Ask
-
嗨弗兰克。感谢您关注我的问题。我添加了一些示例代码,并试图使问题更加具体和清晰。一切都发生在主要的蜘蛛解析函数中(即在管道之前)。如果我仍然可以让您/其他人更清楚地了解问题,请告诉我。马库斯
-
@FrankMartin 我觉得这是一个遵循该页面上列出的所有准则的问题示例。它清晰、具体、正确标记、在语法和单词选择方面写得很好,并且来自第一次使用的用户。
-
@Borealid 恕我直言,最初的问题(请参阅编辑前的版本)不清楚和具体。但我没有否决/忽略它,而是给出了如何改进问题的建议(它通过编辑完成了)。我的评论绝不是粗鲁的,而是鼓励的。抱歉,不清楚。
标签: python python-2.7 scrapy lxml