介绍 相对于国内的购物网站,Amazon.com可以直接使用python最基本的requests进行请求。访问不是太频繁,不需要触发保护机制就可以获取到我们想要的数据。本次,以下三个部分简单介绍一下基本的爬取流程: 使用requests的get请求获取亚马逊列表和详情页面的页面内容 使用css/xpath解析获取到的内容并获取keydata 动态IP的作用及使用方法 1.获取亚马逊列表页的信息 以游戏区为例:更进一步获取更多内容。 使用requests.get()获取网页内容,设置header,使用xpath选择器选择相关标签的内容: 1.importrequests2.fromparselimportSelector3.fromurllib.parseimporturljoin4.5.spiderurl='https://www.amazon.com/s?i=videogames-intl-ship'6.headers={7.“authority”:“www.amazon.com”,8.“user-agent”:Mozilla/5.0(iPhone;CPUiPhoneOS10_3_3likeMacOSX)AppleWebKit/603.3.8(KHTML,lGecko)移动/14G60MicroMessenger/6.5.19NetType/4G语言/zh_TW",9.}10.resp=requests.get(spiderurl,headers=headers)11.content=resp.content.decode('utf-8')12.select=Selector(text=content)13.nodes=select.xpath("//a[@title='product-detail']")14.fornodeinnodes:15.itemUrl=node.xpath("./@href").extract_first()16.itemName=node.xpath("./div/h2/span/text()").extract_first()17.ifitemUrl和itemName:18.itemUrl=urljoin(spiderurl,itemUrl)#用urljoin方法凑齐链接19.print(itemUrl,itemName) 此时获取到的当前列表页当前可用的信息: 2.获取详情页信息 进入详情页: 进入详情页后可以获取更多内容 与请求。get()获取网页内容,css选择相关标签的内容:1.res=requests.get(itemUrl,headers=headers)2.content=res.content.decode('utf-8')3.Select=Selector(text=content)4.itemPic=Select.css('#main-image::attr(src)').extract_first()5.itemPrice=Select.css('.a-offscreen::text').extract_first()6.itemInfo=Select.css('#feature-bullets').extract_first()7.data={}8.data['itemUrl']=itemUrl9.data['itemName']=itemName10.data['itemPic']=itemPic11.data['itemPrice']=itemPrice12.data['itemInfo']=itemInfo13.print(data) 详情页数据信息已生成这次: 目前涉及的最基本的请求就是请求亚马逊,使用css/xpath获取相应的信息。 3.代理设置 目前国内访问亚马逊会很不稳定,大概率连不上我。如果你真的需要爬亚马逊的信息,最好使用一些稳定的代理。我这里用ipidea代理,可以白嫖500M流量。如果有代理的话,接入的成功率会更高,速度也会更快。 网址在这里:www.ipidea.net 使用代理有两种方式,一种是通过api获取IP地址,另一种是通过隐秘方式使用。方法如下: 3.1.1apigetproxy 3.1.2apigetipcode1.defgetProxies():2.#获取并且只获取一个ip3.api_url='generatedapilink'4.res=requests.get(api_url,timeout=5)5.try:6.ifres.status_code==200:7.api_data=res.json()['data'][0]8.proxies={9.'http':'://{}:{}'.format(api_data['ip'],api_data['port']),10.'https':'http://{}:{}'.format(api_data['ip'],API_DATA['端口']),11.}12.价格(代理)13.返回代理14.else:15.打印('获取失败')16.除外:打印('获取失败') 3.2.1账号密码获取代理 因为是账号密码验证,创建子账号需要到账号中心填写信息: 创建子账号后,获取链接根据账号和密码: 3.2.2accountsecret获取proxy代码 1.#获取accountsecretip2.defgetAccountIp():3.#测试完成后返回proxy代理4.mainUrl='https://api.myip.la/en?json'5.headers={6."Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",7."User-Agent":"Mozilla/5.0(iPhone;CPUiPhoneOS10_3_3likeMacOSX)AppleWebKit/603.3.8(KHTML,likeGecko)Mobile/14G60MicroMessenger/6.5.19NetType/4GLanguage/zh_TW",8.}9.entry='http://{}-zone-custom{}:proxy.ipidea.io:2334'.format("account","password")10.proxy={11.'http':入口,12.'https':入口,13.}14.尝试:15.res=requests.get(mainUrl,headers=headers,proxies=proxy,timeout=10)16.如果res。status_code==2:17.returnproxy18.Exceptionase:19.print("Accessfailed",e)20.pass 使用代理后,对亚马逊商品信息的获取有了很大的提升。前面的代码会报各种连接失败的错误。代理获取方法在requests请求之前被调用。该方法返回代理ip,加上requests请求参数,实现代理。要求。 4.所有代码 1.#coding=utf-82.3.importrequests4.fromparselimportSelector5.fromurllib.parseimporturljoin6.7.defgetProxies():8.#获取且只获取一个ip9.api_url='生成的api链接'10.res=requests.get(api_url,timeout=5)11.try:12.ifres.status_code==200:13.api_data=res.json()['data'][0]14.proxies={15.'http':'http://{}:{}'.format(api_data['ip'],api_data['port']),16.'https':'http://{}:{}'.format(api_data['ip'],api_data['port']),17.}18.print(proxies)19.返回代理20.else:21.打印失败('')22.except:23.print('Getfailed')24.25.spiderurl='https://www.amazon.com/s?i=videogames-intl-ship'26.headers={27."authority":"www.amazon.com",28."user-agent":"Mozilla/5.0(iPhone;CPUiPhoneOS10_3_3likeMacOSX)AppleWebKit/603.3.8(KHTML,如Gecko)Mobile/14G60MicroMessenger/6.5.19NetType/4GLanguage/zh_TW",29.}30.proxies=getProxies()31.resp=requests.get(spiderurl,headers=headers,proxies=proxies)32.content=resp.content.decode('utf-8')33.select=Selector(text=content)34.nodes=select.xpath("//a[@title='product-detail']")35.fornodeinnodes:36.itemUrl=node.xpath("./@href").extract_first()37.itemName=node.xpath("./div/h2/span/text()").extract_first()38。如果itemurl和itemName:39。itemurl=urljoin(spiderurl,itemurl)40。proxies=getProxies()41。res=requests.gets.get(itemurl,headers=headers=headers,proxies=proxies=proxies=proxies)42。内容=res。content.decode('utf-8')43.Select=Selector(text=content)44.itemPic=Select.css('#main-image::attr(src)').extract_first()45.itemPrice=Select.css('.a-offscreen::text').extract_first()46.itemInfo=Select.css('#feature-bullets').extract_first()47.data={}48.data['itemUrl']=itemUrl49.data['itemName']=itemName50.data['itemPic']=itemPic51.data['itemPrice']=itemPrice52.data['itemInfo']=itemInfo53.print(data)通过以上步骤,可以实现最基本的亚马逊信息获取。 目前只获取最基本的数据,如果想获取更多,可以修改xpath/css选择器获取自己想要的内容。而且,稳定的动态IP可以减少请求时的等待时间。无论是书面测试还是小批量爬取,都可以提高工作效率。这里的所有都是它的。
