У меня есть этот скрипт, который отлично работает на уровне scrapy и mysql.Данные вставлены правильно, но сценарий таков: - Я запускаю сканирование, вставляю около 370 товаров - После 370 товаров (иногда это число меняется), значение цены становится нулевым - Сценарий все еще работает, пока я не получу ~ 8000 товаров
_ если я снова запустите сканирование, цена будет пустой с самого начала.- Через некоторое время (>, чем через 1 час) цены возвращаются, пока не достигают ~ 370 пунктов
import scrapy
import urllib
import time
import datetime
import re
import requests
import simplejson
import json
from re import sub
from decimal import Decimal
#from prod.items import ProdItem
from staging.items import StagingItem
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
ts = time.time()
timestamp = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
#pagenb = 0
#pagegrp = 0
class QuotesSpider(scrapy.Spider):
name = "shopee"
def start_requests(self):
shopeecat = [["17101","Home care"],["160","Health & Beauty"],["9824","Grocery"],["9827","Snack food"],["2352","Baby products"]]
for i in range(len(shopeecat)):
for pageloop in range(0, 10000,20):
if pageloop < 10000:
url = 'https://shopee.vn/api/v2/search_items/?by=pop&limit=20&match_id=%s&newest=%s&page_type=search&order=desc' % (shopeecat[i][0],pageloop)
headers = {
"if-none-match-": "55b03-c72444ae4e056f6e58a1d9eab26d36d4",
"accept-encoding": "gzip, deflate, sdch, br",
"x-requested-with": "XMLHttpRequest",
"accept-language": "en-SG,en;q=0.8,en-US;q=0.6,zh-CN;q=0.4,zh;q=0.2,vi;q=0.2,fr;q=0.2",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36",
"x-api-source": "pc",
"accept": "*/*",
"referer": "https://shopee.vn/S%E1%BB%A9c-Kh%E1%BB%8Fe-S%E1%BA%AFc-%C4%90%E1%BA%B9p-cat.160",
"authority": "shopee.vn"
}
meta={"acategory": shopeecat[i][1]}
request = scrapy.Request(url=url, callback=self.parse, meta=meta, method='GET', headers=headers)
yield request
def parse(self, response):
print response.headers
jsonresponse = json.loads(response.body)
# print jsonresponse
for product in jsonresponse['items']:
item = StagingItem()
item['collector_sku'] = product['name']
linkname = "https://shopee.vn/" + product[u'name'].replace(' ', '-') +"-i."+str(product['shopid'])+"."+str(product['itemid'])
if 'price_before_discount' in product:
apromo = product['price_before_discount']
print "yes promo"
print product['price_before_discount']
else:
apromo = ''
print "no promo"
item['collector_price_promo'] = apromo
item['collector_retailer'] = 'Shopee'
item['collector_url'] = linkname
aimage = "https://cf.shopee.vn/file/" + product['image']
item['collector_photo_url'] = aimage
item['collector_brand'] = product['brand']
item['collector_quantity'] = 'NA'
item['collector_category'] = response.meta["acategory"]
if 'price' in product:
aprice = product['price']
print "yes price"
print product['price']
else:
aprice = ''
print "no price"
item['collector_price'] = aprice
item['collector_timestamp'] = timestamp
item['collector_local_id'] = product['itemid']
item['collector_location_id'] = ''
item['collector_location_name'] = ''
item['collector_vendor_id'] = product['shopid']
item['collector_vendor_name'] = ''
yield item
Возможно ли, что сайт заблокирует скрапинг только после того, как куча предметов будет списана?Кажется странным, почему блокировка на стороне контента, только на цены?остальное содержание в порядке (name, url, ...), только цена и цена акции становятся нулевыми.Я не могу воспроизвести случай из браузера с веб-сайта, но в ответе «скрап» ясно показаны пустые цены после нескольких соскобов
Есть идеи?