用Python获取Amazon亚马逊的商品信息

PHP · ipidea · 于 2个月前 发布 · 95 次阅读

引言 亚马逊网站相较于国内的购物网站,可以直接使用python的最基本的requests进行请求。访问不是过于频繁,在未触发保护机制的情况下,可以获取我们想要的数据。本次通过以下三部分简单介绍下基本爬取流程:

使用requests的get请求,获取亚马逊列表和详情页的页面内容 使用css/xpath对获取的内容进行解析,取得关键数据 动态IP的作用及其使用方法 一、获取亚马逊列表页的信息 以游戏区为例: 获取列表内能获取到的商品信息,如商品名,详情链接,进一步获取其他内容。 用requests.get()获取网页内容,设置好header,利用xpath选择器选取相关标签的内容:

1.import requests  
2.from parsel import Selector  
3.from urllib.parse import urljoin  
4.   
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; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MicroMessenger/6.5.19 NetType/4G Language/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.for node in nodes:  
15.    itemUrl = node.xpath("./@href").extract_first()  
16.    itemName = node.xpath("./div/h2/span/text()").extract_first()  
17.    if itemUrl and itemName:  
18.        itemUrl = urljoin(spiderurl,itemUrl)#用urljoin方法凑完整链接  
19.        print(itemUrl,itemName) 

此时已经获取的当前列表页目前能获得的信息:

二、获取详情页信息 进入详情页: 进入详情页之后,能获得更多的内容 用requests.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'] = itemUrl  
9.data['itemName'] = itemName  
10.data['itemPic'] = itemPic  
11.data['itemPrice'] = itemPrice  
12.data['itemInfo'] = itemInfo  
13.print(data)  

此时已经生成详情页数据的信息: 目前涉及到的就是最基本的requests请求亚马逊并用css/xpath获取相应的信息。 三、代理设置  目前,国内访问亚马逊会很不稳定,我这边大概率会出现连接不上的情况。如果真的需要去爬取亚马逊的信息,最好使用一些稳定的代理,我这边自己使用的是ipidea的代理,可以白嫖500M流量。如果有代理的话访问的成功率会高,速度也会快一点。
网址在这里:www.ipidea.net
代理使用有两种方式,一是通过api获取IP地址,还有用账密的方式使用,方法如下: 3.1.1 api获取代理

3.1.2 api获取ip代码

1.def getProxies():  
2.    # 获取且仅获取一个ip  
3.    api_url = '生成的api链接'  
4.    res = requests.get(api_url, timeout=5)  
5.    try:  
6.        if res.status_code == 200:  
7.            api_data = res.json()['data'][0]  
8.            proxies = {  
9.                'http': 'http://{}:{}'.format(api_data['ip'], api_data['port']),  
10.                'https': 'http://{}:{}'.format(api_data['ip'], api_data['port']),  
11.            }  
12.            print(proxies)  
13.            return proxies  
14.        else:  
15.            print('获取失败')  
16.    except:  
17.        print('获取失败')  

3.2.1 账密获取代理  因为是账密验证,所以需要去到账户中心填写信息创建子账户: 创建好子账户之后,根据账号和密码获取链接: 3.2.2 账密获取代理代码

1.# 获取账密ip  
2.def getAccountIp():  
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; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MicroMessenger/6.5.19 NetType/4G Language/zh_TW",  
8.    }  
9.    entry = 'http://{}-zone-custom{}:proxy.ipidea.io:2334'.format("帐号", "密码")  
10.    proxy = {  
11.        'http': entry,  
12.        'https': entry,  
13.    }  
14.    try:  
15.        res = requests.get(mainUrl, headers=headers, proxies=proxy, timeout=10)  
16.        if res.status_code == 200:  
17.            return proxy  
18.    except Exception as e:  
19.        print("访问失败", e)  
20.        pass  

使用代理之后,亚马逊商品信息的获取改善了不少,之前代码会报各种连接失败的错误,在requests请求之前调用代理获取的方法,方法return回代理ip并加入requests请求参数,就可以实现代理请求了。 四、全部代码

1.# coding=utf-8  
2.   
3.import requests  
4.from parsel import Selector  
5.from urllib.parse import urljoin  
6.   
7.def getProxies():  
8.    # 获取且仅获取一个ip  
9.    api_url = '生成的api链接'  
10.    res = requests.get(api_url, timeout=5)  
11.    try:  
12.        if res.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.            return proxies  
20.        else:  
21.            print('获取失败')  
22.    except:  
23.        print('获取失败')  
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; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MicroMessenger/6.5.19 NetType/4G Language/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.for node in nodes:  
36.    itemUrl = node.xpath("./@href").extract_first()  
37.    itemName = node.xpath("./div/h2/span/text()").extract_first()  
38.    if itemUrl and itemName:  
39.        itemUrl = urljoin(spiderurl,itemUrl)  
40.        proxies = getProxies()  
41.        res = requests.get(itemUrl, headers=headers, proxies=proxies)  
42.        content = 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'] = itemUrl  
49.        data['itemName'] = itemName  
50.        data['itemPic'] = itemPic  
51.        data['itemPrice'] = itemPrice  
52.        data['itemInfo'] = itemInfo  
53.        print(data)  

通过上面的步骤,可以实现最基础的亚马逊的信息获取。 目前只获得最基本的数据,若想获得更多也可以自行修改xpath/css选择器去拿到你想要的内容。而且稳定的动态IP能是你进行请求的时候少一点等待的时间,无论是编写中的测试还是小批量的爬取,都能提升工作的效率。以上就是全部的内容。

共收到 0 条回复
没有找到数据。
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册