Scrapy:修改响应中的元素和字段

时间:2015-07-19 14:56:08

标签: python python-2.7 scrapy lxml

我对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修改响应中的单个元素或字段?任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:0)

我和你想要实现的目标一样困惑,你试图从选择器中修改正确吗?

我知道反对溢出政策会在回复中查询更多内容,但确实有些东西需要每周更新

仅查看代码,您似乎正在尝试连接以编辑项目。

什么是被引用的生成器然后“编辑”什么是最终输出正确?如果是这样,那么发生的事情就是你不能隐式地连接列表和字符串。

enter image description here

在这种情况下你需要做的是剥离然后你加入并为每个人设置值...如果你或任何人有类似的东西,请提供任何可能相关的代码的完整示例...就像这样案例将是整个蜘蛛代码...和管道即使原始海报没有使用他应该如果他应该保存或我可以总是只使用写功能

答案 1 :(得分:0)

  

当前,我正在使用Scrapy的选择器抓取数据,并使用lxml修改响应。但是,我想使用Scrapy的方法而不是lxml进行修改,因为同时使用Scrapy选择器和lxml意味着实质上将代码加倍以在响应中定位相同的元素。

Parsel选择器(Scrapy在其下使用)用于提取信息,而不是编辑基础HTML。我相信您目前的方法是最好的方法。

如果您真的想避免重复感,则只能使用lxml,但我强烈建议您不要这样做。