Python 2.7 在10个图像之后,返回图像Url的Scrapy Base64

Python 2.7 在10个图像之后,返回图像Url的Scrapy Base64,python-2.7,xpath,scrapy,Python 2.7,Xpath,Scrapy,我正在尝试使用scrapy删除数据。我已经获得了所需的文本数据。但是,当我试图废弃图像src时,它会在开始时返回准确的url,并在一些记录之后返回 “数据:image/gif;base64,r0lgodlhaqaabaaaach5baekaaaaaaaaaaaaaaaaictaeaow==” 这是我的蜘蛛代码 import scrapy class CoinmarketcapSpider(scrapy.Spider): name = 'coinmarketcap' allowed

我正在尝试使用scrapy删除数据。我已经获得了所需的文本数据。但是,当我试图废弃图像src时,它会在开始时返回准确的url,并在一些记录之后返回

“数据:image/gif;base64,r0lgodlhaqaabaaaach5baekaaaaaaaaaaaaaaaaictaeaow==”

这是我的蜘蛛代码

import scrapy
class CoinmarketcapSpider(scrapy.Spider):
    name = 'coinmarketcap'
    allowed_domains = ['coinmarketcap.com']
    start_urls = ['https://coinmarketcap.com/2']
    def parse(self, response):
        cointable=response.css('table#currencies').xpath('//tbody/tr')
        for coins in cointable:
            name=coins.css('a.currency-name-container::text').extract_first().strip()
            logo=coins.css('img.logo-sprite::attr(src)').extract()
            symbol=coins.css('span.currency-symbol').xpath('.//a/text()').extract_first().strip()
            market_cap=coins.css('.market-cap').xpath('text()').extract_first().strip()
            yield {
                'Name':name,
                'image_urls':logo,
                'symbol':symbol,
                'market_cap':market_cap
            }
        print response
这里是包含ImgLogo url的输出json文件

[{“coinName”:[“比特币”],“符号”:[“BTC”],“imgLogo”: [""]}, {“币名”:[“以太坊”],“符号”:[“以太坊”],“imgLogo”: [""]}, {“coinName”:[“XRP”],“symbol”:[“XRP”],“imgLogo”: [""]}, {“coinName”:[“比特币现金”],“符号”:[“BCH”],“imgLogo”: [""]}, {“coinName”:[“EOS”],“symbol”:[“EOS”],“imgLogo”: [""]}, {“coinName”:[“Stellar”],“symbol”:[“XLM”],“imgLogo”: [""]}, {“coinName”:[“Litecoin”],“symbol”:[“LTC”],“imgLogo”: [""]}, {“coinName”:[“Tether”],“symbol”:[“USDT”],“imgLogo”: [""]}, {“coinName”:[“Cardano”],“symbol”:[“ADA”],“imgLogo”: [""]}, {“coinName”:[“Monero”],“symbol”:[“XMR”],“imgLogo”: [""]}, {“coinName”:[“IOTA”],“symbol”:[“MIOTA”],“imgLogo”: [“数据:image/gif;base64,r0lgodlhaqaabaaaach5baekaaaaaaaaaaaaaaictaeaow==”], {“coinName”:[“TRON”],“symbol”:[“TRX”],“imgLogo”: [“数据:image/gif;base64,r0lgodlhaqaabaaaach5baekaaaaaaaaaaaaaaictaeaow==”], {“硬币名”:[“破折号”],“符号”:[“破折号”],“imgLogo”: [“数据:image/gif;base64,r0lgodlhaqaabaaaach5baekaaaaaaaaaaaaaaictaeaow==”]

这是我的Items.py代码

import scrapy
class CmindexItem(scrapy.Item):
    # define the fields for your item here like:
     image_urls = scrapy.Field()
下面是我的piplines.py代码,用于下载图像并将其保存在我的图像目录中

import scrapy
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem


class CmindexPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield scrapy.Request(image_url)

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item['image_paths'] = image_paths
        return item
这是我的settings.py代码

BOT_NAME = 'cmindex'

SPIDER_MODULES = ['cmindex.spiders']
NEWSPIDER_MODULE = 'cmindex.spiders'
USER_AGENT = 'cmindex (+http://www.cmindex.com)'
# Obey robots.txt rules
ROBOTSTXT_OBEY = True
ITEM_PIPELINES = {'cmindex.pipelines.CmindexPipeline': 1}
IMAGES_STORE ='E:\WorkPlace\cmindex\cmindex\img'
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
}

我添加了虚假的用户代理,也增加了请求的延迟,但这并没有影响我的最终结果。所以,如果有人有想法,请分享。谢谢

数据:image/gif;base64,R0l…是用base64编码的完整图像

查看mozillas文档:

数据URL(以Data:scheme为前缀的URL)允许内容创建者将小文件嵌入到文档中

数据URL由四部分组成:前缀(数据:)、指示数据类型的MIME类型、可选的base64标记(如果不是文本标记)和数据本身:


数据:image/gif;base64,R0l…
是用base64编码的完整图像

查看mozillas文档:

数据URL(以Data:scheme为前缀的URL)允许内容创建者将小文件嵌入到文档中

数据URL由四部分组成:前缀(数据:)、指示数据类型的MIME类型、可选的base64标记(如果不是文本标记)和数据本身:


首先,这是从响应中获得的相关原始html

前10行中一枚硬币的Html代码片段

10
</td>
<td class="no-wrap currency-name" data-sort="Tether">
<img src="https://s2.coinmarketcap.com/static/img/coins/16x16/825.png" class="logo-sprite" alt="Tether" height="16" width="16">
10
第10行后硬币的Html代码段

11
</td>
<td class="no-wrap currency-name" data-sort="TRON">
<img data-src="https://s2.coinmarketcap.com/static/img/coins/16x16/1958.png" class="logo-sprite lazyload" alt="TRON" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" height="16" width="16">
11
基本上,服务器发送两种不同格式的数据。一个用于第1-10行,另一个用于第10行。与第1-10行一样,获得src属性,但从第11行开始,您将获得src属性base64和data src属性。但是我可以看到数据src属性最终被应用到浏览器端的src属性

下一个问题应该是它为什么这样做

我认为这里的目的是尽可能快地显示数据,类似于渐进加载。我不能推测这个方案的有效性,可能在某些显示格式中,你的页面大小也是10

因此,基本上第1-10行有用于浏览器渲染的最终html,但第11行之后,java脚本会产生神奇的效果。现在java脚本已经缩小并压缩,但我假设以下代码段(使用图像更好地表示)正在将数据src属性的值传输到src属性。

话虽如此,我认为安全的废弃方法是使用

  • 使用数据src的属性值
  • 如果数据src不可用,请使用 src属性
  • 这就是“斗殴者”将看到的源代码或html。


    另外,第11行和更多行的src带有“data:image/gif;base64,r0lgodlhaqaabaaaach5baekaaaaaaaaaaaaaaaaictaeaow==”我认为这是一种放置支架图像,它们都是相同的,似乎是1x1像素。

    首先,这是从响应中获得的相关原始html

    前10行中一枚硬币的Html代码片段

    10
    </td>
    <td class="no-wrap currency-name" data-sort="Tether">
    <img src="https://s2.coinmarketcap.com/static/img/coins/16x16/825.png" class="logo-sprite" alt="Tether" height="16" width="16">
    
    10
    
    第10行后硬币的Html代码段

    11
    </td>
    <td class="no-wrap currency-name" data-sort="TRON">
    <img data-src="https://s2.coinmarketcap.com/static/img/coins/16x16/1958.png" class="logo-sprite lazyload" alt="TRON" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" height="16" width="16">
    
    11
    
    基本上,服务器发送两种不同格式的数据。一个用于第1-10行,另一个用于第10行。与第1-10行一样,获得src属性,但从第11行开始,您将获得src属性base64和data src属性。但是我可以看到数据src属性最终被应用到浏览器端的src属性

    下一个问题应该是它为什么这样做

    我认为这里的目的是尽可能快地显示数据,类似于渐进加载。我不能推测这个方案的有效性,可能在某些显示格式中,你的页面大小也是10

    因此,基本上第1-10行有用于浏览器渲染的最终html,但第11行之后,java脚本会产生神奇的效果。现在java脚本已经缩小并压缩,但我假设以下代码段(使用图像更好地表示)正在将数据src属性的值传输到src属性。

    话虽如此,我认为安全的废弃方法是使用

  • 使用数据src的属性值
  • 如果数据src不可用,请使用 src属性
  • 这就是“斗殴者”将看到的源代码或html。

    另外,第11行和更多行的src带有“data:image/gif;base64,r0lgodlhaqaaaaaaach5baekaaaaaaaaaaaaaaaaaaictaeaow==”我认为是一种放置支架图像,它们都是相同的,似乎是1x1像素

    USER_AGENT = 'cmindex (+http://www.cmindex.com)'
    DOWNLOADER_MIDDLEWARES = {
        'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
        'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
    }
    
    ROBOTSTXT_OBEY = False
    
    import scrapy
    class CoinmarketcapSpider(scrapy.Spider):
    name = 'coinmarketcap'
    allowed_domains = ['coinmarketcap.com']
    start_urls = ['https://coinmarketcap.com/']
    def parse(self, response):
    
        cointable=response.css('table#currencies').xpath('//tbody/tr')
        for coins in cointable:
            name=coins.css('a.currency-name-container::text').extract_first().strip()
            logoData = coins.css('img.logo-sprite::attr(data-src)').extract()
            logoSrc=coins.css('img.logo-sprite::attr(src)').extract()
            if(logoData==[]):
                logo=logoSrc
            else:
                logo=logoData
    
    
    
            symbol=coins.css('span.currency-symbol').xpath('.//a/text()').extract_first().strip()
            market_cap=coins.css('.market-cap').xpath('text()').extract_first().strip()
            yield {
                'Name':name,
                'image_urls':logo,
                'symbol':symbol,
                'market_cap':market_cap,
            }
        print(response)