直接调用阿里云接口爬取数据
人气:01、初次试探
接到任务,要爬取阿里云上所有拍卖的域名。本想试试scrapy,查看了下网页源码,没有找到要爬取的内容。大网站就是不一样啊,数据隐藏的这么深。
2、深入分析
从源码没看出蛛丝马迹,习惯性地打开了Chrome的调试界面,看看我提交请求时到底干了些啥,果然,露馅了!
原来域名列表是用js在前端渲染的,而不是在后端渲染的,用到了jsonp技术,用来解决Ajax跨域问题。点击search?fetchSearch…这个链接看个究竟:
原来数据是从domainapi.aliyun.com这个服务器获取的,还有个特殊的请求头:authority,内容为domainapi.aliyun.com。点击下“Response”,内容截图如下:
把内容复制到Sublime中,对比网页内容,的确是我需要爬取的数据。
3、有办法了
通过上面的研究,我已经知道如何爬取数据了。伪装浏览器调用接口直接抓取,而不是传统的解析网页这种方式。我用Firefox的HTTPRequester插件试了下,发现authority这个请求头是关键,如果不带这个请求头,则没有数据返回。保险起见,Cookie、User-Agent、Referer这几个请求头也带上,这样我们的爬虫程序跟用户用浏览器操作就几乎一模一样了。
原项目中已经有用到php的curl扩展来调用远程接口获取数据的函数,于是就用curl来抓取。请求参数根据项目需求来设置。处于保密考虑,代码就不公开了。其实抓取数据的整个HTTP过程在Chrome调试窗口中都可以看到,查阅下curl文档便能很快写出程序。抓取到的是json数据,很容易解析、入库。实际过程中如果是连续抓取,最好每次请求间隔随机0.5到1.0秒,不然怕露出马脚,被阿里云封ip。
4、经验总结
Chrome浏览器的调试功能确实强大,分析网页时多打开看看,对于分析网页在浏览器的行为和服务器的行为非常有用。
demo:
url https://www.aliyun.com/price/product?spm=5176.7921785.762131.price4.58ec4100bX3vYv
py文件
import requests import json ''' 1 https://buy.aliyun.com/ajax/CalculatorAjax/Product.jsonp?callback=jQuery1113011372632283758244_1536562364999&commodity_code=oss&spec_code=oss&_=1536562365009 ''' url_1 = 'https://buy.aliyun.com/ajax/CalculatorAjax/Product.jsonp?callback=jQuery1113011372632283758244_1536562364999&commodity_code=oss&spec_code=oss&_=1536562365009' headers = { 'content-type': 'application/javascript;charset=UTF-8', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 'cookie': 'cnz=/5RDE4w/7FYCAURp6T1y/Rq9; cna=VWlDE79w6zoCAT3paUSAYvUJ; UM_distinctid=16270f0a0c13e7-0e2a6b3f357c31-414f0120-15f900-16270f0a0c238a; _ga=GA1.2.748408075.1522312969; aliyun_choice=CN; login_aliyunid_pk=1404219454986883; aliyun_site=CN; consoleRecentVisit=ecs; buy_session_id=VM566DB1-JN0YY2QLVMF5KL1JZVHN1-RMBTPRLJ-K191; buy0=1AbLByOMHeZe3G41KYd5WRQKivyheOKEPbbAe%2Fhmro2tC8TIMMn22fQf%2BT0rycPVrIqjt4EUuWEC%2BocWkcdWe4%2BDHYWnUZeqXHCdnlN6BOgZ2KaUOw0oioWMvBHLPVYLt2daKaVsDnkYxlGiBlfR7w%3D%3D; login_aliyunid_csrf=_csrf_tk_1391536560895939; isg=BC8v8ZV7qDAZ5q0mluTPwEL6vkOVxOW90Nb_i0G8yx6lkE-SSaQTRi1mFsAL6Ftu', 'referer': 'https://www.aliyun.com/price/product?spm=5176.7921785.762131.price4.58ec4100bX3vYv', 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36', } resp = requests.get(url=url_1,headers=headers) text = resp.text.lstrip('jQuery1113011372632283758244_1536562364999(').rstrip(');') text = json.loads(text) print(text)
结果:
{'data': {'config': {'jump_restrict': {'value': 'false'}, 'aliyun_chargetype': {'value': 'POSTPAY'}, 'aliyun_bill': {'value': '按使用量后付费基础上提供资源包预付费'}, 'articleProductCode': {'value': 'oss'}, 'aliyun_billing': {'value': '存储量,流量,请求次数'}, 'aliyun_agreement': {'value': 'https://help.aliyun.com/document_detail/31821.html'}, 'aliyun_billinglink': {'value': 'https://www.aliyun.com/price/product#/oss/detail'}, 'business_strategy': {'value': 'HasControlAuth'}, 'price_expression': {'value': 'true'}, 'complete_order_url': {'value': '{"default":"cn-hangzhou*OssAdmin*oss-admin.aliyuncs.com*FillInstanceParam*2017-01-15"}'}, 'product_code': {'value': 'oss'}, 'product_name': {'value': '对象存储OSS'}, 'commonbuy_group': {'value': '[{"basicGroup":{"name":"基本配置","sortId":"1"},"orderGroup":{"name":"购买量","sortId":"2"}}]'}, 'aliyunProduceCode': {'value': 'oss'}, 'produce_url': {'value': '{"default":"cn-hangzhou*OssAdmin*oss-admin.aliyuncs.com*ProduceInstance*2017-01-15"}'}, 'product_id': {'value': '381121'}, 'aliyun_consolelink': {'value': 'https://oss.console.aliyun.com/index'}, 'pipCode': {'value': 'oss'}, 'aliyun_noprice': {'value': 'true'}}, 'constraints': {}, 'components': {'RegionSyncType': {'RegionSyncType': [{'text': '中国-中国', 'value': '0'}, {'text': '海外-海外', 'value': '1'}, {'text': '中国-海外', 'value': '2'}]}, 'LessthanMonthDatasize': {'LessthanMonthDatasize': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'sortId': 0, 'upgrade': False, 'displayUnit': 'GB', 'cloneShow': False, 'downgrade': False, 'code': 'LessthanMonthDatasize', 'tempUpgrade': False, 'apiCode': 'LessThanMonthDataSize', 'orderNeed': False, 'name': '低频访问(IA)/归档型存储短于30天的存储量', 'renewChange': False}, 'name': '低频访问(IA)/归档型存储短于30天的存储量', 'code': 'LessthanMonthDatasize', 'id': 103642802, 'unit': {'name': 'GB'}, 'globalKey': 'oss_LessthanMonthDatasize_LessthanMonthDatasize'}}, 'StorageType': {'StorageType': [{'text': '低频访问存储', 'value': 'IA'}, {'text': '归档存储', 'value': 'archive'}]}, 'DestRegion': {'DestRegion': [{'text': '华北 1', 'value': 'cn-qingdao'}, {'text': '华北 2', 'value': 'cn-beijing'}, {'text': '华北 3', 'value': 'cn-zhangjiakou'}, {'text': '华北 5', 'value': 'cn-huhehaote'}, {'text': '华东 1', 'value': 'cn-hangzhou'}, {'text': '华东 2', 'value': 'cn-shanghai'}, {'text': '华南 1', 'value': 'cn-shenzhen'}, {'text': '西南1(成都)', 'value': 'cn-chengdu'}, {'text': '香港', 'value': 'cn-hongkong'}, {'text': '亚太东北 1 (东京)', 'value': 'ap-northeast-1'}, {'text': '亚太东南 1 (新加坡)', 'value': 'ap-southeast-1'}, {'text': '亚太东南 2 (悉尼)', 'value': 'ap-southeast-2'}, {'text': '亚太东南 3 (吉隆坡)', 'value': 'ap-southeast-3'}, {'text': '亚太东南 5 (雅加达)', 'value': 'ap-southeast-5'}, {'text': '亚太南部 1 (孟买)', 'value': 'ap-south-1'}, {'text': '美国东部 1 (弗吉尼亚)', 'value': 'us-east-1'}, {'text': '美国西部 1 (硅谷)', 'value': 'us-west-1'}, {'text': '中东东部 1 (迪拜)', 'value': 'me-east-1'}, {'text': '欧洲中部 1 (法兰克福)', 'value': 'eu-central-1'}]}, 'ChargedDatasize': {'ChargedDatasize': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'sortId': 0, 'upgrade': False, 'displayUnit': 'GB', 'cloneShow': False, 'downgrade': False, 'code': 'ChargedDatasize', 'tempUpgrade': False, 'apiCode': 'IaOrAchieveChargedStorage', 'orderNeed': False, 'name': '低频访问(IA)/归档型的存储容量', 'renewChange': False}, 'name': '低频访问(IA)/归档型的存储容量', 'code': 'ChargedDatasize', 'id': 103642801, 'unit': {'name': 'GB'}, 'globalKey': 'oss_ChargedDatasize_ChargedDatasize'}}, 'ReplicationDatasize': {'ReplicationDatasize': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'upgrade': False, 'displayUnit': '', 'cloneShow': False, 'downgrade': False, 'code': 'ReplicationDatasize', 'tempUpgrade': False, 'apiCode': 'ReplicationDatasize', 'orderNeed': False, 'name': '跨区域数据复制流量(新)', 'renewChange': False}, 'name': '跨区域数据复制流量(新)', 'code': 'ReplicationDatasize', 'id': 1018050108605722, 'unit': {'name': ''}, 'globalKey': 'oss_ReplicationDatasize_ReplicationDatasize'}}, 'oss_flow_in': {'oss_flow_in': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'upgrade': False, 'displayUnit': '', 'cloneShow': False, 'downgrade': False, 'code': 'oss_flow_in', 'tempUpgrade': False, 'apiCode': '', 'unit': 'GB', 'orderNeed': False, 'name': '外网流入流量', 'renewChange': False}, 'name': '外网流入流量', 'code': 'oss_flow_in', 'id': 3554251, 'unit': {'name': '', 'code': 'GB'}, 'globalKey': 'oss_oss_flow_in_oss_flow_in'}}, 'ProcessI': {'ProcessI': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'sortId': 0, 'upgrade': False, 'displayUnit': '', 'cloneShow': False, 'downgrade': False, 'code': 'ProcessI', 'tempUpgrade': False, 'apiCode': 'VedioSnapshot', 'orderNeed': False, 'name': '视频截帧', 'renewChange': False}, 'name': '视频截帧', 'code': 'ProcessI', 'id': 103642803, 'unit': {'name': ''}, 'globalKey': 'oss_ProcessI_ProcessI'}}, 'oss_flow_out': {'oss_flow_out': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'upgrade': False, 'displayUnit': '', 'cloneShow': False, 'downgrade': False, 'code': 'oss_flow_out', 'tempUpgrade': False, 'apiCode': 'InternetTrafficOut', 'unit': 'GB', 'orderNeed': False, 'name': '外网流出流量', 'renewChange': False}, 'name': '外网流出流量', 'code': 'oss_flow_out', 'id': 3554247, 'unit': {'name': '', 'code': 'GB'}, 'globalKey': 'oss_oss_flow_out_oss_flow_out'}}, 'ProcessImgSize': {'ProcessImgSize': {'extendParams': {'show': False, 'downgrade': False, 'specUpgrade': False, 'needTransmit': False, 'sortId': 0, 'upgrade': False, 'displayUnit': '', 'noLabel': False, 'code': 'ProcessImgSize', 'apiCode': 'ProcessImgSize', 'orderNeed': False, 'name': '图片处理'}, 'name': '图片处理', 'code': 'ProcessImgSize', 'id': 103107411, 'unit': {'name': ''}, 'globalKey': 'oss_ProcessImgSize_ProcessImgSize'}}, 'oss_cdn_flow_out': {'oss_cdn_flow_out': {'extendParams': {'show': False, 'downgrade': False, 'specUpgrade': False, 'needTransmit': False, 'upgrade': False, 'displayUnit': '', 'noLabel': False, 'code': 'oss_cdn_flow_out', 'apiCode': 'CdnOut', 'unit': 'GB', 'orderNeed': False, 'name': 'CDN回源流量'}, 'name': 'CDN回源流量', 'code': 'oss_cdn_flow_out', 'id': 100268604, 'unit': {'name': '', 'code': 'GB'}, 'globalKey': 'oss_oss_cdn_flow_out_oss_cdn_flow_out'}}, 'SyncIn': {'SyncIn': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'sortId': 0, 'upgrade': False, 'displayUnit': '', 'downgrade': False, 'code': 'SyncIn', 'apiCode': 'SyncTrafficAcrossRegion', 'unit': 'GB', 'orderNeed': False, 'name': '跨区域数据复制流量'}, 'name': '跨区域数据复制流量', 'code': 'SyncIn', 'id': 101949780, 'unit': {'name': '', 'code': 'GB'}, 'globalKey': 'oss_SyncIn_SyncIn'}}, 'SourceRegion': {'SourceRegion': [{'text': '华北 1', 'value': 'cn-qingdao'}, {'text': '华北 2', 'value': 'cn-beijing'}, {'text': '华北 3', 'value': 'cn-zhangjiakou'}, {'text': '华北 5', 'value': 'cn-huhehaote'}, {'text': '华东 1', 'value': 'cn-hangzhou'}, {'text': '华东 2', 'value': 'cn-shanghai'}, {'text': '华南 1', 'value': 'cn-shenzhen'}, {'text': '西南1(成都)', 'value': 'cn-chengdu'}, {'text': '香港', 'value': 'cn-hongkong'}, {'text': '亚太东北 1 (东京)', 'value': 'ap-northeast-1'}, {'text': '亚太东南 1 (新加坡)', 'value': 'ap-southeast-1'}, {'text': '亚太东南 2 (悉尼)', 'value': 'ap-southeast-2'}, {'text': '亚太东南 3 (吉隆坡)', 'value': 'ap-southeast-3'}, {'text': '亚太东南 5 (雅加达)', 'value': 'ap-southeast-5'}, {'text': '亚太南部 1 (孟买)', 'value': 'ap-south-1'}, {'text': '美国东部 1 (弗吉尼亚)', 'value': 'us-east-1'}, {'text': '美国西部 1 (硅谷)', 'value': 'us-west-1'}, {'text': '中东东部 1 (迪拜)', 'value': 'me-east-1'}, {'text': '欧洲中部 1 (法兰克福)', 'value': 'eu-central-1'}]}, 'oss_get_request': {'oss_get_request': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'upgrade': False, 'displayUnit': '', 'cloneShow': False, 'downgrade': False, 'code': 'oss_get_request', 'tempUpgrade': False, 'apiCode': 'GetRequest', 'unit': 'WP', 'orderNeed': False, 'name': '请求费用(GET类型的请求次数)', 'renewChange': False}, 'name': '请求费用(GET类型的请求次数)', 'code': 'oss_get_request', 'id': 3554248, 'unit': {'name': '', 'code': 'WP'}, 'globalKey': 'oss_oss_get_request_oss_get_request'}}, 'oss_put_request': {'oss_put_request': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'upgrade': False, 'displayUnit': '', 'cloneShow': False, 'downgrade': False, 'code': 'oss_put_request', 'tempUpgrade': False, 'apiCode': 'PutRequest', 'unit': 'wp', 'orderNeed': False, 'name': '请求费用(PUT类型的请求次数)', 'renewChange': False}, 'name': '请求费用(PUT类型的请求次数)', 'code': 'oss_put_request', 'id': 3554249, 'unit': {'name': '', 'code': 'wp'}, 'globalKey': 'oss_oss_put_request_oss_put_request'}}, 'ord_time': {'ord_time': {'extendParams': {'upgrade': False, 'code': 'ord_time', 'needTransmit': False, 'show': False, 'orderNeed': False, 'name': '计费周期', 'displayUnit': ''}, 'name': '计费周期', 'code': 'ord_time', 'id': 1017010104446248, 'unit': {'name': ''}, 'globalKey': 'oss_ord_time_ord_time'}}, 'commodity_type': {'commodity_type': [{'text': '对象存储OSS', 'value': 'oss'}]}, 'oss_region': {'oss_region': [{'text': '华北 1', 'value': 'cn-qingdao'}, {'text': '华北 2', 'value': 'cn-beijing'}, {'text': '华北 3', 'value': 'cn-zhangjiakou'}, {'text': '华北 5', 'value': 'cn-huhehaote'}, {'text': '华东 1', 'value': 'cn-hangzhou'}, {'text': '华东 2', 'value': 'cn-shanghai'}, {'text': '华南 1', 'value': 'cn-shenzhen'}, {'text': '西南1(成都)', 'value': 'cn-chengdu'}, {'text': '香港', 'value': 'cn-hongkong'}, {'text': '亚太东北 1 (东京)', 'value': 'ap-northeast-1'}, {'text': '亚太东南 1 (新加坡)', 'value': 'ap-southeast-1'}, {'text': '亚太东南 2 (悉尼)', 'value': 'ap-southeast-2'}, {'text': '亚太东南 3 (吉隆坡)', 'value': 'ap-southeast-3'}, {'text': '亚太东南 5 (雅加达)', 'value': 'ap-southeast-5'}, {'text': '亚太南部 1 (孟买)', 'value': 'ap-south-1'}, {'text': '美国东部 1 (弗吉尼亚)', 'value': 'us-east-1'}, {'text': '美国西部 1 (硅谷)', 'value': 'us-west-1'}, {'text': '中东东部 1 (迪拜)', 'value': 'me-east-1'}, {'text': '欧洲中部 1 (法兰克福)', 'value': 'eu-central-1'}]}, 'oss_storage': {'oss_storage': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'upgrade': False, 'displayUnit': '', 'cloneShow': False, 'downgrade': False, 'code': 'oss_storage', 'tempUpgrade': False, 'apiCode': 'Storage', 'unit': 'GB', 'orderNeed': False, 'name': '标准型存储容量', 'renewChange': False}, 'name': '标准型存储容量', 'code': 'oss_storage', 'id': 3554250, 'unit': {'name': '', 'code': 'GB'}, 'globalKey': 'oss_oss_storage_oss_storage'}}, 'RetrievalData': {'RetrievalData': {'extendParams': {'show': False, 'noLabel': False, 'specUpgrade': False, 'needTransmit': False, 'sortId': 0, 'upgrade': False, 'displayUnit': 'GB', 'cloneShow': False, 'downgrade': False, 'code': 'RetrievalData', 'tempUpgrade': False, 'apiCode': 'RetrievalData', 'orderNeed': False, 'name': '数据取回', 'renewChange': False}, 'name': '数据取回', 'code': 'RetrievalData', 'id': 103642804, 'unit': {'name': 'GB'}, 'globalKey': 'oss_RetrievalData_RetrievalData'}}}}, 'success': True, 'code': 200}
加载全部内容