ホームページ  >  記事  >  バックエンド開発  >  Pythonを使用してAmazonの商品情報を取得する

Pythonを使用してAmazonの商品情報を取得する

藏色散人
藏色散人オリジナル
2022-10-08 16:49:513052ブラウズ

はじめに

国内のショッピング サイトと比較して、Amazon の Web サイトは Python の最も基本的なリクエストを直接使用してリクエストを行うことができます。アクセスはそれほど頻繁ではないため、保護メカニズムを作動させることなく必要なデータを取得できます。今回は、次の 3 つのパートに分けて、基本的なクローリングのプロセスを簡単に紹介します。

  • リクエストの get リクエストを使用して、Amazon リストと詳細ページのページ内容を取得します

  • 取得したコンテンツをcss/xpathで解析し、キーデータを取得します

  • 動的IPの役割と使い方

1. Amazon のリスト ページから情報を取得します。

ゲーム分野を例に挙げます:

Pythonを使用してAmazonの商品情報を取得する

製品名、詳細リンク、その他のコンテンツへのさらなるアクセスなど、リストで取得できる製品情報を取得します。

requests.get() を使用して Web ページのコンテンツを取得し、ヘッダーを設定し、xpath セレクターを使用して関連タグのコンテンツを選択します。

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)

現在、現時点で取得されている現在のリスト ページ :

Pythonを使用してAmazonの商品情報を取得する

2. 詳細ページの情報を取得します

詳細ページに移動します。

Pythonを使用してAmazonの商品情報を取得する

##詳細ページに入ると、さらにコンテンツを取得できます

requests.get() を使用して Web ページのコンテンツを取得し、CSS を使用して関連タグの内容:

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)

この時点で詳細ページが生成されました データ情報:

Pythonを使用してAmazonの商品情報を取得する

#現在関係しているのは、最も基本的なリクエストですAmazon に送信し、css/xpath を使用して対応する情報を取得します。

3. プロキシ設定

現在、国内のAmazonへのアクセスが非常に不安定となり、接続できなくなる可能性が高くなります。本当に Amazon の情報をクロールする必要がある場合は、安定したプロキシを使用するのが最善です。ここでは、無料で 5 億のトラフィックを取得できる ipidea のプロキシを使用しています。プロキシがあるとアクセス成功率が高くなり、速度も速くなります。

URL はこちらです:

http://www.ipidea.net/?utm-source=PHP&utm-keyword=?PHP

使用方法は 2 つあります

3.1.1 エージェントを取得する API

Pythonを使用してAmazonの商品情報を取得する

Pythonを使用してAmazonの商品情報を取得する

3.1.2 API 取得 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 アカウントパスワード取得エージェント (登録アドレス: http://www.ipidea.net/?utm-source=PHP&utm-keyword=?PHP)

アカウントとパスワードの認証ですので、アカウント センターにアクセスして、サブアカウントを作成するための情報を入力する必要があります:

Pythonを使用してAmazonの商品情報を取得する

Pythonを使用してAmazonの商品情報を取得する

サブアカウントを作成した後、アカウント番号とパスワードに基づいてリンクを取得します:

3.2.2 アカウント パスワード取得エージェント コード

# 获取账密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

プロキシを使用した後、Amazon 製品情報の取得が大幅に改善されました。前のコードは、さまざまな接続失敗エラーを報告します。プロキシ取得メソッドは、リクエスト リクエストの前に呼び出されます。このメソッドは、プロキシ IP を返し、リクエスト リクエスト パラメータに参加します。プロキシ リクエストを実装できます。

四、全部代码

# 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能是你进行请求的时候少一点等待的时间,无论是编写中的测试还是小批量的爬取,都能提升工作的效率。以上就是全部的内容。 

以上がPythonを使用してAmazonの商品情報を取得するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。