解决scrapy下载图片时相对路径转绝对路径的问题

        这段时间一直在研究利用scrapy抓取图片的问题,我发觉,用官网的http://doc.scrapy.org/en/0.12/topics/images.html的donwload item images的教程只能处理html中包含绝对路径的图片,对于javascript动态生成的图片和包含相对路径的图片都是无可奈何的。

        经过一段时间的各种恶心,现在终于搞定了相对路径转绝对路径的问题,下面就记录下个人心得:

        其实结果很简单,但是如果不了解相关函数的用法,那就是各种恶心了。

        其实关键就是两个函数:base_url = get_base_url(response)和[urljoin_rfc(base_url, ru) for ru in relative_url]

        直接贴代码似乎更方便更好理解:

from scrapy.spider import BaseSpider

from scrapy.selector import HtmlXPathSelector

from scrapy.utils.response import get_base_url
from scrapy.utils.url import urljoin_rfc
from dmoz.items import DmozItem


class DmozSpider(BaseSpider):
   name = "dmoz.org"
   allowed_domains = ["dmoz.org"]
   start_urls = [
       "http://www.pizzahut.com.cn/phdi/index.aspx#!handler/home.ashx?&tagid=&proid="
   ]


   def parse(self, response):
       hxs = HtmlXPathSelector(response)
       sites = hxs.select('//li/a[@target = "_blank"]/img')
       items = []
       i = 0
       for site in sites:
           base_url = get_base_url(response)
           log = open("log.txt", "a")
           log.write("base_url:" + base_url + "\n")
           relative_url = site.select('./@src').extract()
           log.write("relative_url:" + relative_url[0] + "\n")
           i = i + 1
           item = DmozItem()
           item['image_urls'] = [urljoin_rfc(base_url, ru) for ru in relative_url]
           items.append(item)
       return items

要注意的一点就是:relative_url = site.select('./@src').extract()不能写成relative_url = site.select('./@src').extract()[0]          //有些贴是这样写的

这样写会导致处理url时发生异常 raise ValueError('Missing scheme in request url: %s' % self._url)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值