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

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

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


通过前面几期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跨境头条,如有疑问,请联系客服。
最新热门报告作者标签
最新报告出炉!25年法国电商市场增至1964亿欧元
AMZ123获悉,近日,根据法国电商与远程销售联合会发布的2025年度报告,法国电商在2025年继续保持增长,全年营业额达到1964亿欧元,同比增长7%。相比2024年9.6%的增长率,2025年的增速有所放缓,显示市场逐步走向成熟阶段。数据显示,法国在2025年实现了5.6%的交易额增长。销售高峰主要集中在11月和12月,黑色星期五和年终节日这两个月合计占全年商品销售额的22%。报告指出,交易额的增长主要来自交易次数增加,而非单笔金额提升。在不确定的经济环境下,消费者储蓄意愿增强,更倾向于选择价格较低的商品。
Zalando在欧洲新增二手童装品类
AMZ123获悉,近日,欧洲电商平台Zalando宣布,将其二手业务Pre-owned扩展至童装品类,目前已在14个欧洲国家上线,包括奥地利、比利时、捷克、丹麦、芬兰、法国、德国、爱尔兰、意大利、卢森堡、荷兰、波兰、瑞典和西班牙。Zalando的二手业务最早于2020年9月推出,最初涵盖女装和男装。此次新增童装后,消费者可以在独立的“Second-hand”标签页中浏览和购买二手童装产品,商品覆盖从婴儿到青少年的各个年龄段。Zalando表示,童装用户群体忠诚度较高,购买频率稳定,此次扩展旨在更好服务家庭消费者。在新模式下,用户不仅可以购买二手童装,也可以出售不再穿着的童装。
Revolut等四家公司获批测试英镑稳定币
Fin123获悉,近日,据外媒报道,英国金融行为监管局已选定4家公司参与稳定币监管“沙盒”测试,其中包括Revolut、Monee Financial Technologies、ReStabilise和VVTX。此次共有20家公司提交申请,最终4家入选。测试将于2026年第一季度启动,相关结果将用于制定英国最终的稳定币监管规则,预计规则将在2026年晚些时候公布。监管机构表示,监管沙盒计划允许企业在可控环境和适当保障措施下,向真实客户小规模测试稳定币产品,重点关注稳定币的发行流程。入选企业提出的应用场景包括支付、批发结算以及加密货币交易。
俄罗斯拟加快对跨境商品征收增值税
AMZ123获悉,近日,据外媒报道,俄罗斯正加快完善跨境电商相关的监管政策。俄罗斯财政部早在去年10月起草税法修正案,明确对通过电商渠道进口至俄罗斯的商品征收增值税。根据方案,税率将逐步提高:2027年为5%,2028年为10%,2029年为15%,自2030年起为20%。不过,今年1月29日,俄罗斯工业和贸易部长安东·阿里哈诺夫在议会听证会上建议,自2027年1月起对外国商品直接实施22%的增值税税率。会议期间,经济发展部还提出电商平台佣金差异问题。部分电商平台向外国卖家收取的佣金明显低于俄罗斯本土卖家。对此,经济发展部建议,在备忘录中明确,并在法律中规定,电商平台向俄罗斯卖家收取的佣金不得高于外国卖家。
2026新篇章!3月4日沃尔玛全球电商卖家峰会倒计时开启! 
马年迎新,开工大吉! 2026年新年开启,出海征程正在迎来新的机遇与可能! 新的增长答案在哪? 别忘了在节后返工的待办清单里再加一项�� 即刻报名3月4日沃尔玛全球电商卖家峰会! 2026,与“沃”同行,大展宏图! CTA:点击即刻报名 Part1:峰会亮点抢先知! 1、2026年度战略前瞻解析 沃尔玛全球电商北美高层亲临现场,带来2026年度全球化战略最新解读; 从更多本土前瞻洞察与品类分析中,助力卖家把握全渠道多元增长新机遇! 2、2026年度新卖家激励重磅来袭 新卖家即刻入驻沃尔玛美国站,即有机会享最高75000美金优惠!加墨智站点多重激励持续加码,覆盖佣金、广告、物流等超值优惠! 3、年度卖家颁奖典礼闪
大模型独角兽Kimi估值超100亿美元!
AMZ123获悉,近日,据媒体报道,大模型独角兽月之暗面(Kimi)再次成为市场焦点。据多方消息证实,在完成上一轮5亿美元融资仅一个多月后,月之暗面即将敲定新一轮超7亿美元的融资,由阿里、腾讯等联合领投。这意味着其估值已站上100亿至120亿美元的新台阶,折合人民币约700亿元。但比估值数字更引人注意的,是其商业化路径上出现的一个新变量——一款名为Kimi Claw的产品。据官方信息,Kimi Claw Beta版已于近日上线。这并非一个传统意义上的大模型应用,而是一个偏向工具属性的产品:用户可以在云端一键部署一个持久化的AI Agent,无需购买硬件,也无需手动输入代码。
别再蹭喜剧商标!GBC已发起7起侵权诉讼,钩针玩偶&版权插画慎用!
卖家朋友们,开工大吉!回来第一件事,除了收心,就是赶紧检查两样东西:账户提现和注册邮箱。我们过春节的时候,美国律所可没闲着,正常在起诉。务必看看有没有收到关于TRO的邮件,早发现早处理! 案件信息案件号:26-cv-02046立案时间:2026年2月24日原告:NBCUniversal Media, LLC原告官网:https://www.nbcuniversal.com/代理律所:GBCNBC环球(NBCUniversal)是全球领先的媒体娱乐公司,旗下拥有《侏罗纪世界》《速度与激情》等知名影视IP。
亚马逊将实施DD+7政策,卖家回款时间延长
AMZ123获悉,近日,亚马逊宣布,将对卖家结算政策进行调整,自2026年3月5日起在全球范围内实施DD+7出款规则。德国站将于3月12日正式执行。所谓DD+7,是指在确认送达后7天才会释放货款。对于有物流追踪的订单,7天从确认送达之日开始计算;对于没有追踪信息的订单,则从预计送达日期起计算7天。根据公告,当订单发货后,亚马逊平台会先收取并暂时保留买家付款,待七天保留期结束后才会将资金转入卖家可用余额。由于实际操作中还包含备货、打包时间以及通常1至2天的运输时间,因此多数订单的实际回款周期往往达到8至9天。部分卖家此前已接到通知并逐步过渡至该规则,此次调整旨在统一全球大多数卖家已采用的标准保留期。
亚马逊更新BSA协议,卖家需审查AI工具合规性
AMZ123获悉,近日,亚马逊宣布,将于2026年3月4日起更新《Amazon Services Business Solutions Agreement》(BSA亚马逊服务商业解决方案协议),并新增一项“Agent Policy(代理政策)”,对人工智能使用及自动化系统提出新的合规要求。同时,亚马逊还将对争议解决机制进行调整。亚马逊已于2月17日通过电子邮件和公告板通知卖家,要求卖家在新规生效前完成相关工具的合规审查,时间窗口为两周。根据公告,此次更新重点包括对AI和机器学习使用的限制。亚马逊将在BSA中新增条款,禁止使用亚马逊的材料或服务来开发或改进人工智能或机器学习模型,并加强对逆向工程行为的保护。
28天进账620w+!跨境卖家靠瑜伽服赚麻了
TikTok爆卖10万单,这件运动单品被美国人疯抢!
今日起!旧关税停止征收,10%临时关税生效
从“暂停”到“替代”,美国贸易政策正在进入新的不确定阶段。此前AMZ123在文章中提及,2025年10月底美国宣布延长对部分中国商品24%加征关税的暂停期限至一年,一度让跨境行业短暂找回了一点确定性。美国进口商重新补库存,卖家开始重谈报价,甚至有人认真讨论起“成本正常化”的可能。但如今春节刚过,美国贸易政策又突然踩下新的油门。AMZ123获悉,近日,美国海关与边境保护局(CBP)发布最新执行通知,宣布自2026年2月24日起停止征收依据《国际紧急经济权力法》(IEEPA)实施的一系列紧急关税措施。其中包括此前备受关注的“对等关税”、“芬太尼关税”,以及部分以国家紧急状态为依据推出的全球性临时关税安排。
高学历求职者,挤爆跨境电商!
每年春节过后的这两个月,历来是职场人神经最为敏感的时期。不少求职者们为了在即将到来的金三银四招聘旺季找到心仪的岗位,正穿梭于各大招聘平台。从近期业内消息来看,今年跨境电商行业的招聘格局正在发生改变:一是求职者的学历越来越高,从985、211高校毕业的比比皆是;二则是部分传统岗位的招聘需求出现了变化……在此境况下,一批担心自己“赶不上时代”的跨境求职者,陷入了焦虑。AMZ123了解到,年后企业陆续开工后,“求职”与“招聘”便成为了跨境行业的热议话题。
突发!加州总检察长指控亚马逊操纵价格
AMZ123获悉,近日,根据路透社的报道,加州总检察长罗伯·邦塔向法院申请一项初步禁令,要求立即制止亚马逊涉嫌通过胁迫第三方卖家、限制其在其他平台提供更低价格的行为,并指控亚马逊人为抬高了全美商品价格,最终损害消费者利益。这项禁令是针对亚马逊长达三年半的反垄断诉讼中的最新举措。邦塔在提交给旧金山加州高等法院的一份文件中指出,亚马逊的核心策略是压制市场上的价格竞争,以维持自身的盈利空间。调查发现,亚马逊及其竞争对手与商家之间存在无数暗中协调价格的协议。邦塔办公室称,这些协议旨在确保亚马逊在eBay、Target和沃尔玛等其他网站上的价格不被击败。
亚马逊墨西哥下调FBA佣金,推出网红达人计划
AMZ123获悉,近日,亚马逊墨西哥宣布,下调卖家佣金。此次调整涵盖物流服务、低价产品、分期付款政策以及新卖家入驻条件,显著降低了运营成本,为墨西哥创业者和小型企业提供了更有利的销售环境。根据公告,亚马逊墨西哥将FBA(亚马逊物流)低于299墨西哥比索的产品佣金平均下调51%,使卖家能够以更低成本提供快速可靠的Prime配送服务。对于日常必需品,如食品、健康和个人护理产品,每件商品的FBA佣金固定为6墨西哥比索,从而让卖家能够提供更多商品并保持竞争力价格。此外,使用FBA的卖家现在可为高于299墨西哥比索的商品提供免手续费的分期付款,提升高价值商品的销售便利性。
2025年出口额已突破千亿!SHEIN将投百亿建智慧供应链总部
AMZ123获悉,据媒体报道,2月24日,在广州召开的全省高质量发展大会上,时尚零售巨头SHEIN(希音)的创始人许仰天作为企业代表发言,分享了这家扎根广东的企业,如何用十年时间成长为全球时尚行业巨头的历程。他透露,2025年SHEIN平台出口额已突破千亿元大关,业务网络覆盖超过160个国家和地区。在许仰天看来,SHEIN独创的“小单快反”模式之所以能跑通,核心在于广东得天独厚的产业土壤。从番禺的服装制造车间,到白云的国际物流枢纽,省内高度集聚的产业链条,让一件衣服从设计稿到送达消费者手中的周期,能够被压缩到惊人的2至3周。他认为,这种速度正是广东制造极致效率与国际物流高效协同的产物。
《中企出海美国季度研究报告》PDF下载
近年来,随着全球化进程的深化与中国经济实力的持续提升,越来越多的中国企业将目光投向海外市场。美国作为全球最大经济体创新高地和消费市场,始终是中企出海战略中的关键目标。从制造业到科技领域,从消费品到金融服务,中国企业的国际化步伐不断加快,既彰显了“中国智造”的全球竞争力,也面临复杂的政策环境、文化差异与市场竞争等挑战。
《跨境蓝海拉美市场洞察 - 墨西哥篇》PDF下载
墨西哥位于北美大陆南部,北邻美国,政局稳定,法律健全,是拉丁美洲地区第一贸易大国和重要的外国直接投资目的地。墨西哥拥有 1.28亿人口,是仅次于巴西的拉美第二大经济体,同时也是拉美第三大线上零售市场,无论是互联网的普及率还是使用率在拉美市场都处于佼佼者。
《东南亚出海合规实操指南手册》PDF下载
近年来,东南亚电商市场以迅猛的增长态势成为全球贸易的新蓝海,印尼马来西亚、新加坡等六国凭借庞大的人口基数、持续提升的互联网渗透率吸引着无数中国卖家前来布局。
《2025中国新能源汽车产业链出海洞察报告 - 匈牙利篇》PDF下载
中国汽车市场新能源汽车渗透率已达50%,各主机厂纷纷开启价格战,让利消费者,并承担相应的利润损失,在中国新能源汽车市场逐渐成为红海的的大背景下,海逐渐成为各主机厂主动或被动的选择。
《2024哥伦比亚电商市场概览报告》PDF下载
哥伦比亚位于南美洲西北部,是拉丁美洲第三大国家,北部是加勒比海,东部与委内瑞拉接壤,东南方是巴西,南方是秘鲁和厄瓜多尔,西部是巴拿马和太平洋。

《2026独立站卖家日历》PDF下载
2026 独立站卖家日历 2026 全年营销节奏
《2025中东北非消费者数字经济报告》PDF下载
2025年的报告不仅持续跟踪数字经济的同比增长,也更深入:我们探讨了新兴技术对下一波数字化转型的影响力,还首次将中东北非国家及地区的消费者行为偏好与全球其他市场进行对比。
《2025年终大促旺季AI消费趋势报告》PDF下载
随着人工智能 AI的爆发式增长,如 ChatGPT、Perplexity 和Llama等交互式聊天机器人正在渐渐成为大众研究和推荐的首选工具。根据 AI智能体功能的更新迭代,目前已经可以完成网购下单、预订服务、及交易支付,现已被统称为 AI智能体电商Agentic Commerce,且其采用率正呈现出滚雪球式的增长。
欧洲电商资讯
AMZ123旗下欧洲跨境电商新闻栏目,专注欧洲跨境电商热点资讯,为广大卖家提供欧洲跨境电商最新动态、最热新闻。
亿邦动力网
消除一切电商知识鸿沟,每日发布独家重磅新闻。
AMZ123跨境电商
专注跨境行业热点事件报道,每日坚持推送原创深度热文
跨境数据中心
聚合海量跨境数据,输出跨境研究智慧。
跨境学院
跨境电商大小事,尽在跨境学院。
AMZ123会员
「AMZ123会员」为出海者推出的一站式私享服务
跨境科普达人
科普各种跨境小知识,科普那些你不知道的事...
AMZ123卖家导航
这个人很懒,还没有自我介绍
首页
跨境头条
文章详情
如何爬动态加载的页面?ajax爬虫你有必要掌握
任佳伟
2018-09-21 19:13
12922


通过前面几期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% 亚马逊卖家都在关注的微信公众号

二维码

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

回顶部