我需要抓取网站http://www.yellowkorner.com/ 通过选择不同的国家,所有价格都会发生变化。列出了40多个国家/地区,每个国家都必须废弃。
我目前的蜘蛛很简单
</script>
如何为所有国家/地区提取价格信息?
答案 0 :(得分:2)
使用firebug打开页面并刷新。检查面板网络/子面板Cookie中的网页,您将看到该页面使用cookie保存了国家/地区信息(参见下图)。
因此,您必须在请求时强制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表达式可以改进。
希望这有帮助。