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

标签 python python-2.7 scrapy lxml

我是 Scrapy、Python 和面向对象编程的新手,所以如果我有任何不正确的术语或在任何方面不清楚,我深表歉意。

我正在尝试编写一个蜘蛛程序,当它从响应中抓取项目时,还会创建响应的修改版本以保存到文件中。例如,我正在尝试更改“src”链接以指向本地保存的抓取文件。

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

我在下面添加了一些代码来说明我的观点。一切都发生在蜘蛛解析函数中。

def 解析( self ,响应):

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

谢谢。

最佳答案

Currently, I'm scraping data using Scrapy's selectors and modifying the response using lxml. However, I want to use Scrapy's methods to do the modifications instead of lxml as using both Scrapy selectors and lxml means essentially doubling code to locate the same elements in a response.

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

如果你真的想避免重复的感觉,你可以只使用 lxml,但我强烈建议你不要这样做。

关于python - Scrapy:修改响应中的元素和字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31502522/

相关文章:

python reversed(list) 和 list.sort(reverse=True) 的区别

python - 集合.计数器加法错误与计数器总和的计数器

python - 使用 itertools combonations_with_replacement 时缺少序列

python - 根据 ModelChoiceField 获取 ModelMultipleChoiceField 字段的查询集

linux - 如何在 pyqt4 的 textEdit 中显示 os.system()

python - 如何在 python 中绘制 3D 数据的核密度估计 (KDE) 和零交叉?

lxml - 如何在 Ubuntu 10.10 上为 Python 2.7 安装模块?

python - 在使用 Scrapy 进行身份验证的同时抓取 LinkedIn

python - 无法导入 Scrapy 的设置模块或其 scrapy.cfg

python - 如何从 scrapy 运行中获取统计信息?