Python 2.7 在10个图像之后,返回图像Url的Scrapy Base64
我正在尝试使用scrapy删除数据。我已经获得了所需的文本数据。但是,当我试图废弃图像src时,它会在开始时返回准确的url,并在一些记录之后返回 “数据:image/gif;base64,r0lgodlhaqaabaaaach5baekaaaaaaaaaaaaaaaaictaeaow==” 这是我的蜘蛛代码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
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属性。
话虽如此,我认为安全的废弃方法是使用
另外,第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属性。
话虽如此,我认为安全的废弃方法是使用
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)