requests-html京東圖片上傳找電商分類

  • 2020 年 2 月 10 日
  • 筆記

京東頁面分析:

點擊圖片上傳按鈕,上傳一張小圖,可以看到上傳失敗了,不要緊,在network裡面可以看到

image?op=upload的資訊,點開就可以看到圖片上傳的介面了.

介面地址:https://search.jd.com/image?op=upload

提交post的請求的時候,還需要帶上一些headers裡面的資訊.在介面資訊上面都能找到的。

利用requests-html向介面提交post請求,程式碼如下:

from requests_html import HTMLSession    session = HTMLSession()  post_url = 'https://search.jd.com/image?op=upload'  headers = {      "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",      "accept-encoding": "gzip, deflate, br",      "accept-language": "zh-CN,zh;q=0.9",      "content-length": "4068000",      "origin": "https://search.jd.com",      "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"  }  files = {'file': open('333.jpg','rb')}  r = session.post(post_url, headers=headers, files=files, timeout=30)  print(r.text)

返回結果:

<script>document.domain="jd.com";parent.$o.uploader.callback("jfs/t28462/331/1256269893/74388/84637f95/5cdace08N104202e7.jpg");</script>

callback(回調函數)裡面包含了一個圖片路徑  jfs/t28462/331/1256269893/74388/84637f95/5cdace08N104202e7.jpg

繼續回到頁面分析:

這次上傳一張正常的圖片:

可以看到url變成了:

https://search.jd.com/image?path=jfs%2Ft10162%2F273%2F2841925085%2F74388%2F84637f95%2F5cdacee0Nf87545c9.jpg&op=search

瀏覽器會自動把url編碼,拿到站長工具上面去解析一下url

可以發現path=後面的路徑就是post上傳返回的路徑

整理下思路:首先提交post請求,拿到圖片的路徑,然後在拼接url地址訪問,就能得到圖片識別後的內容了

整理程式碼:

#!/usr/bin/env python  # coding: utf-8    from requests_html import HTMLSession  import re    session = HTMLSession()  post_url = 'https://search.jd.com/image?op=upload'  headers = {      "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",      "accept-encoding": "gzip, deflate, br",      "accept-language": "zh-CN,zh;q=0.9",      "content-length": "4068000",      "origin": "https://search.jd.com",      "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"  }  files = {'file': open('333.jpg','rb')}  r = session.post(post_url, headers=headers, files=files, timeout=30)  # 利用正則匹配出路徑  ret = re.findall('[(]["](.*)["][)]', r.text)[0]  if ret == 'ERROR.UPLOAD_FORMAT':      # 圖片識別失敗      print(False)  else:      s = session.get("https://search.jd.com/image?path={}&op=search".format(ret))      url_list = s.html.xpath("//div[@class='p-img']/a/@href")[0:3]      for x in url_list:          print("https:" + x)          rr = session.get("https:" + x)          # 拿到商品描述資訊          jd_describe = rr.html.xpath("//div[@class='sku-name']/text()")[0].replace(' ', '')          print(jd_describe)          # 拿到商品分類資訊          jd_classification_list = []          for y in rr.html.xpath("//div[@class='crumb fl clearfix']//a"):              if y.text.strip() == '':                  pass              else:                  jd_classification_list.append(y.text.strip())          five = rr.html.xpath("//div[@class='crumb fl clearfix']//div[@class='item ellipsis']/text()")          if five:              jd_classification_list.append(five[0])          print(jd_classification_list)

運行結果: