我是scrapy的新手并试图从几个网站爬行,但是从那里获得的图片不多。
例如,对于具有以下代码的http://shop.nordstrom.com/c/womens-dresses-new -
def parse(self, response):
for dress in response.css('article.npr-product-module'):
yield {
'src': dress.css('img.product-photo').xpath('@src').extract_first(),
'url': dress.css('a.product-photo-href').xpath('@href').extract_first()
}
我有6个产品。我期待66.
对于包含以下代码的网址https://www.renttherunway.com/products/dress -
def parse(self, response):
for dress in response.css('div.cycle-image-0'):
yield {
'image-url': dress.xpath('.//img/@src').extract_first(),
}
我得到了12.我期待大约100个。
即使我将其更改为抓取每个' next'页面,我每页得到相同的数字,但它成功地遍历了所有页面。
我尝试过另外一个USER_AGENT,禁用COOKIES和DOWNLOAD_DELAY为5。
我想我会在任何网站上遇到同样的问题,所以人们之前应该已经看过这个但是找不到它的引用。
我错过了什么?
答案 0 :(得分:2)
这是一个奇怪的网站,他们将产品数据存储为html源代码中的json,然后在页面加载时使用javascript解压缩。
为了解决这个问题,通常你想做的是
scrapy view <url>
如果你进行基于正则表达式的搜索:
re.findall("ProductResults, (\{.+\})\)", response.body_as_unicode())
你会得到一个包含所有产品及其信息的巨大的json。
import json
import re
data = re.findall("ProductResults, (\{.+\})\)", response.body_as_unicode())
data = json.loads(data[0])['data']
print(len(data['ProductResult']['Products']))
>> 66
获得正确数量的产品!
所以在你的解析中你可以这样做:
def parse(self, response):
for product in data['ProductResult']['Products']:
# find main image
image_url = [m['Url'] for m in product['Media'] if m['Type'] == 'MainImage']
yield {'image_url': image_url}