使用Scrapy更改网站提供国家/地区

时间:2015-11-04 20:30:05

标签: web-scraping scrapy

我需要抓取网站http://www.yellowkorner.com/ 通过选择不同的国家,所有价格都会发生变化。列出了40多个国家/地区,每个国家都必须废弃。

我目前的蜘蛛很简单

</script>

如何为所有国家/地区提取价格信息?

enter image description here

1 个答案:

答案 0 :(得分:2)

使用firebug打开页面并刷新。检查面板网络/子面板Cookie中的网页,您将看到该页面使用cookie保存了国家/地区信息(参见下图)。

enter image description here

因此,您必须在请求时强制cookie“YellowKornerCulture”属性值LANGUAGE和COUNTRY。我根据您的代码做了一个示例,以获取网站上的可用国家/地区以获得所有价格。请参阅以下代码:

# coding=utf-8

import scrapy


class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = ['http://www.yellowkorner.com/photos/index.aspx']

    def parse(self, response):
        countries = self.get_countries(response)
    #countries = ['BR', 'US'] try this if you only have some countries     
    for country in countries:
        #With the expression re(r'/photos/\d\d\d\d/.*$') you only get photos with 4-digit ids. I think this is not your goal.   
            for url in response.css('a::attr("href")').re(r'/photos/\d\d\d\d/.*$'):
                yield scrapy.Request(response.urljoin(url), cookies={'YellowKornerCulture' : 'Language=US&Country='+str(country), 'YellowKornerHistory' : '', 'ASP.NET_SessionId' : ''}, callback=self.parse_prices, dont_filter=True, meta={'country':country})

    def parse_prices(self, response):
        yield {
        'name': response.xpath('//h1[@itemprop="name"]/text()').extract()[0],   
        'price': response.xpath('//span[@itemprop="price"]/text()').extract()[0],
        'country': response.meta['country']

    }
    #function that gets the countries avaliables on the site    
    def get_countries(self, response):
        return response.xpath('//select[@id="ctl00_languageSelection_ddlCountry"]/option/attribute::value').extract()

花了一些时间来解决这个问题,但你必须删除该网站用来选择语言页面的另一个cookie。我还将语言值修改为英语(美国)。使用参数dont_filter=True是因为您在每次循环迭代时请求已经请求的url,并且scrapy的默认行为是由于性能原因不会重复对同一URL的请求。

PS:提供的xpath表达式可以改进。

希望这有帮助。