Par rapport aux sites Web d'achats nationaux, le site Web d'Amazon peut utiliser directement les requêtes les plus élémentaires de python pour effectuer des requêtes. L'accès n'est pas trop fréquent et les données souhaitées peuvent être obtenues sans déclencher le mécanisme de protection. Cette fois, nous présenterons brièvement le processus d'exploration de base à travers les trois parties suivantes :
Utilisez la requête get des requêtes pour obtenir le contenu de la page de liste et de détails Amazon
Utilisez css/xpath pour analyser le contenu obtenu et obtenir les données clés
Le rôle de l'IP dynamique et comment l'utiliser
Prenez la zone de jeu comme exemple :
Obtenez les informations sur le produit qui peuvent être obtenues dans la liste, telles que le nom du produit, le lien de détails et un accès supplémentaire à d'autres contenus.
Utilisez request.get() pour obtenir le contenu Web, définissez l'en-tête et utilisez le sélecteur XPath pour sélectionner le contenu des balises pertinentes :
import requests from parsel import Selector from urllib.parse import urljoin spiderurl = 'https://www.amazon.com/s?i=videogames-intl-ship' headers = { "authority": "www.amazon.com", "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", } resp = requests.get(spiderurl, headers=headers) content = resp.content.decode('utf-8') select = Selector(text=content) nodes = select.xpath("//a[@title='product-detail']") for node in nodes: itemUrl = node.xpath("./@href").extract_first() itemName = node.xpath("./div/h2/span/text()").extract_first() if itemUrl and itemName: itemUrl = urljoin(spiderurl,itemUrl)#用urljoin方法凑完整链接 print(itemUrl,itemName)
Les informations actuellement disponibles sur la page de liste actuelle qui ont été obtenues à ce stade. heure :
Entrez dans la page de détails :
Après avoir accédé à la page de détails, vous pouvez obtenir plus de contenu
Utilisez request.get() pour accéder au Web contenu et utilisez CSS pour sélectionner le contenu des balises pertinentes :
res = requests.get(itemUrl, headers=headers) content = res.content.decode('utf-8') Select = Selector(text=content) itemPic = Select.css('#main-image::attr(src)').extract_first() itemPrice = Select.css('.a-offscreen::text').extract_first() itemInfo = Select.css('#feature-bullets').extract_first() data = {} data['itemUrl'] = itemUrl data['itemName'] = itemName data['itemPic'] = itemPic data['itemPrice'] = itemPrice data['itemInfo'] = itemInfo print(data)
À l'heure actuelle, les informations des données de la page de détails ont été générées :
Ce qui est actuellement impliqué, ce sont les requêtes les plus élémentaires pour demander à Amazon et utilisez css/xpath pour obtenir les informations correspondantes.
Actuellement, l'accès national à Amazon sera très instable et il y a une forte probabilité que je ne puisse pas me connecter. Si vous avez vraiment besoin d'explorer les informations d'Amazon, il est préférable d'utiliser des proxys stables. J'utilise ici le proxy d'ipidea, qui peut obtenir 500 millions de trafic gratuitement. S'il existe un proxy, le taux de réussite d'accès sera plus élevé et la vitesse sera plus rapide.
Le site Web est ici : http://www.ipidea.net/?utm-source=PHP&utm-keyword=?PHP
Il existe deux façons d'utiliser le proxy, l'une consiste à obtenir l'adresse IP via le api, et l'autre consiste à utiliser le mot de passe du compte. Utilisez la méthode suivante :
3.1.1 api pour obtenir l'agent
3.1.2 api pour obtenir le code ip
def getProxies(): # 获取且仅获取一个ip api_url = '生成的api链接' res = requests.get(api_url, timeout=5) try: if res.status_code == 200: api_data = res.json()['data'][0] proxies = { 'http': 'http://{}:{}'.format(api_data['ip'], api_data['port']), 'https': 'http://{}:{}'.format(api_data['ip'], api_data['port']), } print(proxies) return proxies else: print('获取失败') except: print('获取失败')
3.2.1 Mot de passe du compte pour obtenir l'agent (adresse d'inscription : http://www.ipidea.net/?utm-source=PHP&utm-keyword=?PHP)
Parce qu'il s'agit d'une vérification de compte et de mot de passe, vous devez vous rendre au centre de compte pour renseigner les informations permettant de créer un sous-compte :
Après avoir créé le sous-compte, obtenez le lien en fonction du numéro de compte et du mot de passe :
3.2. 2 Obtenez le code de l'agent pour le mot de passe du compte
# 获取账密ip def getAccountIp(): # 测试完成后返回代理proxy mainUrl = 'https://api.myip.la/en?json' headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.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", } entry = 'http://{}-zone-custom{}:proxy.ipidea.io:2334'.format("帐号", "密码") proxy = { 'http': entry, 'https': entry, } try: res = requests.get(mainUrl, headers=headers, proxies=proxy, timeout=10) if res.status_code == 200: return proxy except Exception as e: print("访问失败", e) pass
Après avoir utilisé l'agent, l'acquisition des informations sur les produits Amazon a été considérablement améliorée. Le code précédent signalerait divers échecs de connexion, appelez la méthode d'acquisition du proxy avant la demande de requête. La méthode renvoie l'adresse IP du proxy et ajoute les paramètres de requête pour implémenter la requête proxy.
# coding=utf-8 import requests from parsel import Selector from urllib.parse import urljoin def getProxies(): # 获取且仅获取一个ip api_url = '生成的api链接' res = requests.get(api_url, timeout=5) try: if res.status_code == 200: api_data = res.json()['data'][0] proxies = { 'http': 'http://{}:{}'.format(api_data['ip'], api_data['port']), 'https': 'http://{}:{}'.format(api_data['ip'], api_data['port']), } print(proxies) return proxies else: print('获取失败') except: print('获取失败') spiderurl = 'https://www.amazon.com/s?i=videogames-intl-ship' headers = { "authority": "www.amazon.com", "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", } proxies = getProxies() resp = requests.get(spiderurl, headers=headers, proxies=proxies) content = resp.content.decode('utf-8') select = Selector(text=content) nodes = select.xpath("//a[@title='product-detail']") for node in nodes: itemUrl = node.xpath("./@href").extract_first() itemName = node.xpath("./div/h2/span/text()").extract_first() if itemUrl and itemName: itemUrl = urljoin(spiderurl,itemUrl) proxies = getProxies() res = requests.get(itemUrl, headers=headers, proxies=proxies) content = res.content.decode('utf-8') Select = Selector(text=content) itemPic = Select.css('#main-image::attr(src)').extract_first() itemPrice = Select.css('.a-offscreen::text').extract_first() itemInfo = Select.css('#feature-bullets').extract_first() data = {} data['itemUrl'] = itemUrl data['itemName'] = itemName data['itemPic'] = itemPic data['itemPrice'] = itemPrice data['itemInfo'] = itemInfo print(data)
通过上面的步骤,可以实现最基础的亚马逊的信息获取。
目前只获得最基本的数据,若想获得更多也可以自行修改xpath/css选择器去拿到你想要的内容。而且稳定的动态IP能是你进行请求的时候少一点等待的时间,无论是编写中的测试还是小批量的爬取,都能提升工作的效率。以上就是全部的内容。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!