AMZ123跨境卖家导航
拖动LOGO到书签栏,立即收藏AMZ123
首页跨境头条文章详情

如何爬动态加载的页面?ajax爬虫你有必要掌握

任佳伟
任佳伟
13250
2018-09-21 19:13
2018-09-21 19:13
13250


通过前面几期Python爬虫的文章,不少童鞋已经可以随心所欲的爬取自己想要的数据,就算是一些页面很难分析,也可以用之前介绍的终极技能之「Selenium」+「Webdriver」解决相关问题,但无奈这种办法效率太慢,咋整?


今天就为大家介绍Ajax异步加载的数据的爬取。


↓↓↓


何为Ajax异步加载的数据呢?


Ajax,全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML。它不是一门编程语言,而是利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。对于传统的网页,如果想更新其内容,那么必须要刷新整个页面,但有了Ajax,便可以在页面不被全部刷新的情况下更新其内容。在这个过程中,页面实际上是在后台与服务器进行了数据交互,获取到数据之后,再利用JavaScript改变网页,这样网页内容就会更新了。




通俗来讲:就像一栋房子,先把框框架架搭起来(前端页面框架),再给他装修、置办家具(填充数据),这里的装修、置办家具即是ajax请求的数据。。


我们可以通过一些网站的事例来直观的了解一下什么到底是什么是ajax。


例如访问“蘑菇街”电商平台中的食品类目:http://list.mogujie.com/book/food/52026,通过Chrome浏览器可以看到我们与“蘑菇街”交互的所有数据。


示范:

1

打开Chrome,访问

http://list.mogujie.com/book/food/52026

2

在Chrome中按F12或者在页面空白处点击鼠标右键→检查。

3

点击Clear 和 XHR 按钮。


4

刷新一下页面。  

5

点击一下左边的search?callback=JQuery….,再点击右边栏的Response其下方会出现一些看不懂,但又好像有点儿规则的数据。管他的,先Ctrl+A全选拷贝出来看看。(如果你把商品列表页继续下滑,会出现更多的这种数据哦。)

6

使用Chrome插件「JSON-hanle」或者访问:https://www.json.cn/将刚才拷贝的数据粘贴进去,点击OK。


7

 再与网页上的数据对比一下,见图:



怎么样?是不是一目了然,相关数据都在里面了。这里的orgPrice为原价、sale为销量、cfav为点赞、price为现价。这些数据都已经在这一串乱七八糟的字符里了,我们需要的就解析这串字符。


其实呢,这种数据格式叫做「Json」。json 是轻量级的文本数据交换格式,其格式与计算机语言中的字典(dict)类似,都是名称/值对(key/value)的格式。能拿到json数据就已经成功90%了,剩下的10%就是解析json拿出自己想要的数据、保存数据。但也不是所有的Ajax请求拿到的都是Json数据,例如亚马逊他就是这么66的。



下面将以我们日常能用到的,

爬取reviews来演练一遍Ajax请求:



1

访问某商品的所有reviews页面:https://www.amazon.com/product-reviews/  +  ASIN

2

reviews能按照我们预想的方式排列,在操作下图中的筛选条件后会生成新的链接。

如将SORT BY切换为Most recent,浏览器地址栏的链接会变为:https://www.amazon.com/product-reviews/B072DXSF6S/ref=cm_cr_arp_d_viewopt_srt?pageNumber=1&sortBy=recent


若直接使用requests.get该链接,返回的数据并不会按照预想的顺序排列。这种时候就需要抓包、Ajax请求登场了。


3

Chrome中按F12或者在页面空白处点击鼠标右键→检查。

4

首先点击Clear按钮,清除已捕获到的数据。再点击Next→按钮,看一下加载一页新的reviews会捕获到哪些数据。如下图,捕获到了一个名为“cm_cr_arp_d_paging_btm_3”的文件。最后点击Response,看一下这句文件到底传输了些什么。


5

如下图所示,在Response里的数据与网页前端页面的部分源码一致。可以认定,亚马逊是先将评论页面的框架搭好,然后通过Ajax的方式传输显示评论详情的前端代码。


6

再分析一下本次数据传输的headers、data等数据。这一步非常重要,在数据交互中各类请求头、请求参数都会影响本次请求的返回值。


在上图中已将一些关键的参数做了解释,方便大家理解。


7

下面就是敲代码时间了,按照之前的逻辑我们可以直接使用Ajax请求数据,然后根据返回的数据获取到reviews的网页源码,再加以解析。


首先准备好headers、cookies等数据。前期后童鞋表示headers什么的太难搞了,且不知道这里面花里胡哨的一堆是啥意思,今天告诉大家一个简便方法。首先在Chrome控制台抓到的数据上点击鼠标左键→Copy→Copy as cURL。如图:


再访问https://curl.trillworks.com/,在“curl command”中将刚才拷贝的cURL粘贴进去,右边将自动生成Python代码。如图:


嘿嘿嘿,爽不爽。现在只需要把右边的“Python requests”拷贝出来,粘贴到Pycharm里就可以跑起来啦,是不是美滋滋?。


8、打开Pycharm,新建项目,将代码拷贝进去。可以看到我们需要的headers, cookies, data全都已经备好了。稍微加工一下,跑一下看看。

response = requests.post('https://www.amazon.com/hz/reviews-render/ajax/reviews/get/', headers=headers, data=data)


印的为:                                            

这与刚才在Chrome看到的一样,证明我们成功获取到了数据。


9、将数据整理一下,并删除不需要的垃圾数据。

html_list = list(response.text.replace('&&&', '').split('
'))
reviews_html_list = html_list[
6:26]
print(len(reviews_html_list))
for i in reviews_html_list:
   
if len(i)==0:
        reviews_html_list.remove(i)


10、遍历整个列表取出每个评论的ID。

for reviews_html in reviews_html_list:
    frist_review_soup = BeautifulSoup(
eval(reviews_html)[2], 'lxml')
    review_id = frist_review_soup.find(
'div', 'a-section review')['id']


11、写一个解析review详情页的方法,方便调用。

def request_reviews_url(review_id):
    headers = {

       
'origin': 'https://www.amazon.com',
       
'accept-encoding': 'gzip, deflate, br',
       
'accept-language': 'zh-HK,zh-CN;q=0.9,zh;q=0.8',
       
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
       
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
       
'accept': 'text/html,*/*',
       
'referer': 'https://www.amazon.com/product-reviews/B00CJHZRW8/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=helpful&pageNumber=1',
       
'authority': 'www.amazon.com',
       
'x-requested-with': 'XMLHttpRequest',
       
'dnt': '1',
   
}
    review_url =
'https://www.amazon.com/gp/customer-reviews/' + review_id
    review_html = requests.get(review_url
, headers=headers)
    review_soup = BeautifulSoup(review_html.text
, 'lxml')
    review_title = review_soup.find(
'a', 'review-title').text
   
print(review_title)
    review_author = review_soup.find(
'span', 'review-byline').text.replace('By', '')
   
print(review_author)
    review_date = review_soup.find(
'span', 'review-date').text.replace('on ', '')
   
print(review_date)
    review_text = review_soup.find(
'span', 'review-text').text
   
print(review_text)


这样就能完成让评论按要求排列,并爬取的需求了。附完整代码:

import requests
from bs4 import BeautifulSoup


def request_reviews_url(review_id):
    headers = {

       
'origin': 'https://www.amazon.com',
       
'accept-encoding': 'gzip, deflate, br',
       
'accept-language': 'zh-HK,zh-CN;q=0.9,zh;q=0.8',
       
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
       
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
       
'accept': 'text/html,*/*',
       
'referer': 'https://www.amazon.com/product-reviews/B00CJHZRW8/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=helpful&pageNumber=1',
       
'authority': 'www.amazon.com',
       
'x-requested-with': 'XMLHttpRequest',
       
'dnt': '1',
   
}
    review_url =
'https://www.amazon.com/gp/customer-reviews/' + review_id
    review_html = requests.get(review_url
, headers=headers)
    review_soup = BeautifulSoup(review_html.text
, 'lxml')
    review_title = review_soup.find(
'a', 'review-title').text
   
print(review_title)
    review_author = review_soup.find(
'span', 'review-byline').text.replace('By', '')
   
print(review_author)
    review_date = review_soup.find(
'span', 'review-date').text.replace('on ', '')
   
print(review_date)
    review_text = review_soup.find(
'span', 'review-text').text
   
print(review_text)


if __name__ == '__main__':
    page =
1
   
headers = {
       
'origin': 'https://www.amazon.com',
       
'accept-encoding': 'gzip, deflate, br',
       
'accept-language': 'zh-HK,zh-CN;q=0.9,zh;q=0.8',
       
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
       
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
       
'accept': 'text/html,*/*',
       
'referer': 'https://www.amazon.com/product-reviews/B00CJHZRW8/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=helpful&pageNumber=1',
       
'authority': 'www.amazon.com',
       
'x-requested-with': 'XMLHttpRequest',
       
'dnt': '1',
   
}
   
while 1:
        data = {
           
'sortBy': 'recent',
           
'reviewerType': 'all_reviews',
           
'formatType': '',
           
'mediaType': '',
           
'filterByStar': '',
           
'pageNumber': str(page),
           
'filterByKeyword': '',
           
'shouldAppend': 'undefined',
           
'deviceType': 'desktop',
           
# 'reftag': 'cm_cr_arp_d_viewopt_srt',
           
'pageSize': '10',
           
'asin': 'B072SS1NTM',
           
# 'scope': 'reviewsAjax1'
       
}
        response = requests.post(
'https://www.amazon.com/hz/reviews-render/ajax/reviews/get/', headers=headers, data=data)
        html_list =
list(response.text.replace('&&&', '').split(' '))
        reviews_html_list = html_list[
6:26]
       
for i in reviews_html_list:
           
if len(i) == 0:
                reviews_html_list.remove(i)
       
for reviews_html in reviews_html_list:
            frist_review_soup = BeautifulSoup(
eval(reviews_html)[2], 'lxml')
            review_id = frist_review_soup.find(
'div', 'a-section review')['id']
            request_reviews_url(review_id)
        page +=
1


爬虫中数据的分类主要有:结构化数据(json,xml等)和非结构化数据(HTML)。之前的文章中使用的案例都是从目标网站拿到非结构化数据然后使用正则表达式/xpath等解析,而今天讲是相对而言的结构化数据,可以使用json或xpath转换为Python对应的数据类型。寻找结构化数据可能在前期不好着手、找不到Post的正确URL,但一旦成功后将事半功倍。


照Web发展的趋势来看,以Ajax加载数据的方式将会越来越普遍。这种方式在Web开发上可以做到前后端分离,从而降低服务器直接渲染页面带来的压力。如果大家兴趣的话也可以自己动手尝试爬取一些其他网站的数据哟。


教了大家好几期的爬虫,大家有学会了的吗?觉得有用的小伙伴可以分享下朋友圈!或有什么问题,欢迎留言讨论哦!


往期精彩回顾
任佳伟:使用「Web Scraper」抓取商品信息
【Python爬虫】:使用「Selenium」+「Chromedriver」爬僵尸链接
【Python爬虫】:使用「Requests」+「bs4」写亚马逊爬虫


好文!必须点赞
免责声明
本文链接:
本文经作者许可发布在AMZ123跨境头条,如有疑问,请联系客服。
最新热门报告作者标签
30年印度电商将达2500亿美元,四大原因助力其增长
AMZ123获悉,近日,德勤与谷歌联合发布《2500亿美元的商业前沿》报告,基于对印度电商市场的交易数据、消费者调研及行业专家访谈,深度解析了当地网购行为变迁、市场格局特征及未来增长动力。核心发现如下:一、电商市场概况(一)整体市场规模2025年,印度电商市场已扩张至900亿美元。尽管线下零售仍占据近90%的市场份额,但电商正在从根本上改变印度消费者发现和购买的方式。从2019年到2025年,约1.1亿新在线购物者的加入,推动了市场的持续扩张。展望2030年,印度在线零售市场预计将增长3倍,达到2500亿美元。届时,人均电商支出将从目前的350-380美元增长至625-650美元,几乎翻倍。
电商平台高度集中与利润承压,26年卖家经营策略大变
AMZ123获悉,近日,Marketplace Pulse发布了《2026年电商卖家销售现状报告》。从卖家运营现状、利润情况、经营模式、物流策略、AI应用以及未来挑战等多个维度,系统分析了全球181位卖家(合计超过20亿美元年收入)的经营状态与结构性变化。报告揭示了一个核心趋势:电商卖家正处于利润持续压缩与电商平台高度集中的阶段。在这种情况下,卖家的经营重点发生了变化,从过去追求规模增长,转向更加注重风险控制和优化业务结构。一、卖家运营现状数据显示,当前电商卖家平均运营2.83个平台,覆盖80个不同平台。其中,亚马逊以92.8%的占比处于绝对主导地位,几乎成为所有卖家的必选平台。
Q1印度电商市场同比增长25%,消费信心回暖
AMZ123获悉,近日,Flipkart与贝恩公司联合发布的《2026印度线上消费报告》显示,2026年第一季度,印度电商市场同比增长25%。报告指出,这一增长主要受宏观经济改善和政策支持带动,消费者信心回升成为关键推动因素。从全年趋势来看,印度电商市场在2025年已呈现恢复态势。报告显示,2025年电商销售额同比增长19%至21%,其中下半年增速达到22%至24%,约为上半年同比增速的1.5倍。与此同时,印度电商GMV(商品交易总额)在过去五年实现翻倍增长,2025年达到650亿至660亿美元规模。消费端结构也在发生变化。报告指出,新增用户主要来自Z世代、二线及以下城市以及中等收入家庭。
3月波兰电商平台排名:Temu用户数第一
AMZ123获悉,近日,根据最新的Mediapanel数据,2026年3月波兰电商市场的用户竞争格局出现明显变化,Temu以约1910万用户位居第一,超过了波兰本土电商平台Allegro的1850万用户。除Temu和Allegro外,进入前十的电商平台还包括Media Expert(1320万用户)、Empik(960万用户)、AliExpress(960万用户)、Erli(870万用户)、Shein(830万用户)、Rossmann(780万用户)、亚马逊(770万用户)以及Vinted(695万用户)。
国产AI伴侣玩具,在TikTok拿下百万GMV
根据央视新闻3月报道,在“世界超市”义乌,搭载人工智能技术的玩具正成为外贸出口的新爆款。这些“会说话”的玩具在欧美、东南亚等市场量价齐升,成为拉动义乌出口增长的新引擎。官方的数据披露为AI玩具撕下了“伪需求”的刻板印象,同时在TikTok美区,与之相关的市场需求也得到了更为直接的数据印证。在TikTok美区,中国品牌「Unee」用旗下炙手可热的AI毛绒伴侣玩具,书写着有关AI商业落地的又一叙事。01近千元的玩具,成TikTok爆款TT123观察到,近7天TikTok美区娃娃与毛绒玩具类目的销售额TOP4,由中国品牌「Unee」旗下的AI毛绒伴侣玩具摘下,数据显示,一周以来这款产品共卖出2.89万美元。
AMZ123会员专享丨4月第2周资讯汇总
亚马逊亚马逊与USPS达成新的包裹配送协议,双方长期合作关系得以延续。根据知情人士透露,在新协议下,USPS将保留约80%的亚马逊包裹配送业务,规模超过每年10亿件,这一结果明显好于此前市场预期的削减三分之二甚至更多业务量的情况。瑞银全球研究部发布最新报告显示,亚马逊印度计划在10至15个主要城市逐步关停4至24小时送达的生鲜配送服务Amazon Fresh,转而全力押注快速电商Amazon Now。据The Information报道,亚马逊在2026年Prime Day前对卖家价格规则进行调整,卖家必须确保所设商品标价与最近在亚马逊或其他品牌的实际购买价格相符,以防止出现误导性促销。
TikTok Shop马来斋月销售额同比增长超130%
AMZ123获悉,近日,根据TikTok Shop发布的数据,2026年斋月和开斋节期间,TikTok Shop实现显著增长。数据显示,今年节日期间TikTok Shop销售额同比增长超过130%,成为马来西亚本地电商市场中增长较快的平台之一。此次增长与TikTok Shop推出的扶持政策密切相关。TikTok Shop表示,其通过#JomLokal Booster激励计划投入了2000万林吉特(RM20 million),为卖家提供支持,同时持续加大在购物安全方面的投入。这一计划自2025年9月推出以来,已为超过5000家中小微企业提供佣金减免支持,并组织了14场培训工作坊,用于提升新卖家的运营能力。
宠物电商平台Chewy收购兽医平台Modern Animal
AMZ123获悉,近日,美国宠物电商平台Chewy宣布,已签署最终协议收购兽医服务平台Modern Animal。此次收购被视为Chewy向“全链路宠物医疗生态系统”转型的重要一步,旨在将医疗服务、电商和相关服务整合在宠物生命周期的各个环节中。根据披露,Modern Animal目前拥有29家自营诊所,提供7×24小时虚拟医疗服务,并采用高留存率的会员制模式。通过此次交易,Chewy预计将新增超过1.25亿美元的年化收入规模,同时将其线下宠物医疗网络规模从原有的18家门店快速扩大至47家,实现线下服务能力的即时扩张。
Stripe与Meta合作,FB广告可完成一键结账
Fin123获悉,近日,Stripe宣布,为Facebook广告商推出全新结账体验,使消费者无需离开应用即可完成购买。通过这项功能,使用Stripe的卖家可以将Facebook广告与支付系统直接连接,买家点击广告中的“立即购买”按钮后,可使用Meta钱包中保存的支付凭证完成一键结账。该流程基于《智能体商务协议》,未来将扩展到包括Instagram广告在内的更多Meta平台。卖家可在Stripe管理平台中通过开关选择启用此功能,并关联其Meta广告账户。启用后,购买过程将完全嵌入广告体验,消除了用户在传统跳转浏览器或应用完成交易时的中断,从而提升购买转化率。
高评分+高销量,10款亚马逊厨房小家电热销产品一览
AMZ123获悉,近日,亚马逊各类产品搜索量增长显著,以下10款产品在亚马逊上销量表现突出,深受消费者欢迎。1. 电热水壶预计销售额:62万美元/月销量:24,200+星级评分:4.5好评数量:47,056+图源:亚马逊产品介绍:这款电热水壶内部无塑料,提升饮用安全性与口感纯净度。产品加热效率较高,可在3分钟内快速烧开一杯水,同时配备自动断电、加热指示灯、防干烧保护功能,保障使用安全。整体外观采用简约设计,宽口壶身与双角度开盖设计便于清洁与加水,精准壶嘴与防烫手柄提升倒水稳定性。
因产品数据质量不佳,印度电商每年损失五百亿卢比
AMZ123获悉,近日,据外媒报道,印度电商与快消行业正因产品数据质量不佳而蒙受巨额损失。据GS1印度公司的最新研究,不一致、不完整或不准确的产品信息每年导致约500亿卢比的资金流失。其中,约200亿卢比表现为毛利率下降,原因包括转化率降低、商品上架受限以及销售速度放缓;另有190亿卢比直接用于退货相关成本,涵盖逆向物流、处理与加工等环节。尤其在时尚服装领域,退货问题更为突出。因尺码不合、款式偏好或实物与描述不符,顾客主动退货率通常占总订单的20%至25%。Unicommerce指出,逆向物流会使订单价值额外增加5%至7%,而这还不含原始运费。放眼全球,时尚与鞋类退货率甚至可达30%至40%。
亚马逊再调FBA费用,4月17日起生效!
中东战火延宕至今,仍未有“熄火”之意。当地时间4月2日,特朗普在最新表态中发出警告,称美国将在未来两到三周内对伊朗进行猛烈打击,国际油价应声飙涨。截至当天收盘,5月交货的美国WTI原油价格收于每桶111.54美元,上涨11.41%;6月交货的国际基准布伦特原油价格则收于每桶109.03美元,涨幅高达7.78%。在此背景下,一系列“涨价通知”如同多米诺骨牌,正逐级传导至跨境卖家们的利润表上。全链路合规难题现场答疑,4.17 深圳 | 深圳商务局&行业专家坐镇,落地实操一站获取!点击报名AMZ123了解到,当地时间4月2日,亚马逊美国站发布了一则加征物流相关附加费的通知。
存火灾风险!美国CPSC紧急召回八款插头延长线
AMZ123获悉,近日,美国消费者产品安全委员会(CPSC)发布紧急召回警告,要求消费者立即停止使用“插头延长线”,并已与沃尔玛、eBay和AliExpress等电商平台达成协议,下架相关危险商品。CPSC指出,这类延长线两端均为公头插头,插入电源后裸露插脚可能带电,存在严重触电和火灾风险,因此在任何情况下都不应使用。为防止危险商品继续流入市场,CPSC已推动相关电商平台删除商品链接,同时平台方面承诺将主动识别并下架类似产品。根据CPSC的公告,多家来自中国的卖家和企业涉及销售该类产品,但大多数未回应CPSC关于召回或产品信息的要求。
别急着动广告!亚马逊订单骤降的真正元凶,用这个办法三分钟就能找到
希望这套从流量到转化率、从工具到方法的完整分析思路,能帮你: 少走弯路——别再凭感觉调广告 精准定位——用数据和工具锁定真实原因 快速响应——在问题扩大前及时出手 日常多关注、异常早发现、调整有依据——稳住单量,其实没那么难。
26年美国美妆消费者趋势:关税、AI、社媒影响购物决策
AMZ123获悉,随着新技术与平台不断涌现,不同世代美妆消费者的购物行为愈发复杂,不同产品类别对购买决策的影响也存在显著差异。同时,美国近年的关税政策与持续通胀也对市场格局造成影响,使品牌方面临竞争激烈且充满不确定性的环境。因此,Tinuiti发布了《2026年美妆营销研究报告》,从通胀影响到社交媒体趋势全面分析了消费者行为,以更好理解当前美国市场的美妆消费状况。一、市场现状1. 消费者对价格变化的反应数据显示,2025年美国美妆及个护电商市场规模已达到约610亿美元,电商渠道已占据接近一半的市场份额。随着技术进步和平台多样化,美容消费者的购物路径日益复杂。
美客多将在智利投资7.5亿美元,提供1200个岗位
AMZ123获悉,近日,据外媒报道,拉丁美洲电商巨头美客多计划在2026年向智利市场投入7.5亿美元,与2025年的投资规模相比,此番金额增幅达到27%。据了解,过去六年里,美客多在智利的累计投入已突破20亿美元,伴随新一轮的投资,预计2026年将为智利直接创造1200个新增就业岗位。值得注意的是,这笔巨额资金投入将流向物流基础设施的扩容与金融科技生态的完善。在物流端,美客多将在圣地亚哥启动第二个大型配送中心的建设,预计今年下半年即可投入使用。该中心能够存储超过1500万件商品,旨在直接拉高订单履约效率。此外,美客多还计划将物流网络向智利北部和南部延伸,试图弥合不同区域间网购体验的落差。
《全球产业深度研究之清真经济专题》PDF下载
印度尼西亚是全球最大清真消费市场,规模达到2650亿美元;马来西亚是全球认证标准输出中心;沙特阿拉伯是GCC(海湾阿拉伯国家合作委员会)具有战略价值的清真枢纽。这三个国家形成了清真消费三大市场占比60%。
《TikTok Shop2026欧美运动户外类目报告》PDF下载
欧美市场总GMV为15.11亿,整体结构呈现极度集中化的特征,其中美国站点的GMV高达12.32亿,占据了欧美市场的81.52%,月均GMV超过1.02亿。英国站点以 2.40亿的GMV和15.89%的份额位居第二。两大站点贡献了市场总GMV的97%以上。
《TikTok Shop2026东南亚运动户外类目报告》PDF下载
作为东南亚各站点的支柱品类,运动户外凭借其深厚的消费群体基础与高社交属性,相比其他品类规模优势显著,并在近12个月继续保持强劲增长。近一年内,东南亚地区该品类总GMV逼近百亿美元,其中泰国站表现尤为突出,GMV突破4.7亿美元;马印尼站紧随其后,GMV近4亿美元。
《2026中国新能源智能汽车产业链出海研究报告》PDF下载
海外主要汽车市场的国家/地区政策出现分化:以德国、意大利为代表的欧洲主要汽车生产国,携其本土汽车产业巨头,共同构成了推动欧盟调整“禁燃令”的主导力量。从本质上看,此次政策调整的进程,折射出欧盟内部不同国家与产业利益集团之间的复杂博弈。泰国、马来西亚和巴西现阶段开始偏好汽车产能的实际落地希望引入长期资本以支持当地的经济发展。
《2026中国电动微出行出海欧美市场研究报告》PDF下载
动微出行的产品开发逻辑向车规级演进:行业技术架构正加速向机械一电驱一智控体系演进,提升产品研发、安全标准与供应链体系。未来竞争的核心不再是单一的续航或功率参数,而是平台化能力、智能化深度与全生命周期服务体系的构建。
《TikTok Shop突破末次触达归因(LTA)ROAS分析报告》PDF下载
在数字化浪潮中,广告主正面临有效衡量广告支出回报率(ROAS)的挑战。传统未次触达归因(LTA)模型因数据收集难度和归因偏差问题已难以满足广告主的需求,因此,探索新的方法来解决这些问题显得尤为重要。
《未来电商报告:品牌独立站五步升级锁定未来确定性增长》PDF下载
调研显示,出海商家针对家居、时尚及消费电子等品类布局比例均超过30%。独立站凭借其高度品牌化、个性化、场景化及功能性等优势,精准契合上述品类对品牌调性、场景交互及沉浸式体验的核心诉求,正成为商家黑五大促期提升销量、构建品牌竞争壁垒的关键载体。
《TikTok Shop达人真实种草力报告》PDF下载
达人正在将文化内容、社群互动与商业转化深度融合,形成一个高度协同的内容商业生态,其价值早已不再局限于内容带来的直接收入。从更广义的商业视角来看,达人价值的核心在于真实影响力-即其内容对商品与服务产生影响并促成转化所形成的整体商业价值,这一能力正构成达人在内容电商体系中的带货价值基础。
AMZ123选品观察员
选品推荐及选品技巧分享。
北美电商资讯
AMZ123旗下北美跨境电商新闻栏目,专注北美跨境电商热点资讯,为广大卖家提供北美跨境电商最新动态、最热新闻。
跨境电商干货集结
跨境电商干货集结,是结合亚马逊跨境电商卖家交流群内大家在交流过程中最常遇到的问题,进行收集整理,汇总解答,将会持续更新大家当前最常遇见的问题。欢迎大家加入跨境电商干货集结卖家交流群一起探讨。
跨境数据中心
聚合海量跨境数据,输出跨境研究智慧。
亚马逊全球开店
亚马逊全球开店官方公众号,致力于为中国跨境卖家提供最新,最全亚马逊全球开店资讯,运营干货分享及开店支持。
AMZ123卖家导航
这个人很懒,还没有自我介绍
亿邦动力网
消除一切电商知识鸿沟,每日发布独家重磅新闻。
欧洲电商资讯
AMZ123旗下欧洲跨境电商新闻栏目,专注欧洲跨境电商热点资讯,为广大卖家提供欧洲跨境电商最新动态、最热新闻。
首页
跨境头条
文章详情
如何爬动态加载的页面?ajax爬虫你有必要掌握
任佳伟
2018-09-21 19:13
13250


通过前面几期Python爬虫的文章,不少童鞋已经可以随心所欲的爬取自己想要的数据,就算是一些页面很难分析,也可以用之前介绍的终极技能之「Selenium」+「Webdriver」解决相关问题,但无奈这种办法效率太慢,咋整?


今天就为大家介绍Ajax异步加载的数据的爬取。


↓↓↓


何为Ajax异步加载的数据呢?


Ajax,全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML。它不是一门编程语言,而是利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。对于传统的网页,如果想更新其内容,那么必须要刷新整个页面,但有了Ajax,便可以在页面不被全部刷新的情况下更新其内容。在这个过程中,页面实际上是在后台与服务器进行了数据交互,获取到数据之后,再利用JavaScript改变网页,这样网页内容就会更新了。




通俗来讲:就像一栋房子,先把框框架架搭起来(前端页面框架),再给他装修、置办家具(填充数据),这里的装修、置办家具即是ajax请求的数据。。


我们可以通过一些网站的事例来直观的了解一下什么到底是什么是ajax。


例如访问“蘑菇街”电商平台中的食品类目:http://list.mogujie.com/book/food/52026,通过Chrome浏览器可以看到我们与“蘑菇街”交互的所有数据。


示范:

1

打开Chrome,访问

http://list.mogujie.com/book/food/52026

2

在Chrome中按F12或者在页面空白处点击鼠标右键→检查。

3

点击Clear 和 XHR 按钮。


4

刷新一下页面。  

5

点击一下左边的search?callback=JQuery….,再点击右边栏的Response其下方会出现一些看不懂,但又好像有点儿规则的数据。管他的,先Ctrl+A全选拷贝出来看看。(如果你把商品列表页继续下滑,会出现更多的这种数据哦。)

6

使用Chrome插件「JSON-hanle」或者访问:https://www.json.cn/将刚才拷贝的数据粘贴进去,点击OK。


7

 再与网页上的数据对比一下,见图:



怎么样?是不是一目了然,相关数据都在里面了。这里的orgPrice为原价、sale为销量、cfav为点赞、price为现价。这些数据都已经在这一串乱七八糟的字符里了,我们需要的就解析这串字符。


其实呢,这种数据格式叫做「Json」。json 是轻量级的文本数据交换格式,其格式与计算机语言中的字典(dict)类似,都是名称/值对(key/value)的格式。能拿到json数据就已经成功90%了,剩下的10%就是解析json拿出自己想要的数据、保存数据。但也不是所有的Ajax请求拿到的都是Json数据,例如亚马逊他就是这么66的。



下面将以我们日常能用到的,

爬取reviews来演练一遍Ajax请求:



1

访问某商品的所有reviews页面:https://www.amazon.com/product-reviews/  +  ASIN

2

reviews能按照我们预想的方式排列,在操作下图中的筛选条件后会生成新的链接。

如将SORT BY切换为Most recent,浏览器地址栏的链接会变为:https://www.amazon.com/product-reviews/B072DXSF6S/ref=cm_cr_arp_d_viewopt_srt?pageNumber=1&sortBy=recent


若直接使用requests.get该链接,返回的数据并不会按照预想的顺序排列。这种时候就需要抓包、Ajax请求登场了。


3

Chrome中按F12或者在页面空白处点击鼠标右键→检查。

4

首先点击Clear按钮,清除已捕获到的数据。再点击Next→按钮,看一下加载一页新的reviews会捕获到哪些数据。如下图,捕获到了一个名为“cm_cr_arp_d_paging_btm_3”的文件。最后点击Response,看一下这句文件到底传输了些什么。


5

如下图所示,在Response里的数据与网页前端页面的部分源码一致。可以认定,亚马逊是先将评论页面的框架搭好,然后通过Ajax的方式传输显示评论详情的前端代码。


6

再分析一下本次数据传输的headers、data等数据。这一步非常重要,在数据交互中各类请求头、请求参数都会影响本次请求的返回值。


在上图中已将一些关键的参数做了解释,方便大家理解。


7

下面就是敲代码时间了,按照之前的逻辑我们可以直接使用Ajax请求数据,然后根据返回的数据获取到reviews的网页源码,再加以解析。


首先准备好headers、cookies等数据。前期后童鞋表示headers什么的太难搞了,且不知道这里面花里胡哨的一堆是啥意思,今天告诉大家一个简便方法。首先在Chrome控制台抓到的数据上点击鼠标左键→Copy→Copy as cURL。如图:


再访问https://curl.trillworks.com/,在“curl command”中将刚才拷贝的cURL粘贴进去,右边将自动生成Python代码。如图:


嘿嘿嘿,爽不爽。现在只需要把右边的“Python requests”拷贝出来,粘贴到Pycharm里就可以跑起来啦,是不是美滋滋?。


8、打开Pycharm,新建项目,将代码拷贝进去。可以看到我们需要的headers, cookies, data全都已经备好了。稍微加工一下,跑一下看看。

response = requests.post('https://www.amazon.com/hz/reviews-render/ajax/reviews/get/', headers=headers, data=data)


印的为:                                            

这与刚才在Chrome看到的一样,证明我们成功获取到了数据。


9、将数据整理一下,并删除不需要的垃圾数据。

html_list = list(response.text.replace('&&&', '').split('
'))
reviews_html_list = html_list[
6:26]
print(len(reviews_html_list))
for i in reviews_html_list:
   
if len(i)==0:
        reviews_html_list.remove(i)


10、遍历整个列表取出每个评论的ID。

for reviews_html in reviews_html_list:
    frist_review_soup = BeautifulSoup(
eval(reviews_html)[2], 'lxml')
    review_id = frist_review_soup.find(
'div', 'a-section review')['id']


11、写一个解析review详情页的方法,方便调用。

def request_reviews_url(review_id):
    headers = {

       
'origin': 'https://www.amazon.com',
       
'accept-encoding': 'gzip, deflate, br',
       
'accept-language': 'zh-HK,zh-CN;q=0.9,zh;q=0.8',
       
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
       
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
       
'accept': 'text/html,*/*',
       
'referer': 'https://www.amazon.com/product-reviews/B00CJHZRW8/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=helpful&pageNumber=1',
       
'authority': 'www.amazon.com',
       
'x-requested-with': 'XMLHttpRequest',
       
'dnt': '1',
   
}
    review_url =
'https://www.amazon.com/gp/customer-reviews/' + review_id
    review_html = requests.get(review_url
, headers=headers)
    review_soup = BeautifulSoup(review_html.text
, 'lxml')
    review_title = review_soup.find(
'a', 'review-title').text
   
print(review_title)
    review_author = review_soup.find(
'span', 'review-byline').text.replace('By', '')
   
print(review_author)
    review_date = review_soup.find(
'span', 'review-date').text.replace('on ', '')
   
print(review_date)
    review_text = review_soup.find(
'span', 'review-text').text
   
print(review_text)


这样就能完成让评论按要求排列,并爬取的需求了。附完整代码:

import requests
from bs4 import BeautifulSoup


def request_reviews_url(review_id):
    headers = {

       
'origin': 'https://www.amazon.com',
       
'accept-encoding': 'gzip, deflate, br',
       
'accept-language': 'zh-HK,zh-CN;q=0.9,zh;q=0.8',
       
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
       
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
       
'accept': 'text/html,*/*',
       
'referer': 'https://www.amazon.com/product-reviews/B00CJHZRW8/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=helpful&pageNumber=1',
       
'authority': 'www.amazon.com',
       
'x-requested-with': 'XMLHttpRequest',
       
'dnt': '1',
   
}
    review_url =
'https://www.amazon.com/gp/customer-reviews/' + review_id
    review_html = requests.get(review_url
, headers=headers)
    review_soup = BeautifulSoup(review_html.text
, 'lxml')
    review_title = review_soup.find(
'a', 'review-title').text
   
print(review_title)
    review_author = review_soup.find(
'span', 'review-byline').text.replace('By', '')
   
print(review_author)
    review_date = review_soup.find(
'span', 'review-date').text.replace('on ', '')
   
print(review_date)
    review_text = review_soup.find(
'span', 'review-text').text
   
print(review_text)


if __name__ == '__main__':
    page =
1
   
headers = {
       
'origin': 'https://www.amazon.com',
       
'accept-encoding': 'gzip, deflate, br',
       
'accept-language': 'zh-HK,zh-CN;q=0.9,zh;q=0.8',
       
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
       
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
       
'accept': 'text/html,*/*',
       
'referer': 'https://www.amazon.com/product-reviews/B00CJHZRW8/ref=cm_cr_arp_d_viewopt_srt?ie=UTF8&reviewerType=all_reviews&sortBy=helpful&pageNumber=1',
       
'authority': 'www.amazon.com',
       
'x-requested-with': 'XMLHttpRequest',
       
'dnt': '1',
   
}
   
while 1:
        data = {
           
'sortBy': 'recent',
           
'reviewerType': 'all_reviews',
           
'formatType': '',
           
'mediaType': '',
           
'filterByStar': '',
           
'pageNumber': str(page),
           
'filterByKeyword': '',
           
'shouldAppend': 'undefined',
           
'deviceType': 'desktop',
           
# 'reftag': 'cm_cr_arp_d_viewopt_srt',
           
'pageSize': '10',
           
'asin': 'B072SS1NTM',
           
# 'scope': 'reviewsAjax1'
       
}
        response = requests.post(
'https://www.amazon.com/hz/reviews-render/ajax/reviews/get/', headers=headers, data=data)
        html_list =
list(response.text.replace('&&&', '').split(' '))
        reviews_html_list = html_list[
6:26]
       
for i in reviews_html_list:
           
if len(i) == 0:
                reviews_html_list.remove(i)
       
for reviews_html in reviews_html_list:
            frist_review_soup = BeautifulSoup(
eval(reviews_html)[2], 'lxml')
            review_id = frist_review_soup.find(
'div', 'a-section review')['id']
            request_reviews_url(review_id)
        page +=
1


爬虫中数据的分类主要有:结构化数据(json,xml等)和非结构化数据(HTML)。之前的文章中使用的案例都是从目标网站拿到非结构化数据然后使用正则表达式/xpath等解析,而今天讲是相对而言的结构化数据,可以使用json或xpath转换为Python对应的数据类型。寻找结构化数据可能在前期不好着手、找不到Post的正确URL,但一旦成功后将事半功倍。


照Web发展的趋势来看,以Ajax加载数据的方式将会越来越普遍。这种方式在Web开发上可以做到前后端分离,从而降低服务器直接渲染页面带来的压力。如果大家兴趣的话也可以自己动手尝试爬取一些其他网站的数据哟。


教了大家好几期的爬虫,大家有学会了的吗?觉得有用的小伙伴可以分享下朋友圈!或有什么问题,欢迎留言讨论哦!


往期精彩回顾
任佳伟:使用「Web Scraper」抓取商品信息
【Python爬虫】:使用「Selenium」+「Chromedriver」爬僵尸链接
【Python爬虫】:使用「Requests」+「bs4」写亚马逊爬虫


好文!必须点赞
咨询
官方微信群
官方客服

扫码添加,立即咨询

加群
官方微信群
官方微信群

扫码添加,拉你进群

更多
订阅号服务号跨境资讯
二维码

为你推送和解读最前沿、最有料的跨境电商资讯

二维码

90% 亚马逊卖家都在关注的微信公众号

二维码

精选今日跨境电商头条资讯

回顶部