简单明了的接口分析,轻而易举的js数据抓取,你值得了解

最近写爬虫抓取了一下1688网的数据,特写此博客记录一下此次抓取的过程分析

进入1688首页后,输入关键字后进行商品的搜索(这里搜索的是手机)。显示页面如下

检查源码的时候却发现无该商品的信息,查询ajax接口时发现了该数据是如何传输过来的

对响应的数据进行分析发现数据一次性传递二十个商品的数据,在offerList中,包含了商品图片信息,厂家信息,起批量及其起批价格等信息,在此我们就已经获取了商品详情页的大部分信息,在该数据对象中都能够找到。但是我们想抓取评论和成交详情时,却发现没有相关的信息
于是我进一步分析js接口,总于找到了相关的信息,原来是将信息隐藏在了js中
先找到了成交的详情信息,如下

评论的详情页也抓取到了呢,就在rates.json文件中呢,如下

接下来就模拟js发送请求,获得评论的详情信息。
请求url如下:
https://rate.1688.com/remark/offerDetail/rates.json?callback=jQuery17205288144649342565_1596117170400&_input_charset=GBK&offerId=622311787712&page=1&pageSize=15&starLevel=&orderBy=&semanticId=&showStat=1&content=1&t=1596117179370&memberId=b2b-2208236930474a47ee&isNeedInitRate=false

经过自己试验发现,必要参数只有offerId,page,和memberId三个,这里的offerId容易获取,就是该商品url的最后一段数字 如下:
https://detail.1688.com/offer/622311787712.html?spm=a26352.13672862.offerlist.296.68526458UjZwS3
加粗字体就是商品的offerId,page就是需要爬取的页数,剩下的就是这个memberId不知从何下手,但经过自己的努力查找,终于让我捕获到了这个memberId,就在主页面的json数据中,如下图所示

成交信息与评论同样获取即可,接下来便可以拼凑自己的url发起请求了,思路如下:
1.获取总页面数,自己拼凑url发送请求,获取商品数据
2.根据商品数据,向每一个商品发送js请求,获取评论信息(这里需要注意一下,除了url外请求头还需要referer参数,该参数为当前页面的url,在json中也可以获取到,即为detailUrl)
3.开启多线程进行爬取
4.解析出自己需要的商品信息和对应多少页码的评论
5.该方法为js接口抓取,实测有效,但需要很多高可用的IP进行切换爬取,不然会被防爬识别,进而需要登录验证

代码如下(代码并未爬取完全,需要爬取完全需要自己更改需要爬取的商品数据,代码中有做注释哦!)

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
from urllib.parse import urlencode
import requests
import jsondef open_html(url, send_msgs_dict):send_key = send_msgs_dict['send_key']broswer = webdriver.Chrome()wait = WebDriverWait(broswer,50)broswer.get(url)input = wait.until(EC.presence_of_element_located((By.ID,'home-header-searchbox')))input.clear()input.send_keys(send_key)button = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="app"]/div/div[3]/section/div[2]/div/div/div/form/fieldset/div/div[2]/button')))button.click()url = broswer.current_urltime.sleep(2)broswer.close()return urldef ajax_get(r_url,send_msgs_dict,pages,ua):print('正在获取页面接口......')r_text_obj_list = []lis = r_url.split('?')[1].split('&')dic = {}for i in lis:dic[i.split('=')[0]] = i.split('=')[1]keywords = dic['keywords']del dic['keywords']url = "https://search.1688.com/service/marketOfferResultViewService?"parmeter = {'sortType' : send_msgs_dict['send_type'],  #(综合,成交额,价格)'descendOrder' : send_msgs_dict['send_order'],  #(升序,降序)'uniqfield' : 'userid',   #不变'async' : 'true',   #不变'asyncCount' : 20,   #不变'beginPage' : 1,     #页码值,默认第一页'pageSize' : 60,    #不变'startIndex' : ''  #(起始值)}headers = {'user-agent': ua}for page in range(1,pages+1):for i in range(3):if i == 0:parmeter['offset'] = 7parmeter['beginPage'] = pageparmeter['startIndex'] = i*20new_parmeter = {}new_parmeter.update(dic)new_parmeter.update(parmeter)new_url = url + 'keywords=' + keywords +'&' + urlencode(new_parmeter)r = requests.get(new_url,headers=headers)r_text_obj_list.append(r)time.sleep(2)print('页面接口获取完毕!')return r_text_obj_listdef js_success_month_get_total_page(url,refer_url,ua):headers = {'referer': refer_url,'user-agent': ua}res = requests.get(url,headers=headers)print(url)res_json = json.loads(res.text)total_pages = res_json['data']['totalPage']total_count = res_json['data']['totalCount']return total_pages,total_countdef js_comment_get_total_page(url,refer_url,ua):headers = {'referer': refer_url,'user-agent': ua}res = requests.get(url,headers=headers).textres_json = json.loads(res)total_pages = res_json['data']['pageParam']['totalPage']total_count = res_json['data']['pageParam']['totalCount']return total_pages,total_countdef js_success_month_get(url,refer_url,ua):headers = {'referer': refer_url,'user-agent': ua}res_list = []res = requests.get(url,headers=headers).textres_json = json.loads(res)try:order_list = res_json['data']['orderDisplayEntryList']for order_one in order_list:order_dic = {}#采购商order_dic['buyerName'] = order_one['buyerName']#采购数量order_dic['quantity'] = order_one['quantity']#采购总数order_dic['countBuyerQuantity'] = order_one['countBuyerQuantity']#单位order_dic['unit'] = order_one['unit']#采购时间order_dic['buyerPayTime'] = order_one['buyerPayTime']#采购价格order_dic['price'] = order_one['price']#规格order_dic['specInfo'] = order_one['specInfo']res_list.append(order_dic)# passexcept:#月销量为空passreturn res_listdef js_comment_get(url,refer_url,ua):# print('正在获取评论页面数据......')headers = {'referer': refer_url,'user-agent': ua}res_list = []res = requests.get(url,headers=headers).textres_json = json.loads(res)try:rates_list = res_json['data']['rates']for rates_one in rates_list:rates_dic = {}#评论内容rates_dic['remarkContent'] = rates_one['rateItem'][0]['remarkContent']if rates_dic['remarkContent'] == '评价方未及时做出评价,系统默认好评!':continue#采购数量rates_dic['quantity'] = rates_one['quantity']#采购总数rates_dic['countQuantity'] = rates_one['countQuantity']#用户名字rates_dic['member'] = rates_one['member']#规格rates_dic['specInfo'] = rates_one['specInfo']#评论时间rates_dic['remarkTime'] = rates_one['rateItem'][0]['remarkTime']res_list.append(rates_dic)# passexcept:#评论为空passreturn res_listdef parse_r_text(r_text_obj_list,data_all,ua):for r_text_obj in r_text_obj_list:print('-------------------------------------------')print('正在分析第  '+str(r_text_obj_list.index(r_text_obj)+1)+'  个ajax接口对象...')r_text_json = json.loads(r_text_obj.text)all_list = r_text_json['data']['data']['offerList']print('商品数据长度=',len(all_list))n = 0for one in all_list:data = {}current_num_str = str(all_list.index(one)+1)member_id = one['company']['memberId']detail_url = one['information']['detailUrl']offerId = str(one['aliTalk']['infoId'])success_month_js_url = 'https://rate.1688.com/remark/offerDetail/saleRecords.json?offerId='+ offerId +'&currentPage=1&memberId=' + member_idsuccess_month_total_pages,success_month_total_count = js_success_month_get_total_page(success_month_js_url,detail_url,ua)success_month_info_list = []print('正在获取第'+current_num_str+'个商品月销量页面数据......')for i in range(1,success_month_total_pages+1):new_js_url = 'https://rate.1688.com/remark/offerDetail/saleRecords.json?offerId='+ offerId +'&currentPage='+str(i)+'&memberId=' + member_idsuccess_month_info_list += js_success_month_get(new_js_url,detail_url,ua)time.sleep(0.5)print('获取第'+current_num_str+'个商品月销量页面数据完毕!')comment_js_url = 'https://rate.1688.com/remark/offerDetail/rates.json?offerId='+ offerId +'&currentPage=1&memberId=' + member_idcomment_total_pages,comment_total_count = js_comment_get_total_page(comment_js_url,detail_url,ua)comment_info_list = []print('正在获取第'+current_num_str+'个商品评论页面数据......')for i in range(1,comment_total_pages+1):new_js_url = 'https://rate.1688.com/remark/offerDetail/rates.json?offerId='+ offerId +'&currentPage='+str(i)+'&memberId=' + member_idcomment_info_list += js_comment_get(new_js_url,detail_url,ua)time.sleep(0.5)print('获取第'+current_num_str+'个商品评论页面数据完毕!')#名称data['title'] = one['information']['simpleSubject']#图片地址data['img_url'] = one['image']['imgUrlOf290x290']#回购率data['repurchaseRate'] = one['information']['rePurchaseRate']#价格-起批量priceStart_list = one['tradePrice']['offerPrice']['quantityPrices']priceStart_dic = {}for one_priceStart in priceStart_list:price = one_priceStart['valueString']numStart = one_priceStart['quantity']priceStart_dic['price'] = numStart#月成交量data['success_month'] = success_month_total_count#月成交详情data['success_month_info_list'] = success_month_info_list#评论数data['comment'] = comment_total_count#评论详情data['comment_info_list'] = comment_info_list#地址data['addr'] = one['company']['province']+one['company']['city']#规格data['brief'] = one['information']['brief']data_all.append(data)#用n变量记录每页爬取的商品数量,爬取全部可将下列三行代码进行注释n += 1if n > 2:breakprint('第  '+str(r_text_obj_list.index(r_text_obj)+1)+'  个ajax接口对象分析完毕!')print('-------------------------------------------')print('全部对象分析完毕!')def main():data_all = []ua = 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36'url = 'https://www.1688.com/'send_key = '手机'send_type = '综合'send_order = '升序'#这里定义需要爬取的页码数pages = 1if pages > 50:pages = 50sortTypeDict = {'综合':'normal','成交额':'va_rmdarkgmv30rt','价格':'price'}descendOrderDict = {'升序':'false','降序':'true'}send_msgs_dict = {'send_key':send_key,'send_type':sortTypeDict[send_type],'send_order':descendOrderDict[send_order]}r_url = open_html(url,send_msgs_dict)r_text_obj_list = ajax_get(r_url,send_msgs_dict,pages,ua)print('页面ajax接口对象个数------>',len(r_text_obj_list))parse_r_text(r_text_obj_list,data_all,ua)print('正在打印全部数据......')print(data_all)print('数据长度为=',len(data_all))print('爬取完成!')if __name__ == '__main__':main()

此文章为个人探索得出,记录此文章仅为学习交流使用,希望能够帮助到学习中的你,一起努力一起加油吧!

1688网数据抓取-js抓取篇相关推荐

  1. 使用Beautifulsoup爬取药智网数据

    使用Beautifulsoup模块爬取药智网数据 Tips:1.爬取多页时,先用一页的做测试,要不然ip容易被封 2.自己常用的处理数据的方法: reg=re.compile('正则表达式') dat ...

  2. java使用htmlunit工具抓取js中加载的数据

    htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容.项目可以模拟浏览器运行,被誉为java浏览器的开源实现.这个没有界面的浏览器,运行速度 ...

  3. 网络爬虫——票房网数据抓取及存储

    网络爬虫--票房网数据抓取及存储 实验内容 目标网站:电影票房网 目标网址:http://58921.com/daily/wangpiao 任务要求 目标数据:(1)名次(2)电影名称 (3)日期(4 ...

  4. python爬虫实现股票数据存储_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储!...

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  5. 最新美团网数据抓取实战。

    写在前面的话,还处于爬虫初期,很多东西一知半解,边学边记录,边学边做.代码写的自己都看不下去了.... 本期重点,美团网商铺数据,暂只抓了美食商家数据.先上战果,暂只抓了10万条,一小时左右,未对数据 ...

  6. wireshark 抓 蓝牙数据_使用Wireshark 抓取数据包

    Wireshark 是一个网络封包分析软件.网络封包分析软件的功能是获取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换. 一  ...

  7. js和css被屏蔽了,是否屏蔽蜘蛛抓取JS和CSS文件

    做网站的人都知道,在查看日志的时候,会发现JS.CSS文件被蜘蛛抓取的频率特别高,于是有人便考虑在robots.txt屏蔽蜘蛛抓取js和css文件,节省蜘蛛时间给其他页面.是否屏蔽蜘蛛抓取JS和CSS ...

  8. Node.js 抓取电影天堂新上电影节目单及ftp链接

    代码地址如下: http://www.demodashi.com/demo/12368.html 1 概述 本实例主要使用Node.js去抓取电影的节目单,方便大家使用下载. 2 node packa ...

  9. 测试开发Python培训:抓取新浪微博抓取数据-技术篇

    测试开发Python培训:抓取新浪微博抓取数据-技术篇 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的sele ...

最新文章

  1. ubuntu16.04上安装valgrind
  2. Java-优秀博客推荐
  3. C#编号的ActiveX控件采用CAB的布署方式实例
  4. java @valid 密码不一致_一个成熟的Java项目如何优雅地处理异常
  5. nokia 计算机手机,NOKIA手机与电脑的数据线连接
  6. object-C 与 C++的比较
  7. x200装linux驱动下载,佳能 ThinkPad X200 Tablet 驱动程序下载-更新佳能软件(平板电脑)...
  8. JAVA游戏编程之一----IDE安装调试(3) --JAD 文件介绍--debug调试
  9. android inflate 参数,Android inflate方法总结
  10. 时序分析基本概念介绍Slew/Transition
  11. 英语口语笔记B1-Unit7.交通出行-04-Train travel in Europe
  12. keep怎么弄轨迹动画_keep怎么录视频?教学视频录像和轨迹动画视频录制方法介绍...
  13. Centos逻辑卷扩容、合并
  14. [置顶] 你总能看到的脑残问题
  15. HR让回去等通知,到底啥意思?
  16. 2020nyist第三场个人赛
  17. 第十章:Java之接口基本概念、接口实现多继承、Object类
  18. 会计师事务所寄快递教程
  19. CAS 5.2.x 实现SSO单点登录教程记录
  20. PCF8591数模转换模块与数码管的小实例

热门文章

  1. 将照片形式的纸质公章转化为电子公章(不需要下载ps)
  2. 2017新农合最新政策:报销比例、报销范围、报销标准及补偿标准
  3. linux的vi编辑器课件,linux课件--第三章+文本编辑器vi.ppt
  4. iphone 分辨率问题
  5. 外边距塌陷/外边距合并
  6. 【转】浅谈温岭民间的孝文化
  7. 【周光权:利用计算机信息技术实施危害行为定性问题】
  8. centos 离线下载rpm文件进行安装
  9. 安卓 省电模式、低电耗(Doze)模式、应用待机(standby)模式、唤醒锁
  10. Spring Data JPA 分页