整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          (京東店鋪購買鏈接:https://item.jd.com/10038779118412.html)


          碼關注我

          鐵幕27QP27英寸電腦顯示器144HZ高清游戲電競濾藍光護眼1ms急速響應顯示屏2K英雄聯盟CF 27QP黑/144HZ/升降底座【圖片 價格 品牌 報價】-京東們

          東商品詳細的請求處理,是先顯示html,然后再ajax請求處理顯示價格。

          1.可以運行js,并解析之后得到的html

          2.模擬js請求,得到價格


          如果手機顯示代碼錯亂,發送至電腦查看。

          # -*- coding: utf-8 -*-

          """

          根據京東url地址,獲取商品價格

          京東請求處理過程,先顯示html頁面,然后通過ajax get請求獲取相應的商品價格

          1.商品的具體數據在html中的格式,如下(示例)

          # product: {

          # skuid: 1310118868,

          # name: '\u9999\u5f71\u77ed\u88d9\u4e24\u4ef6\u5957\u88c5\u5973\u0032\u0030\u0031\u0034\u51ac\u88c5\u65b0\u6b3e\u97e9\u7248\u957f\u8896\u0054\u6064\u4e0a\u8863\u8377\u53f6\u8fb9\u534a\u8eab\u88d9\u6f6e\u0020\u85cf\u9752\u0020\u004d',

          # skuidkey:'7781F505B71CE37A3AFBADA119D3587F',

          # href: 'http://item.jd.com/1310118868.html',

          # src: 'jfs/t385/197/414081450/336886/3070537b/541be890N2995990c.jpg',

          # cat: [1315,1343,1355],

          # brand: 18247,

          # nBrand: 18247,

          # tips: false,

          # type: 2,

          # venderId:38824,

          # shopId:'36786',

          # TJ:'0',

          # specialAttrs:["is7ToReturn-1"],

          # videoPath:'',

          # HM:'0'

          # }

          2.ajax請求代碼如下:

          # // 獲得數字價格

          # var getPriceNum = function(skus, $wrap, perfix, callback) {

          # skus = typeof skus === 'string' ? [skus]: skus;

          # $wrap = $wrap || $('body');

          # perfix = perfix || 'J-p-';

          # $.ajax({

          # url: 'http://p.3.cn/prices/mgets?skuIds=J_' + skus.join(',J_') + '&type=1',

          # dataType: 'jsonp',

          # success: function (r) {

          # if (!r && !r.length) {

          # return false;

          # }

          # for (var i = 0; i < r.length; i++) {

          # var sku = r[i].id.replace('J_', '');

          # var price = parseFloat(r[i].p, 10);

          #

          # if (price > 0) {

          # $wrap.find('.'+ perfix + sku).html('¥' + r[i].p + '');

          # } else {

          # $wrap.find('.'+ perfix + sku).html('暫無報價');

          # }

          #

          # if ( typeof callback === 'function' ) {

          # callback(sku, price, r);

          # }

          # }

          # }

          # });

          # };

          """

          import urllib

          import json

          import re

          class JdPrice(object):

          """

          對獲取京東商品價格進行簡單封裝

          """

          def __init__(self, url):

          self.url = url

          self._response = urllib.urlopen(self.url)

          self.html = self._response.read()

          def get_product(self):

          """

          獲取html中,商品的描述(未對數據進行詳細處理,粗略的返回str類型)

          :return:

          """

          product_re = re.compile(r'compatible: true,(.*?)};', re.S)

          product_info = re.findall(product_re, self.html)[0]

          return product_info

          def get_product_skuid(self):

          """

          通過獲取的商品信息,獲取商品的skuid

          :return:

          """

          product_info = self.get_product()

          skuid_re = re.compile(r'skuid: (.*?),')

          skuid = re.findall(skuid_re, product_info)[0]

          return skuid

          def get_product_name(self):

          pass

          def get_product_price(self):

          """

          根據商品的skuid信息,請求獲得商品price

          :return:

          """

          price = None

          skuid = self.get_product_skuid()

          url = 'http://p.3.cn/prices/mgets?skuIds=J_' + skuid + '&type=1'

          price_json = json.load(urllib.urlopen(url))[0]

          if price_json['p']:

          price = price_json['p']

          return price

          # 測試代碼

          if __name__ == '__main__':

          url = 'http://item.jd.com/1310118868.html'

          url = 'http://item.jd.com/1044773.html'

          jp = JdPrice(url)

          print jp.get_product_price()

          # htm.decode('gb2312', 'ignore').encode('utf-8')

          # f = open('jjs.html', 'w')

          # f.write(htm)

          # f.close()

          過多次雙十一活動的小編表示一頓操作猛如虎,一看結果2毛5。浪費時間不說而且未必得到真正的優惠,雙十一電商的“明降暗升”已經是默認的潛規則了。打破這種規則很簡單,可以用 Python 寫一個定時監控商品價格的小工具。

          思路

          1. 第一步抓取商品的價格存入 Python 自帶的 SQLite 數據庫
          2. 每天定時抓取商品價格
          3. 使用 pyecharts 模塊繪制價格折線圖,讓低價一目了然

          抓取京東價格

          從商品詳情的頁面中打開 F12 控制面板,找到包含 p.3 的鏈接,在旁邊的 preview 面板中可以看到當前商品價格

          def get_jd_price(skuId):

          
              sku_detail_url = 'http://item.jd.com/{}.html'
              sku_price_url = 'https://p.3.cn/prices/get?type=1&skuid=J_{}'
          
              r = requests.get(sku_detail_url.format(skuId)).content
          
              soup = BeautifulSoup(r, 'html.parser', from_encoding='utf-8')
              sku_name_div = soup.find('div', class_="sku-name")
          
              if not sku_name_div:
                  print('您輸入的商品ID有誤!')
                  return
              else:
                  sku_name = sku_name_div.text.strip()
          
              r = requests.get(sku_price_url.format(skuId))
              price = json.loads(r.text)[0]['p']
          
              data = {
                  'sku_id': skuId,
                  'sku_name': sku_name,
                  'price': price
              }
              return data
          

          把抓取的價格存入 sqlite 數據庫,使用 PyCharm 的 Database 功能創建一個 sqlite 數據庫

          最終將數據插入到數據庫

          # 新增
          def insert(data):
              conn = sqlite3.connect('price.db')
              c = conn.cursor()
              sql = 'INSERT INTO price (sku_id,sku_name,price) VALUES ("{}", "{}", "{}")'.format(data.get("sku_id"), data.get("sku_name"), data.get('price') )
              c.execute(sql)
              conn.commit()
              conn.close()
          
          # 查詢
          def select(sku_id):
              conn = sqlite3.connect('price.db')
              c = conn.cursor()
              sql = 'select sku_id, sku_name, price, time from price where sku_id = "{}" order by time asc'.format(sku_id)
              cursor = c.execute(sql)
          
              datas = []
              for row in cursor:
                  data = {
                      'sku_id': row[0],
                      'sku_name': row[1],
                      'price': row[2],
                      'time': row[3]
                  }
                  datas.append(data)
              conn.close()
          
              return datas
          

          示例結果

          計劃任務

          使用輕量級的 schedule 模塊每天早上 10 點抓取京東價格這一步驟

          安裝 schedule 模塊

          pip install schedule
          
          def run_price_job(skuId):
          
              # 使用不占主線程的方式啟動 計劃任務
              def run_continuously(interval=1):
                  cease_continuous_run = threading.Event()
          
                  class ScheduleThread(threading.Thread):
                      @classmethod
                      def run(cls):
                          while not cease_continuous_run.is_set():
                              schedule.run_pending()
                              time.sleep(interval)
          
                  continuous_thread = ScheduleThread()
                  continuous_thread.start()
                  return cease_continuous_run
              
              # 每天10點運行,get_jd_price:任務方法,skuId:任務方法的參數
              schedule.every().day.at("10:00").do(get_jd_price, skuId=skuId)
              run_continuously()
          

          查看歷史價格

          使用 pytharts 模塊繪制折線圖,直觀的查看每一天的價格差異

          
          datas = select(skuId)
          
          def line(datas):
              x_data = []
              y_data = []
              for data in datas:
                  x_data.append(data.get('time'))
                  y_data.append(data.get('price'))
          
              (
                  Line()
                  .add_xaxis(x_data)
                  .add_yaxis(datas[0].get('sku_name'), y_data, is_connect_nones=True)
                  .render("商品歷史價格.html")
              )
          
          

          總結

          本文抓取了京東商城的價格,小伙伴們也可以修個腳本抓取淘寶的價格。使用 Python 解決生活中的小小痛點,讓錢包不再干癟。


          主站蜘蛛池模板: 国产视频一区在线播放| 中文字幕一区二区免费| 国产在线一区二区| 极品尤物一区二区三区| 国产丝袜无码一区二区三区视频| 3d动漫精品啪啪一区二区中文| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 天堂Av无码Av一区二区三区| 精品人妻一区二区三区四区| 麻豆va一区二区三区久久浪 | 国产精品无码一区二区在线观| 一区视频免费观看| 精品一区高潮喷吹在线播放| 国产日本亚洲一区二区三区| 香蕉久久AⅤ一区二区三区| 无人码一区二区三区视频| 精品国产一区二区三区www| 日本一区二区免费看| 日本一区二区三区日本免费| 亚洲AV网一区二区三区| 色国产在线视频一区| 亚洲Av高清一区二区三区| 中文字幕一区在线| 日韩视频在线观看一区二区| 成人一区专区在线观看| 亚洲综合av一区二区三区不卡| 亚欧免费视频一区二区三区| 中文字幕一区一区三区| 无码乱码av天堂一区二区| 亚洲色偷偷偷网站色偷一区| 国产日韩一区二区三区| 亚洲AV日韩综合一区| 国产精品视频一区国模私拍| 无码中文人妻在线一区二区三区| 午夜福利一区二区三区在线观看| 国产精品视频无圣光一区| 激情综合丝袜美女一区二区| 亚欧色一区W666天堂| 爆乳熟妇一区二区三区霸乳| 丝袜美腿一区二区三区| 鲁丝片一区二区三区免费|