亚马逊商品排名(30天)和机器人页面处理

def parse_detail(self, response):

# 1.正常页面, 2.503动物页面(a.重新请求,b.换代理), 3.robot页面(检查captcha)

product_id = response.meta['product_id']

record_date = response.meta['record_date']

category_id = response.meta['category_id']

platform = response.meta['platform']

rank_type = response.meta['rank_type']

detail_link = response.meta['detail_link']#验证码时改动

try_times = response.meta['try_times']if 'try_times' in response.metaelse 0

try_times_dw = response.meta['try_times_dw']if 'try_times_dw' in response.metaelse 0

self.log(product_id)

sel = Selector(response)

price_ele = sel.xpath("//div[@id='snsPrice']//span[contains(@class,'a-color-price')]//text()").extract()

if not price_ele:

    price_ele = sel.xpath("//div[@id='unqualified']//a[contains(@href,'"+product_id+"')]/following-sibling::span[contains(@class,'a-    color- price')]/text()").extract()

if not price_ele:

    price_ele = sel.xpath("//span[@id='priceblock_ourprice']/text()").extract()

if not price_ele:

    price_ele = sel.xpath("//div[@id='olp_feature_div']//span//text()").extract()

# 出现机器人页面时:

captcha_img = sel.xpath("//form[contains(@action,'validateCaptcha')]//img[contains(@src,'captcha')]/@src")

if captcha_img:

# 1.验证码成功->正常页面,2.验证码失败->robot页面,3.N次尝试失败退出(换代理)

        if int(try_times) >=3:

            yield Request(url=detail_link,

            callback=self.parse_detail,

            meta={"product_id": product_id,"record_date": record_date,

            "category_id":self.category_id,"platform":'amazon',"rank_type":'category',

            'detail_link': detail_link,'proxy_renew':True})

else:

    try_times =str(int(try_times) +1)

    img_url = captcha_img

    response = requests.get(img_url)

    img = response.content

    with open('./a.jpg','wb')as f:

    f.write(img)

    imgapi_url ='http://192.168.6.180:8081/api/solve'

    files = {'image': ('test.png',open('a.jpg','rb'),'image/png')}

    res1 = requests.post(imgapi_url,files=files)

    security_dict = res1.json()

    security = security_dict['code']

    self.log(security)

    amzn = sel.xpath("//input[@name='amzn']/@value")

    url_parsed = urlparse(detail_link)

    amzn_r = (url_parsed.path +'?' + url_parsed.query)

    data = {'amzn': amzn,'amzn-r': amzn_r,'field-keywords': security}

# https://www.amazon.com/errors/validateCaptcha

    yield FormRequest('https://www.amazon.com/errors/validateCaptcha',formdata=data,callback=self.parse_detail,method='get',

    meta={'try_times':try_times,'detail_link':detail_link},dont_filter=True)

dongwu_ele = sel.xpath("//div[@id='g']/a/img[@id='d']/@src")

if dongwu_ele:

    if int(try_times_dw) >=5:

        pass

    else:

         try_times_dw =str(int(try_times_dw) +1)

        yield Request(url=detail_link,

        callback=self.parse_detail,

        meta={"product_id": product_id,"record_date": record_date,

       "category_id":self.category_id,"platform":'amazon',"rank_type":'category',

        'detail_link': detail_link,'proxy_renew':True,'try_times_dw':try_times_dw})

        # self.log(price_ele)

        price =''

 if price_ele :

    price_str =''.join([x.strip()for xin price_ele])

    i_str = price_str.find('from')

    if i_str != -1:

        price_str = price_str[i_str+4:]

    if '.' in price_stror ',' in price_str:

        re_str =r'([\d,\.]+)'

     else :

        re_str =r'(\d+)'

        m = re.search(re_str,price_str)

if m :

    price_num = m.group(1)

    i_price_num =  price_str.find(price_num)

    currency = price_str[(i_price_num-2 if i_price_num>1 else i_price_num-1):i_price_num].strip()

    if '.' in str(price_num)or ',' in str(price_num):

        price = currency +str(price_num)

    else:

    price = currency +str(float(price_num)/100)

    # self.log( price )

        if price:

sql ="UPDATE crawl_product_rank SET cpr_price=%s WHERE cpr_unique_id=%s AND cpr_record_date=%s AND cpr_category_id=%s AND cpr_platform=%s and cpr_rank_type=%s"

        params = (price,product_id,record_date,category_id,platform,rank_type)

self.log( params )

self.db.query(sql,params)

else:

availability = sel.xpath("//span[@id='pantry-availability']")

if availability:

self.log("Product Is Not Availability : " +str(product_id))

else :

self.log("Get Price Error : " +str(product_id))

#排名

    s = response.meta['product_id']

rank_str_ele = response.xpath("//table[contains(@id,'productDetails_detailBullets')]//th[contains(./text(),'Best Sellers Rank')]/following-sibling::td//text()")

if not rank_str_ele:

rank_str_ele = response.xpath("//li[@id='SalesRank']//text()")

rank_list = rank_str_ele.extract()

rank_str =''

    for xin rank_list:

x = x.replace('\n','')

if x.strip() =='':

continue

        else:

rank_str += x

rank_list_2 = rank_str.split('#')

product_rank_info = []

for xin rank_list_2:

item = {}

m = re.search('^(\d+)\s?in\s?([^\(]+)', x)

if mand m.group(1):

item['rank'] = m.group(1)

item['category'] = m.group(2).replace(' > ','|')

product_rank_info.append(item)

if product_rank_info:

self.log(product_rank_info)

header = {'Content-Type':'application/json'}

yield Request(url="https://amzscout.net/estimator/v2/sales/COM/" + s,headers=header,

body=json.dumps(product_rank_info),callback=self.get_rank,method="POST",

meta={"product_id": product_id,"record_date": record_date,"category_id":self.category_id,

"platform":'amazon',"rank_type":'category',"product_rank_info":product_rank_info,

'try_times':'0'}

)

#排名

def get_rank(self, response):

product_id = response.meta['product_id']

record_date = response.meta['record_date']

category_id = response.meta['category_id']

platform = response.meta['platform']

rank_type = response.meta['rank_type']

product_rank_info = response.meta['product_rank_info']

try_times = response.meta['try_times']

data_all = response.body

rank_all =str(data_all)[2:][:-1]

thirty_all = json.loads(rank_all)

thirty_all_rank = thirty_all['rankHistory']

if thirty_all_rank:

last_rank = json.dumps(thirty_all_rank)

sql ="UPDATE crawl_product_rank SET cpr_rank_thirty=%s WHERE cpr_unique_id=%s AND cpr_record_date=%s AND cpr_category_id=%s AND cpr_platform=%s and cpr_rank_type=%s"

        params = (last_rank, product_id, record_date, category_id, platform, rank_type)

self.log(params)

self.db.query(sql, params)

else:

if int(try_times) >=5:

pass

        else:

try_times =str(int(try_times) +1)

time.sleep(5)

header = {'Content-Type':'application/json'}

yield Request(url="https://amzscout.net/estimator/v2/sales/COM/" + product_id,headers=header,

body=json.dumps(product_rank_info),callback=self.get_rank,method="POST",dont_filter=True,

meta={"product_id": product_id,"record_date": record_date,"category_id":self.category_id,

"platform":'amazon',"rank_type":'category',"product_rank_info":product_rank_info,

'try_times':try_times}

)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • 在我的身边有许多人,有的是老师,有的是朋友,有的是亲人,还有的是同学,他(她)们就像天上的星星那么得多,那么得明亮...
    枫叶_c481阅读 249评论 0 1
  • 春天到了,又到了喵星人换毛的季节了 自认为自己手很巧的铲屎官们又开始作妖了 您好,您点的皮皮虾已上线 朕感觉要自己...
    喵大人的简书阅读 12,042评论 0 2