Rumah >pembangunan bahagian belakang >Tutorial Python >Dapatkan maklumat produk Amazon menggunakan Python
Berbanding dengan tapak web beli-belah domestik, tapak web Amazon boleh terus menggunakan permintaan paling asas Python untuk membuat permintaan. Akses tidak terlalu kerap, dan data yang kita inginkan boleh diperolehi tanpa mencetuskan mekanisme perlindungan. Kali ini, kami memperkenalkan secara ringkas proses rangkak asas melalui tiga bahagian berikut:
Gunakan permintaan permintaan untuk mendapatkan kandungan halaman penyenaraian Amazon dan halaman butiran
Gunakan css/xpath untuk menghuraikan kandungan yang diperoleh dan mendapatkan data utama
Peranan IP dinamik dan cara menggunakannya
Ambil kawasan permainan sebagai contoh:
Dapatkan maklumat produk yang boleh diperolehi dalam senarai, Seperti nama produk, pautan butiran, dan akses lanjut kepada kandungan lain.
Gunakan requests.get() untuk mendapatkan kandungan halaman web, tetapkan pengepala dan gunakan pemilih xpath untuk memilih kandungan tag yang berkaitan:
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)
Halaman senarai semasa yang telah diperolehi pada masa ini boleh diperolehi Maklumat:
Masukkan butiran halaman:
Selepas memasuki halaman butiran, anda boleh mendapatkan lebih banyak kandungan
Gunakan requests.get() untuk mendapatkan kandungan web dan gunakan css untuk pilih kandungan tag yang berkaitan:
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)
Pada masa ini Maklumat tentang data halaman butiran yang telah dihasilkan:
Apa yang terlibat pada masa ini ialah permintaan paling asas kepada Amazon dan menggunakan css/xpath untuk mendapatkan maklumat yang sepadan.
Pada masa ini, akses domestik ke Amazon akan menjadi sangat tidak stabil, dan terdapat kebarangkalian yang tinggi bahawa saya tidak akan dapat menyambung. Jika anda benar-benar perlu merangkak maklumat Amazon, sebaiknya gunakan beberapa proksi yang stabil saya menggunakan proksi ipidea di sini, yang boleh mendapatkan 500 juta trafik secara percuma. Jika terdapat proksi, kadar kejayaan capaian akan lebih tinggi dan kelajuan akan lebih pantas.
URL ada di sini: http://www.ipidea.net/?utm-source=PHP&utm-keyword=?PHP
Terdapat dua cara untuk digunakan proksi, Satu adalah untuk mendapatkan alamat IP melalui api, dan juga menggunakan kata laluan akaun Caranya adalah seperti berikut:
3.1.1 api untuk mendapatkan proksi
.3.1.2 api dapatkan kod 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 Akaun ejen pemerolehan kata laluan (alamat pendaftaran: http://www.ipidea.net/?utm-source=PHP&utm-keyword=?PHP)
Kerana ia adalah akaun dan kata laluan pengesahan, anda perlu pergi ke pusat akaun untuk mengisi maklumat untuk membuat sub- Akaun:
Selepas mencipta sub -akaun, dapatkan pautan berdasarkan nombor akaun dan kata laluan:
3.2.2 Kata laluan akaun Mendapatkan kod proksi
# 获取账密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
Selepas menggunakan proksi, pemerolehan maklumat produk Amazon telah telah banyak diperbaiki. Kod sebelumnya akan melaporkan pelbagai ralat kegagalan sambungan Kaedah pemerolehan proksi dipanggil sebelum permintaan permintaan, dan kaedah mengembalikan IP Proksi dan menambah parameter permintaan untuk melaksanakan permintaan proksi.
# 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能是你进行请求的时候少一点等待的时间,无论是编写中的测试还是小批量的爬取,都能提升工作的效率。以上就是全部的内容。
Atas ialah kandungan terperinci Dapatkan maklumat produk Amazon menggunakan Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!