引言
亚马逊网站相较于国内的购物网站,可以直接使用python的最基本的requests进行请求。访问不是过于频繁,在未触发保护机制的情况下,可以获取我们想要的数据。本次通过以下三部分简单介绍下基本爬取流程:
使用requests的get请求,获取亚马逊列表和详情页的页面内容
使用css/xpath对获取的内容进行解析,取得关键数据
动态IP的作用及其使用方法
一、获取亚马逊列表页的信息
以游戏区为例:
获取列表内能获取到的商品信息,如商品名,详情链接,进一步获取其他内容。
用requests.get()获取网页内容,设置好header,利用xpath选择器选取相关标签的内容:
1. import requests2. 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获取相应的信息。
三、代理设置
目前,国内访问亚马逊会很不稳定,我这边大概率会出现连接不上的情况。如果真的需要去爬取亚马逊的信息,最好使用一些稳定的代理
代理使用有两种方式,一是通过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. # 获取账密ip2. 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-82.
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能是你进行请求的时候少一点等待的时间,无论是编写中的测试还是小批量的爬取,都能提升工作的效率。以上就是全部的内容。