【Python】利用代理IP爬取当当网数据做数据分析

news2025/1/17 0:10:01

前言

        在数字化浪潮的推动下,电商平台已经彻底改变了我们的购物方式。从简单的在线交易到复杂的用户交互,电商平台积累了海量的用户数据。这些数据,如同隐藏在深海中的宝藏,等待着被发掘和利用。通过分析用户的浏览、搜索、购买等行为,商家可以更准确地理解用户需求,提供个性化的推荐和服务。这不仅能够提升用户的购物体验,还能增加用户粘性和忠诚度。此外,电商平台数据分析在库存管理、价格策略制定、竞争分析、风险管理等方面也发挥着重要作用。它能够帮助商家优化库存,制定合理的定价策略,了解竞争对手的市场表现,以及及时发现并应对潜在的风险。

在本文中,我们将深入探讨如何构建出既高效的爬虫,为你的电商业务提供强大的支持。

亮数据数据获取工具icon-default.png?t=N7T8https://www.bright.cn/proxy-types?utm_source=brand&utm_campaign=brnd-mkt_cn_csdn_yingjie

利用代理IP爬取当当网

网站分析

        本次爬取的目标是某知名购书平台,抓取内容是:标题、链接、价格、定价、图片链接。为了防止被识别为爬虫,首先我们先要获取登录用户的cookie。登录状态下按f12,选择网络,任选其中一个流量,在请求头中找到cookie并复制。

        接下来,我们需要分析一下搜索请求的构建。可以看到我们搜索高等数学的时候,请求通过url构建。url中的key值代表搜索内容,act代表动作,page_index代表页码。

        最后我们需要确定商品元素在页面中的结构。可以看到所有商品位于一个ul中,每个商品部对应一个li标签,都有对应的class标记。其中标题位于p标签的title属性,链接位于href标签,图片链接在下层的img标签中,价钱位于另一个p标签中。之后我们将用xpath定位这些标签。

获取代理

数据获取工具icon-default.png?t=N7T8https://www.bright.cn/proxy-types?utm_source=brand&utm_campaign=brnd-mkt_cn_csdn_yingjie

        为了进一步隐藏爬虫身份,我们需要使用代理来隐藏真实的IP地址。这里我们选择亮数据作为代理服务商。选择代理服务商主要关注点在稳定性、ip区域多样性和价钱上。

        亮数据的IP代理网络覆盖全球195个国家,拥有超过7200万个IP地址,确保用户可以进行任意城市定位,并且每日更新上百万IP,保证了数据采集的广泛性和实时性。公司提供的代理IP网络类型包括动态住宅、静态住宅、移动和机房,全方位满足用户的不同需求。在全球范围内,亮数据拥有超过2600个代理服务器,构建了一个高速稳定的智能交通网络,确保了99.99%的稳定运行时间,即使在网络高峰期间也能保持服务的稳定性。此外,亮数据所有服务都支持随时暂停,并且计费方式灵活多样。

        首先我们需要注册并登录亮数据。之后来到用户控制面板,添加代理机房。

这里需要我们配置代理的名字和ip区域,其他选项保持默认。

之后需要将我们本机ip添加到白名单,并记录下来主机号、账户名和密码。

编写程序

        首先我们要编写get_ip函数从亮数据服务器获取代理ip定义代理服务器的主机、用户名和密码。然后使用这些信息构建了一个代理URL。最后发送HTTP请求到http://lumtest.com/myip.json获取当前的代理IP地址。

def get_ip():
    host = ''  # 主机
    user_name = ''  # 用户名
    password = ''  # 密码
    proxy_url = f'http://{user_name}:{password}@{host}'  # 将上面三个参数拼接为专属代理IP获取网址
    proxies = {
        'http': proxy_url,
        'https': proxy_url
    }
 
    url = "http://lumtest.com/myip.json"  # 默认获取的接口(不用修改)
    response = requests.get(url, proxies=proxies, timeout=10).text  # 发送请求获取IP
    # print('代理IP详情信息:',response)
    response_dict = eval(response)  # 将字符串转为字典,方便我们提取代理IP
    ip = response_dict['ip']
    # print('IP:',ip)
    return ip
 

        之后需要我们定义get_html_str函数,来向电商网站发送搜索请求:先定义请求头,模拟浏览器访问,其中包含了一些cookie信息。调用get_ip函数获取代理IP,并设置到请求中。最后发送HTTP请求到指定的URL,并返回网页源码。

def get_html_str(url):
    """发送请求,获取网页源码"""
    # 请求头模拟浏览器(注意这里一定添加自己已经登录的cookie才可以)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
        'cookie': ''
    }
 
    # 添加代理IP
    proxies = get_ip()
    # proxies = {}
    # 添加请求头和代理IP发送请求
    response = requests.get(url, headers=headers, proxies=proxies)
    # 获取网页源码
    html_str = response.text
    # 返回网页源码
    return html_str
 

        写下来要定义get_data函数,来解析网页中的元素,找到目标文本:首先接收网页源码、页码和数据列表作为参数。然后使用lxml.etree解析网页源码,提取商品信息,包括标题、价格、定价、商品链接和图片链接。最后将提取的数据添加到数据列表中。

def get_data(html_str, page, data_list):
    """提取数据写入列表"""
    # 将html字符串转换为etree对象方便后面使用xpath进行解析
    html_data = etree.HTML(html_str)
    # 利用xpath取到所有的li标签
    li_list = html_data.xpath('//div[@dd_name="普通商品区域"]/ul/li')
    # 打印一下li标签个数
    # print(len(li_list))
    # 遍历li_list列表取到某一个商品的对象标签
    for li in li_list:
        # 标题
        title = li.xpath('.//a[@class="pic"]/@title')
        title = ''.join(title)
        # 商品链接
        goods_url = 'https:' + li.xpath('.//a[@class="pic"]/@href')[0]
        # 价格
        price = li.xpath('.//p[@class="price"]/span[@class="price_n"]/text()')[0]
        print(price)
        # 定价
        pre_price = li.xpath('.//p[@class="price"]/span[@class="price_r"]/text()')[0]
        # 图片链接
        img_url = 'https:' + li.xpath('.//a[@class="pic"]/img/@src')[0]
 
        print({'页码': page, '标题': title, '价格': price, '定价': pre_price, '商品链接': goods_url,
               '图片链接': img_url})
        data_list.append(
            {'页码': page, '标题': title, '价格': price, '定价': pre_price, '商品链接': goods_url,
             '图片链接': img_url})
 

        接下来定义to_excel函数,将获取到的结果保存为excel文件:首先将数据列表转换为pandas的DataFrame对象。然后删除DataFrame中的重复数据。最后将DataFrame保存为Excel文件。

 
def to_excel(data_list):
    """写入Excel"""
    df = pd.DataFrame(data_list)
    df.drop_duplicates()  # 删除重复数据
    df.to_excel('当当采集数据集.xlsx')

        最后定义一个main函数方便调节参数、控制流程:首先设置爬取的关键词和页数。然后初始化一个空的数据列表。之后循环遍历每一页,调用get_html_str和get_data函数获取数据。最后调用to_excel函数将数据写入Excel文件。

 
def main():
    # 1. 设置爬取的关键词和页数
    keyword = '手机'
    page_num = 1  # 爬取的页数
    data_list = []  # 空列表用于存储数据
    for page in range(1, page_num + 1):
        url = f'https://search.dangdang.com/?key={keyword}&act=input&page_index={page}'
        print(url)
        # 2. 获取指定页的网页源码
        html_str = get_html_str(url)
        # print(html_str)
        # 3. 提取数据
        get_data(html_str, page, data_list)
        time.sleep(1)
    # 4. 写入Excel
    to_excel(data_list)

完整代码如下:

import pandas as pd  # pandas,用于写入Excel文件
import requests  # python基础爬虫库
from lxml import etree  # 可以将网页转换为Elements对象
import time  # 防止爬取过快可以睡眠一秒

def get_ip():
    host = ''  # 主机
    user_name = ''  # 用户名
    password = ''  # 密码
    proxy_url = f'http://{user_name}:{password}@{host}'  # 将上面三个参数拼接为专属代理IP获取网址
    proxies = {
        'http': proxy_url,
        'https': proxy_url
    }
    url = "http://lumtest.com/myip.json"  # 默认获取的接口(不用修改)
    response = requests.get(url, proxies=proxies, timeout=10).text  # 发送请求获取IP
    # print('代理IP详情信息:',response)
    response_dict = eval(response)  # 将字符串转为字典,方便我们提取代理IP
    ip = response_dict['ip']
    # print('IP:',ip)
    return ip

def get_html_str(url):
    """发送请求,获取网页源码"""
    # 请求头模拟浏览器(注意这里一定添加自己已经登录的cookie才可以)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
        'cookie': ''
    }
    # 添加代理IP
    proxies = get_ip()
    # proxies = {}
    # 添加请求头和代理IP发送请求
    response = requests.get(url, headers=headers, proxies=proxies)
    # 获取网页源码
    html_str = response.text
    # 返回网页源码
    return html_str

def get_data(html_str, page, data_list):
    """提取数据写入列表"""
    # 将html字符串转换为etree对象方便后面使用xpath进行解析
    html_data = etree.HTML(html_str)
    # 利用xpath取到所有的li标签
    li_list = html_data.xpath('//div[@dd_name="普通商品区域"]/ul/li')
    # 打印一下li标签个数
    # print(len(li_list))
    # 遍历li_list列表取到某一个商品的对象标签
    for li in li_list:
        # 标题
        title = li.xpath('.//a[@class="pic"]/@title')
        title = ''.join(title)
        # 商品链接
        goods_url = 'https:' + li.xpath('.//a[@class="pic"]/@href')[0]
        # 价格
        price = li.xpath('.//p[@class="price"]/span[@class="price_n"]/text()')[0]
        print(price)
        # 定价
        pre_price = li.xpath('.//p[@class="price"]/span[@class="price_r"]/text()')[0]
        # 图片链接
        img_url = 'https:' + li.xpath('.//a[@class="pic"]/img/@src')[0]
        print({'页码': page, '标题': title, '价格': price, '定价': pre_price, '商品链接': goods_url,
               '图片链接': img_url})
        data_list.append(
            {'页码': page, '标题': title, '价格': price, '定价': pre_price, '商品链接': goods_url,
             '图片链接': img_url})

def to_excel(data_list):
    """写入Excel"""
    df = pd.DataFrame(data_list)
    df.drop_duplicates()  # 删除重复数据
    df.to_excel('当当采集数据集.xlsx')
def main():
    # 1. 设置爬取的关键词和页数
    keyword = '手机'
    page_num = 1  # 爬取的页数
    data_list = []  # 空列表用于存储数据
    for page in range(1, page_num + 1):
        url = f'https://search.dangdang.com/?key={keyword}&act=input&page_index={page}'
        print(url)
        # 2. 获取指定页的网页源码
        html_str = get_html_str(url)
        # print(html_str)
        # 3. 提取数据
        get_data(html_str, page, data_list)
        time.sleep(1)
    # 4. 写入Excel
    to_excel(data_list)
if __name__ == '__main__':
    main()

将cookie、主机名、账号和密码跳入对应位置即可运行。运行结果如下:

打开excel文档,即可看到抓取到的数据。

总结

        通过上面的实战,我们可以看到代理服务可以大大提高爬虫的匿名性和效率。亮数据家的代理可以满足这两点需求。

        对开发者而言,亮数据代理以其简单易用的特性,大幅降低了技术门槛。 开发者可以快速上手,无需深入了解代理服务的底层技术细节,即可实现高效的数据抓取。这不仅加快了开发进程,也使得开发者能够将更多精力投入到数据分析和业务逻辑的构建上。

        对于采购者,亮数据代理提供的价格实惠和套餐灵活,满足了不同规模和需求的采购预算。 用户可以根据自己的实际需求选择合适的套餐,无论是初创企业还是大型机构,都能找到符合自身预算的解决方案。对项目经理来说,亮数据代理的高效数据质量保障,确保了爬取过程的稳定性和数据的准确性。 这不仅提升了项目的整体执行效率,也保障了数据分析结果的可靠性,为决策提供了坚实的数据支撑。

        对于企业老板,安全合规是他们最关心的问题之一, 亮数据代理严格遵守数据采集的法律法规,确保了企业在使用过程中的合规性,降低了潜在的法律风险。

        综上所述,亮数据代理产品以其多维度的优势,为电商平台爬虫的实现提供了强有力的支持。无论是技术实现的便捷性,还是成本控制的灵活性,或是数据质量的高效性,以及整体操作的安全性,亮数据代理都是企业和个人在数据采集领域的理想选择。随着技术的不断进步和市场需求的日益增长,我们可以预见,代理服务将在电商数据采集领域扮演越来越重要的角色

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1881577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis学习——Redisson 分布式锁集成及其简单使用

文章目录 引言1. Redisson概述1.1 Redisson的基本概念1.2 Redisson的主要功能1.3 Redisson的优点 2. 开发环境3. Redisson的安装与配置3.1 添加依赖3.2 配置Redisson 4. 使用Redisson4.1 可重入锁4.1.1 可重入锁的概念4.1.2 可重入锁的实现原理4.1.3 简单使用锁的获取和释放 4.…

数据恢复篇:如何在电脑上恢复已删除和丢失的音乐文件

尽管流媒体网络非常流行,但许多人仍然选择将音乐下载并保存在 PC 本地。这会使文件面临丢失或意外删除的风险。 幸运的是,您可以使用数据恢复软件恢复已删除的音乐和其他文件类型。这篇文章讨论了这些解决方案以及如何使用奇客数据恢复检索丢失的音乐文…

Java面试题--JVM大厂篇之深入了解G1 GC:高并发、响应时间敏感应用的最佳选择

引言: 在现代Java应用的性能优化中,垃圾回收器(GC)的选择至关重要。对于高并发、响应时间敏感的应用而言,G1 GC(Garbage-First Garbage Collector)无疑是一个强大的工具。本文将深入探讨G1 GC适…

抗腐蚀耐腐蚀不锈钢304/316L航空插头插座

不锈钢航空插头是一种专为航空航天、军事、工业等领域设计的连接器,具有高强度、耐腐蚀、耐高温等特点。它们通常用于在高振动、高湿度、高温度等恶劣环境下保持稳定的电气连接。不锈钢航空插头的设计充分考虑了这些极端条件,以确保信号和电源传输的可靠…

机器学习环境搭建

前言 个人笔记,记录框架和小问题,没有太详细记载。。 1、Anaconda安装 下载地址: Free Download | Anaconda (慢) ​ 国内镜像:https://link.csdn.net/?targethttp%3A%2F%2Fitcxy.xyz%2F241.html 下载…

(PC+WAP)高端大气的装修装潢公司网站模板

(PCWAP)高端大气的装修装潢公司网站模板PbootCMS内核开发的网站模板,该模板适用于装修公司网站、装潢公司网站等企业,当然其他行业也可以做,只需要把文字图片换成其他行业的即可;(PCWAP),同一个后台,数据即…

【数据结构(邓俊辉)学习笔记】二叉搜索树04——AVL树

文章目录 1.重平衡1.1 AVL BBST1.2 平衡因子1.3 适度平衡1.4 接口1.5 失衡 复衡 2. 插入2.1 单旋2.2 双旋2.3 实现 3. 删除3.1 单旋3.2 双旋3.3 实现 4. (3 4)-重构4.1 "34"重构4.2 "34"实现4.3 rotateAt4.4 综合评价 1.重平衡 1…

SSZipArchive 解压后 中文文件名乱码问题

不知道什么情况,做为一个三方广泛使用的框架库,会出现这种比较低级的问题! 还有中文的文件名解压后显示乱码! 经过深入研究排查,发现目录或文件名编码错误!但是POD库,不可能直接在里面改&#…

在线疫苗预约小程序的设计

管理员账户功能包括:系统首页,个人中心,工作人员管理,管理员管理,用户管理,疫苗管理,论坛管理,公告管理 微信端账号功能包括:系统首页,公告,疫苗&…

SpringBoot + mkcert ,解决本地及局域网(内网)HTTPS访问

本文主要解决访问SpringBoot开发的Web程序,本地及内网系统,需要HTTPS证书的问题。 我测试的版本是,其他版本不确定是否也正常,测试过没问题的小伙伴,可以在评论区将测试过的版本号留下,方便他人参考: <spring-boot.version>2.3.12.RELEASE</spring-boot.vers…

redis-cluster(集群模式搭建)

redis中间件版本: redis-5.0.5环境介绍 这里使用服务器数量3&#xff0c;分别为172.0.0.1&#xff0c;172.0.0.2&#xff0c;172.0.0.3&#xff0c;每台机器redis节点数量2个&#xff0c;共6个redis节点构成redis-cluster模式。编译安装包 在172.0.0.1的机器上进入安装目录 cd …

【6.26更新】Win10 22H2 19045.4598镜像:免费下载!

当前微软已经发布了六月最新的KB5039299更新补丁&#xff0c;用户完成升级后&#xff0c;系统版本号将更新至19045.4598。此次更新解决了任务栏上应用跳转列表失败、可能导致系统无法从休眠状态恢复等多个问题&#xff0c;推荐大家升级。如果您不知道去哪里才能下载到该版本&am…

【JavaEE】JVM

文章目录 一、JVM 简介二、JVM 运行流程三、JVM 运行时数据区1、堆&#xff08;线程共享&#xff09;2、Java虚拟机栈&#xff08;线程私有&#xff09;3、本地方法栈&#xff08;线程私有&#xff09;4、程序计数器&#xff08;线程私有&#xff09;5、方法区&#xff08;线程…

002-关于Geogebra软件的介绍及与MatLab的区别

为什么要学Geogebra&#xff1f; 因为和MatLab的科学计算相比&#xff0c;GeoGebra重点突出教学展示&#xff0c;对于教师、学生人群来讲再合适不过了&#xff0c;尤其是可以融入到PPT里边呈现交互式动画&#xff0c;想想听众的表情&#xff01;这不就弥补了看到PPT播放数学公…

WEB攻防-XSS跨站反射型存储型DOM型标签闭合输入输出JS代码解析

文章目录 XSS跨站-输入输出-原理&分类&闭合XSS跨站-分类测试-反射&存储&DOM反射型XSS存储型XSSDOM-base型XSS XSS跨站-输入输出-原理&分类&闭合 漏洞原理&#xff1a;接受输入数据&#xff0c;输出显示数据后解析执行 基础类型&#xff1a;反射(非持续…

2010-2022年 政府透明度指数报告整理

政府透明度指数报告是衡量政府透明度的重要工具&#xff0c;它由独立的评估机构或研究机构发布&#xff0c;用以反映政府在不同方面的表现。以下是对政府透明度指数报告的详细介绍&#xff1a; 数据简介 定义&#xff1a;政府透明度指数报告衡量的是政府在信息公开、政策制定…

Apache ZooKeeper 简介

介绍 Apache ZooKeeper 是一种分布式协调服务&#xff0c;旨在管理和同步大量分布式应用程序。ZooKeeper 是 Apache 软件基金会下的一个开源项目&#xff0c;它解决了维护分布式应用程序的配置信息、命名、分布式同步和组服务的复杂性。本文探讨了 ZooKeeper 的架构、功能、应…

在安装HDFS过程中遇见Permission denied

HDFS Shell命令权限不足问题解决 问题 想必有同学在实战Shell的时候&#xff0c;遇到了&#xff1a; Permission denied: userroot, accessWRITE, inode"/":hadoop:supergroup:drwxr-xr-x 这种类似的问题。 问题的原因就是没有权限&#xff0c;那么为什么呢&#…

PyTorch之nn.Module、nn.Sequential、nn.ModuleList使用详解

文章目录 1. nn.Module1.1 基本使用1.2 常用函数1.2.1 核心函数1.2.2 查看函数1.2.3 设置函数1.2.4 注册函数1.2.5 转换函数1.2.6 加载函数 2. nn.Sequential()2.1 基本定义2.2 Sequential类不同的实现2.3 nn.Sequential()的本质作用 3. nn.ModuleList参考资料 本篇文章主要介绍…

护网蓝队面试

一、sql注入分类 **原理&#xff1a;**没有对用户输入项进行验证和处理直接拼接到查询语句中 查询语句中插⼊恶意SQL代码传递后台sql服务器分析执行 **从注入参数类型分&#xff1a;**数字型注入、字符型注入 **从注入效果分&#xff1a;**报错注入、布尔注入、延时注入、联…