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

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

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


通过前面几期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跨境头条,如有疑问,请联系客服。
最新热门报告作者标签
俄罗斯电商市场快速增长,综合平台优势大于独立站
AMZ123获悉,近日,Euromonitor、EMARKETER及Yakov and Partners发布了《俄罗斯电商市场发展现状》报告。报告基于2020-2024年的数据,对俄罗斯电商市场的发展趋势、综合电商平台与独立电商的竞争格局、各品类表现、未来市场预测进行了系统分析。一、俄罗斯电商趋势1.互联网渗透率增长放缓2020至2024年,俄罗斯互联网使用率从78.1%(约9560万用户)提升至85.5%(约1.04亿用户),四年间增加7.4%(新增约790万用户)。俄罗斯的互联网渗透率增速正在逐年放缓,预计到2029年互联网渗透率将达到89%(约1.08亿用户)。
越南加强进口商品监管,修订多项增值税和海关规则
AMZ123获悉,近日,越南海关公布了2026年对增值税(VAT)、特别消费税(SCT)及电子交易管理的多项修订,核心在于统一税制规则、扩大免税范围并加强跨境与电子化申报管理。此次调整既有减轻企业合规成本、扶持出口与产业链升级的内容,也伴随对部分消费品与临时进口再出口环节的更严监管,直接影响生产、进出口和跨境电商卖家。在增值税方面,新法律将此前零散的官方函件并入法律和配套法令,提升透明度并便于电子化处理。关键变化包括扩大增值税免税目录:列入政府清单的自然资源与矿产(无论原料还是加工品)在出口时被明确归为增值税免税项目。
TikTok Shop黑五复盘,一堆中国卖家晒出百万GMV
黑五复盘,TikTok卖家:“库存差点给我爆完了!”
存生命危险!美国CPSC紧急召回超1万件儿童手写板玩具
AMZ123获悉,近日,美国消费品安全委员会(CPSC)宣布,紧急召回亚马逊在售的KTEBO品牌的儿童书写板玩具,原因是该产品未能符合玩具类产品的强制性安全标准,电池仓固定螺丝无法保持牢固,可能导致纽扣电池外露。若儿童误吞纽扣电池,可能造成严重伤害、内部化学灼伤,甚至威胁生命。此次召回涉及KTEBO品牌的双件套书写平板玩具,召回数量约10,380件,产品提供四种颜色组合,包括粉色/蓝色、绿色/黄色、橙色/蓝色以及紫色/红色,并有8.5英寸与10英寸两种规格,每套配有与机身同色的手写笔。
AliExpress波兰11月增长显著,双十一活动日活用户增长37%
AMZ123获悉,近日,AliExpress的数据显示,平台11月的消费者参与度与卖家销售额大幅增长。今年11月11日至19日举行的AliExpress双十一购物节活动期间,波兰用户的参与度显著提升,日活跃用户数量同比增长37%。随着去年秋季AliExpress开放波兰本地卖家入驻,今年波兰本地卖家的参与度也明显提高,他们在此次双十一促销期间的GMV同比增长74%。从消费偏好来看,智能生活类产品持续吸引波兰消费者,智能家居与清洁设备成为销售榜单的主导品类。Dreame、ILIFE、Laresar等品牌的扫地机器人和自动吸尘设备进入最畅销产品行列,反映波兰家庭对智能化、便捷化生活方式的需求不断上升。
亚马逊印度计划投资127亿美元,推动本地云和AI基础设施建设
AMZ123获悉,近日,亚马逊宣布,将在2030年前进一步推动人工智能在印度的普及,计划投入127亿美元建设本地云和AI基础设施。亚马逊表示,这项长期投资将为超过1500万家中小企业带来AI应用能力,同时在2030年前为400万名公立学校学生提供AI素养课程与职业教育,提高数字技能普及度。亚马逊认为,AI正成为提升印度数字包容性的关键力量,能够突破语言、读写能力与访问渠道的限制,让更多个人与企业受益。在中小企业领域,亚马逊正在推出新一代AI工具,以降低经营门槛、简化业务操作并提升增长效率。
“黑五网一”DTC投放数据复盘,流量都去哪了?
2025 年“黑五网一”大战,终于落下帷幕。除了 GMV ,这场仗花了多少“弹药”,你算清楚了吗?流量场上的每一发子弹,都正中靶心了吗?偏离的原因找到了吗?除了看自己后台的数据,还要看清整个大盘的趋势——这决定了我们下一步该往哪儿走。基于 GoodsFox 监控的投放数据,我们有以下发现:服装、美妆的竞争力度只增不减3D 打印与机械键盘,从“小众圈层”跃升为热门赛道宠物经济的流量稳定,不靠爆点也能撑起大盘这些变化背后,都在重塑今年“黑五网一”的投放结构,我们先从流量基本盘讲起——尽管每年都有新风口,但从广告投放的绝对体量来看,传统大盘仍在支撑整体流量水位。
还在“索评”?亚马逊Review管理的红线与出路
亚马逊的评论管理格局是如何改变的?首先要明确一点:过去几年,亚马逊的Review生态系统发生了剧变,这对各类管理工具产生了深远影响。在买家端,那些专门用来标记“虚假评论”(或帮助买家鉴别真伪)的老一代工具正在失效甚至消失。不少买家就因为Fakespot在平台冲突、合规问题和数据接口变更的压力下关停而感到措手不及。Fakespot是一个分析电商产品评论真实性、帮助消费者识别虚假评价的平台。在卖家端,亚马逊的政策合规和风控机制变得更加严厉。这意味着Review的风险红线变了:以前那些“地毯式索评”或“送测(Giveaway)”的套路可能有效,但现在操作这些手段的封号风险极高。
AMZ123PayPal计算器使用指南及常见问题详解(内附计算公式)
Paypal手续费计算器介绍及计算公式分享 https://www.amz123.com/tools-paypal
重磅!亚马逊公布2026年战略重心变化
AMZ123获悉,12月4日,2025年亚马逊全球开店跨境峰会上,亚马逊回顾了过去一年里中国卖家在亚马逊上所取得的进展,并围绕2026年四大业务战略重点——供应链服务、AI赋能、全球拓展布局、本地服务,揭晓了40余项创新举措。根据亚马逊披露的数据:2025年以来,中国卖家通过亚马逊全球站点售出数十亿件商品,在美欧等成熟站点的销售额增长超过15%,在新兴站点的销售额增长超过30%;2025年以来,销售额达到200万、500万、800万美金的中国卖家数量,增长均超过20%;销售额超过1000万美金的中国卖家数量,增幅近30%。
卖家还在等口径!欠税公示制度却已明确落地
卖家还在“等政策”,但政策已明确趋严过去几个月里,跨境卖家对税务政策最大的期待就是——“能不能再等等,看会不会有新口径”。但事实上,政策并没有往宽松走,而是沿着“数据透明—提醒申报—强化监管”这条路径一步步推进。AMZ123了解到,目前已有超过7000家境内外平台完成涉税信息报送,卖家的线上线下销售数据已全面纳入监管体系。随着数据比对展开,税务部门对申报明显低于平台数据的经营者陆续发出提示,要求补充申报;多数卖家在收到提示后完成了更正,但也的确还有部分经营者迟迟没有动作,继续处于观望甚至低申报的状态。在这种情况下,监管的态度也开始变得更为明确:对于未按规定申报的行为,将从提醒阶段进入到强化管理阶段。
亚马逊新功能,能救你一整条链接!
最近有卖家后台发现,亚马逊多了一个新功能,看起来不起眼,实则很关键——绩效提醒(Performance Notifications)。这个功能解决了我们运营过程中的一个老大难:链接出问题时能不能第一时间被提醒?以前我们发现Listing出状况,大多靠“事后诸葛”:出单突然断了,去查是不是被下架;关键词排名一夜暴跌,才想起去对比转化率;广告Acos拉爆、CTR异常,才知道图可能挂了;等你发现问题,可能已经晚了。这次,亚马逊终于“良心发现”,开始主动提醒你链接的数据异常了。这个新功能到底能干啥?说白了,它就是一个链接级别的数据异常预警系统。
汽配类目又现吸金王,TikTok卖家30天入账1100万
月销量暴涨36007900%,这一汽配用品在TikTok卖爆了
跨界AI失败?深圳大卖资产重组终止!
12月2日,跨境3C 配件大卖杰美特发布公告,宣布决定终止筹划以现金方式收购AI 算力解决方案提供商思腾合力(天津)科技有限公司(以下简称“思腾合力”)控制权的重大资产重组事项。这场筹划半年、备受行业关注的跨界收购突然落幕,消息一出引发市场热议。AMZ123获悉,杰美特于2025年6月21日首次披露了筹划重组的提示性公告,拟通过现金交易控股思腾合力,该交易初步测算构成重大资产重组,且不涉及发行股份、不构成关联交易,也不会导致公司控制权变更。杰美特是“中国手机壳第一股”,主营业务为移动智能终端保护类产品的研发、设计与销售,产品包括手机、平板及穿戴设备的保护壳与表带等。
宠物消费持续升温,亚马逊10款月销过万宠物产品推荐
AMZ123获悉,近日,亚马逊各类产品搜索量增长显著,以下10款产品在亚马逊上销量表现突出,深受消费者欢迎。1. 猫咪情绪舒缓喷雾预计销售额:139.84万美元/月销量:26,000+星级评分:4.4好评数量:12,694+图源:亚马逊产品描述:FELIWAY Optimum猫咪情绪舒缓喷雾的专利信息素复合物能显著减少猫咪的应激表现,包括喷尿、抓挠、恐惧反应、紧张冲突等。产品无药性、安全且不干扰人类与其他宠物,每个喷雾覆盖面积约 700 平方英尺。
TikTok Shop英国站黑五创历史新高,销售额同比飙升50%
AMZ123获悉,近日,根据TikTok的公告,TikTok Shop英国站在今年黑色星期五期间创下平台历史最高销售纪录,整体销售额较去年同期提升50%。高峰期出现在黑色星期五当天,当日每秒售出27件商品,刷新TikTok Shop在英国的单日销售纪录。今年消费者开始促销季的时间更早,“假黑五”(Fake Friday,即黑五前一周)的销售额达到去年黑色星期五的纪录水平。黑五周末期间,“TikTok Shop Black Friday”搜索量同比增长404%,成为2025年与黑五相关的最高热度搜索词。同期,平台活跃购物人数较去年增加28%。
《亚马逊生活日用品类攻略手册》PDF下载
作为日常生活不可或缺的重要组成,生活百货品类覆盖范围广泛,包括家居用品、家具、车用配件、户外装备、园艺 工具、运动器材、家装用品、厨房、玩具以及宠物用品等众多领域。这类产品不仅是满足基本生活所需,更体现了人们对美好生活的向往和追求。
《掘金泰国-市场洞察与战略机遇报告2025》PDF下载
随着全球经济一体化的加速,泰国作为东盟的核心枢纽,凭借其独特的地缘优势庞大的消费市场以及持续优化的营商环境,成为众多企业战略布局的重要目标。本报告深入剖析泰国市场的政策红利、消费趋势、产业机遇以及合规挑战,旨在为有志于开拓泰国市场的中国企业提供行动指南,助力企业在东盟这片充满活力的土地上把握机遇、应对挑战、!实现可持续发展。
《2025欧美假日购物季营销指南》PDF下载
2025年美国假日购物季零售额预计同比仅增长1.2%,总销售额约1.359万亿美元,虽仍保持正增长,但为2009年以来最低增速,市场正在步入低增长的新常态。
《2025年跨境电商东南亚市场进入战略白皮书》PDF下载
东南亚电商,正以惊人的速度复刻中国电商高速增长的黄金时代。2024年东南亚电商GMV达到1284亿美元,短短5年涨幅超过3倍。全球电商2024年GMV增幅最快的十大市场中,东南亚独占四席。东南亚是拥有约6.7亿人口的广阔市场,在现今全球关税的不确定性大格局下,因其电商基建完善,利好的贸易政策,和更高的年轻人口占比,成为跨境卖家生意拓张焦点之一。
《2025年TikTok Shop玩具品类行业报告(欧美站)》PDF下载
分析TikTok Shop美国市场、英国市场、西班牙市场、墨西哥市场等主流市场点短视频及直播电商数据,选取TikTok与玩具爱好品类相关的内容进行分析报告。
《2025 洗护品类趋势与创新洞察》PDF下载
本报告独特价值:将消费者的“行为结果”据),揭示消费者深层心理动机、并能精准预判未来增长机会
《亚马逊双轨增长指南》PDF下载
亚马逊以“以客户为中心”为核心理念,通过整合B2B与B2C的全渠道服务,帮助卖家实现“一店双拓”-- 一次上架,同步触达个人消费者与企业买家,获得双重收益。同时,基于Direct to Buyer(直接触达买家)的模式,更能有效减少中间环节,提升利润空间与品牌掌控力。
《亚马逊全球线上商采趋势与区域洞察》PDF下载
随着全球企业数字化转型的深入推进,B2B商采有望成为下一个万亿级别的蓝海市场然而,中国卖家在开拓海外企业商采市场时往往面临着一个关键挑战:难以准确把握海外企业买家的商采行为和决策模式。这种认知偏差不仅影响了产品开发方向,也制约了市场拓展策略的制定。
AMZ123选品观察员
选品推荐及选品技巧分享。
侃侃跨境那些事儿
不侃废话,挣钱要紧!
亚马逊公告
AMZ123旗下亚马逊公告发布平台,实时更新亚马逊最新公告,致力打造最及时和有态度的亚马逊公告栏目!
AMZ123跨境电商
专注跨境行业热点事件报道,每日坚持推送原创深度热文
亚马逊全球开店
亚马逊全球开店官方公众号,致力于为中国跨境卖家提供最新,最全亚马逊全球开店资讯,运营干货分享及开店支持。
跨境学院
跨境电商大小事,尽在跨境学院。
AMZ123会员
「AMZ123会员」为出海者推出的一站式私享服务
AMZ123卖家导航
这个人很懒,还没有自我介绍
首页
跨境头条
文章详情
如何爬动态加载的页面?ajax爬虫你有必要掌握
任佳伟
2018-09-21 19:13
12341


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

二维码

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

回顶部