写点什么

利用 Python 和 IPIDEA:跨境电商与数据采集的完美解决方案

  • 2024-07-30
    安徽
  • 本文字数:5865 字

    阅读完需:约 19 分钟

实操案例:利用 IPIDEA 进行数据采集

我们今天用一个具体的案例来展示 IPIDEA 的功能。该案例可以帮助电商企业在市场竞争中更好地了解竞争对手的产品和定价策略,优化自己的产品选择和定价,最终维持和提升市场竞争力。

步骤一:注册和获取代理 IP

首先,我们需要在 IPIDEA 官网 注册一个账号,并购买适合我们的代理服务套餐。注册和购买步骤通常包括:


1.IPIDEA 官网:进入官网,点击注册按钮,填写必要的信息创建账号。(ps:他们官网有免费试用哦,想要了解的伙伴可以试用看看)2.选择合适的代理服务套餐:根据需求选择套餐,通常包括不同数量的代理 IP 和使用时长。


然后我们需要生成链接,将 API 加入我们的 Python 代码中,获取到全球各地的代理 IP。以下是具体步骤的截图示例:



步骤二:编写数据采集

接下来,我们将编写一个 Python ,通过 IPIDEA 提供的代理 IP 来采集亚马逊网站中笔记本电脑商品的数据:https://www.amazon.com/s?k=laptop 。以下是一段详细的示例代码:


import requestsfrom bs4 import BeautifulSoupimport csvimport timefrom random import randint
# 获取代理IP列表def get_proxies(): proxies = [] for _ in range(5): # 获取5个代理IP response = requests.get('http://api.proxy.ipidea.io/getBalanceProxyIp?num=1&return_type=txt&lb=1&sb=0&flow=1&regions=&protocol=http') proxies.append(response.text.strip()) return proxies
# 轮换代理IPdef rotate_proxy(proxies): return {'http': proxies[randint(0, len(proxies)-1)]}
# 数据采集函数def fetch_data(url, proxies): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'DNT': '1' } for attempt in range(5): # 重试5次 proxy = rotate_proxy(proxies) try: response = requests.get(url, headers=headers, proxies=proxy, timeout=10) response.raise_for_status() # 检查请求是否成功 return response.text except requests.exceptions.RequestException as e: print(f'请求失败(第{attempt+1}次尝试),错误: {e}') time.sleep(randint(5, 10)) # 随机等待5到10秒后重试
# 设置代理IPproxies = get_proxies()
# 目标URLurl = 'https://www.amazon.com/s?k=laptop'
response_text = fetch_data(url, proxies)
if response_text: soup = BeautifulSoup(response_text, 'html.parser') # 提取商品信息 products = soup.find_all('div', {'data-component-type': 's-search-result'}) # 打开 CSV 文件进行写入 with open('products.csv', mode='w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['商品名称', '价格', '评分']) for product in products: name = product.find('span', class_='a-size-medium a-color-base a-text-normal') price = product.find('span', class_='a-price-whole') rating = product.find('span', class_='a-icon-alt') if name and price and rating: writer.writerow([name.text.strip(), price.text.strip(), rating.text.strip()])else: print('数据采集失败')
复制代码



在这个示例中,我们使用了 requests 库来发送 HTTP 请求,并使用 BeautifulSoup 库来解析 HTML 内容。通过设置代理 IP,我们可以从目标网站获取商品信息,而不会受到地域不同和 IP 不稳定的影响。


为了使代码更加完善,我们可以添加一些额外的功能,比如错误处理、数据存储和多线程等。

添加错误处理

import requestsfrom bs4 import BeautifulSoupimport csvimport timefrom random import randintfrom concurrent.futures import ThreadPoolExecutor
# 获取代理IP列表def get_proxies(): proxies = [] for _ in range(5): # 获取5个代理IP response = requests.get('http://api.proxy.ipidea.io/getBalanceProxyIp?num=1&return_type=txt&lb=1&sb=0&flow=1&regions=&protocol=http') proxies.append(response.text.strip()) return proxies
# 轮换代理IPdef rotate_proxy(proxies): return {'http': proxies[randint(0, len(proxies)-1)]}
# 数据采集函数def fetch_data(url, proxies): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'DNT': '1' } for attempt in range(5): # 重试5次 proxy = rotate_proxy(proxies) try: response = requests.get(url, headers=headers, proxies=proxy, timeout=10) response.raise_for_status() # 检查请求是否成功 return response.text except requests.exceptions.RequestException as e: print(f'请求失败(第{attempt+1}次尝试),错误: {e}') time.sleep(randint(5, 10)) # 随机等待5到10秒后重试
def scrape_page(url, proxies): response_text = fetch_data(url, proxies) if response_text: soup = BeautifulSoup(response_text, 'html.parser') products = soup.find_all('div', {'data-component-type': 's-search-result'}) data = [] for product in products: name = product.find('span', class_='a-size-medium a-color-base a-text-normal') price = product.find('span', class_='a-price-whole') rating = product.find('span', class_='a-icon-alt') if name and price and rating: data.append([name.text.strip(), price.text.strip(),rating.text.strip()]) return data else: print('数据采集失败') return []
def save_to_csv(data): with open('products.csv', mode='w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['商品名称', '价格', '评分']) writer.writerows(data)
def main(): proxies = get_proxies() urls = [f'https://www.amazon.com/s?k=laptop&page={i}' for i in range(1, 6)] # 假设需要爬取前5页 all_data = []
with ThreadPoolExecutor(max_workers=5) as executor: results = executor.map(lambda url: scrape_page(url, proxies), urls) for result in results: all_data.extend(result)
if all_data: save_to_csv(all_data) else: print('没有数据被采集')
if __name__ == "__main__":main()
复制代码


在 fetch_data 函数中添加了重试机制来进行错误处理

数据存储到 CSV 文件

上面的代码已经包含将数据存储到 CSV 文件的功能。每次从页面提取到商品信息后,都会将其写入 products.csv 文件中,可以看到一共采集到了 20 条商品信息。


# 打开 CSV 文件进行写入with open('products.csv', mode='w', newline='', encoding='utf-8') as file:    writer = csv.writer(file)    writer.writerow(['商品名称', '价格', '评分'])    for product in products:        name = product.find('span', class_='a-size-medium a-color-base a-text-normal')        price = product.find('span', class_='a-price-whole')        rating = product.find('span', class_='a-icon-alt')        if name and price and rating:            writer.writerow([name.text.strip(), price.text.strip(), rating.text.strip()])
复制代码


多线程采集数据

为了提高采集效率,我们还可以使用多线程技术:


import requestsfrom bs4 import BeautifulSoupfrom concurrent.futures import ThreadPoolExecutorimport csvimport timefrom random import randint
# 获取代理IP列表def get_proxies(): proxies = [] for _ in range(5): # 获取5个代理IP response = requests.get('http://api.proxy.ipidea.io/getBalanceProxyIp?num=1&return_type=txt&lb=1&sb=0&flow=1&regions=&protocol=http') proxies.append(response.text.strip()) return proxies
# 轮换代理IPdef rotate_proxy(proxies): return {'http': proxies[randint(0, len(proxies)-1)]}
# 数据采集函数def fetch_data(url, proxies): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'DNT': '1' } for attempt in range(5): # 重试5次 proxy = rotate_proxy(proxies) try: response = requests.get(url, headers=headers, proxies=proxy, timeout=10) response.raise_for_status() # 检查请求是否成功 return response.text except requests.exceptions.RequestException as e: print(f'请求失败(第{attempt+1}次尝试),错误: {e}') time.sleep(randint(5, 10)) # 随机等待5到10秒后重试
# 设置代理IPproxies = get_proxies()
# 目标URL列表urls = [ 'https://www.amazon.com/s?k=laptop&page=1', 'https://www.amazon.com/s?k=laptop&page=2', 'https://www.amazon.com/s?k=laptop&page=3', # 可以根据需要添加更多的页面URL]
# 数据采集和存储函数def fetch_and_store_data(url, proxies, writer): response_text = fetch_data(url, proxies) if response_text: soup = BeautifulSoup(response_text, 'html.parser') products = soup.find_all('div', {'data-component-type': 's-search-result'}) for product in products: name = product.find('span', class_='a-size-medium a-color-base a-text-normal') price = product.find('span', class_='a-price-whole') rating = product.find('span', class_='a-icon-alt') if name and price and rating: writer.writerow([name.text.strip(), price.text.strip(), rating.text.strip()]) else: print('数据采集失败')
# 打开 CSV 文件进行写入with open('products.csv', mode='w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['商品名称', '价格', '评分'])
# 使用多线程进行数据采集 with ThreadPoolExecutor(max_workers=5) as executor: futures = [executor.submit(fetch_and_store_data, url, proxies, writer) for url in urls] for future in futures: future.result() # 等待所有线程完成
复制代码


采集得到的 CSV 文件内容如下:



通过添加目标 URL 列表,我们可以采集到更多的商品数据,这里我们取了前三页,采集到共 60 条商品信息。


# 目标URL列表urls = [    'https://www.amazon.com/s?k=laptop&page=1',    'https://www.amazon.com/s?k=laptop&page=2',    'https://www.amazon.com/s?k=laptop&page=3',    # 可以根据需要添加更多的页面URL]
复制代码

步骤三:处理和分析数据

获取到商品数据后,我们可以使用 Pandas 等数据分析库对数据进行处理和分析。例如:


import pandas as pd
# 读取 CSV 文件中的数据df = pd.read_csv('products.csv')
# 去掉价格中的美元符号和逗号,并转换为浮点数df['价格'] = df['价格'].replace('[\$,]', '', regex=True).astype(float)
# 定义价格区间bins = [0, 100, 300, 500, 700, 1000, float('inf')]labels = ['0-100', '100-300', '300-500', '500-700', '700-1000', '1000以上']
# 将价格分到相应区间df['价格区间'] = pd.cut(df['价格'], bins=bins, labels=labels, right=False)
# 统计每个价格区间的商品数量price_distribution = df['价格区间'].value_counts().sort_index()
print(price_distribution)
复制代码



通过上述代码,我们可以对采集到的商品价格数据进行进一步处理和分析。


以上就是利用 IPIDEA 进行数据采集的一个完整示例。通过这种方式,我们可以轻松地从任意平台获取数据,特别适用于跨境电商相关的应用。无论是用于市场分析还是优化产品策略,都能大大提高工作效率。


当然我们也可以用官网提供的案例来熟悉具体的操作步骤,包含了常用的 C/C++语言、GO 语言、Node.js 语言、Php 语言、JAVA 语言、Python 语言以及 python-selenium 语言。



经过实操案例,给大家展示了如何利用 IPIDEA 进行数据采集,从注册和获取代理 IP,到编写数据采集,再到处理和分析数据,每一步都体现了 IPIDEA 的便捷和高效。


总结

通过实操案例,我们展示了如何利用代理服务进行数据采集,从注册和获取代理 IP,到编写数据采集代码,再到处理和分析数据,每一步都体现了这一过程的便捷和高效。代理服务的全球覆盖、高匿名性、安全性和高速稳定连接,使得跨境电商企业能够轻松地从全球各地获取所需数据,提高市场竞争力。同时,这种代理服务在社媒营销和 SEO 优化等方面的广泛应用,也为用户提供了更多实现目标的可能性。


总体而言,代理服务是跨境电商和数据采集的强大工具,能够有效提升工作效率和数据质量。如果你正在寻找一款高效、可靠的代理服务,IPIDEA 无疑是我们的更优选择。

发布于: 刚刚阅读数: 7
用户头像

公众号:海拥 2021-11-29 加入

【个人网站】haiyong.site 【联系方式】微信:wh18363 【软件技能】前端,Java,Python 【个人称号】InfoQ 写作社区签约作者,华为云享专家,CSDN原力作者,全栈领域优质创作者,掘金2021年度人气作者No.21

评论

发布
暂无评论
利用 Python 和 IPIDEA:跨境电商与数据采集的完美解决方案_Python_海拥(haiyong.site)_InfoQ写作社区