【python爬虫实战】——基于全国各城市快递网点的数据采集

一、项目背景

随着电子商务的快速发展,快递行业成为了现代物流的重要组成部分。快递网点的分布和服务质量直接影响到用户的物流体验。为了更好地了解快递网点的分布情况、服务范围以及联系方式等信息,本项目通过爬虫技术从公开的快递信息网站上采集相关数据。‘

> 本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

二、项目目的和意义

本项目的主要目的是通过爬虫技术,采集全国各大城市的快递网点信息,包括网点的名称、地址、联系电话、配送范围等。这些数据可以用于:

  1. 物流行业分析:通过分析快递网点的分布情况,了解各地区的物流覆盖情况。

  2. 用户服务优化:通过分析网点的服务范围和联系方式,帮助用户更好地选择快递服务。

  3. 数据支持:为物流公司、电商平台等提供数据支持,帮助他们优化物流网络布局。

三、环境准备

在开始项目之前,需要准备以下环境和工具:

  1. Python 3.x:本项目使用Python编写,确保已安装Python 3.x版本。

  2. 第三方库:需要安装以下Python库:

    • requests:用于发送HTTP请求。

    • parsel:用于解析HTML文档。

    • csv:用于将数据保存为CSV文件。

    • re:用于正则表达式匹配。

    • random:用于随机选择User-Agent。

    • time:用于控制爬虫的请求频率。

可以通过以下命令安装所需的库:

pip install requests parsel

四、采集字段介绍

字段名描述示例
物流名称快递网点的名称顺丰速运
标题快递网点的标题信息顺丰速运广州天河区网点
省份快递网点所在的省份广东省
城市快递网点所在的城市广州市
快递网点所在的区天河区
公司地址快递网点的详细地址广州市天河区天河路123号
联系电话

快递网点的联系电话,

通常为固定电话或手机号码

xxx-xxxxxx
配送范围快递网点的配送范围天河区、越秀区、海珠区

五、爬虫步骤分析

--------------------------要想提高采集效率,建议用scrapy框架进行采集----------------------------------------

-----------------------这个项目对采集速率过快的会进行封ip,proxy也得用上---------------------------------

1. 获取User-Agent列表

为了避免被网站反爬虫机制识别,项目使用随机的User-Agent来发送请求。ua_list()函数返回一个包含多个User-Agent的列表,每次请求时随机选择一个User-Agent。

def ua_list():
    ua = [
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Hot Lingo 2.0)',
        'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
        # 更多User-Agent...
    ]
    return ua

2. 获取省份与地区代码的映射

通过解析网页中的HTML代码,项目可以获取到每个省份对应的地区代码。get_region_mapping()函数通过解析HTML代码,生成一个省份与地区代码的映射字典。这部分可以通过selenium自动化点击操作采集所有城市的region_code映射。类似点一下--安徽,就会跳到城市显示安徽所有的城市,然后进行采集

 

3. 获取总页数

通过发送请求并解析返回的HTML文档,项目可以获取到每个地区的快递网点总页数。get_total_page()函数通过解析页面中的分页信息,计算出总页数。

def get_total_page(region_code):
    headers = {
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
    }
    url = f"https://www.kuaidi100.com/network/net_{region_code}_all_all_1.htm"
    response = requests.get(url, headers=headers)
    parsel_text = parsel.Selector(response.text)
    as_label = parsel_text.xpath('//div[@class="select-box"]/dl/dd[1]/a')
    counts = 0
    for a in as_label[1:]:
        num_ = a.xpath('./text()').get()
        num = re.findall(r'\d+', num_, re.S)[0]
        counts += int(num)
    page_total = counts // 10 + (counts % 10 != 0)
    return page_total

4. 详情页解析

通过解析详情页的HTML文档,可以获取到每个快递网点的详细信息。info_url_parsel()函数负责解析详情页,并返回一个包含网点信息的字典。

def info_url_parsel(url):
    headers = {
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "User-Agent": random.choice(ua_list()),
    }
    response = requests.get(url, headers=headers)
    parsel_text = parsel.Selector(response.text)
  
    dic = {
        '标题': title,
        '省份': province,
        '城市': city,
        '区': district,
        '公司地址': add,
        '联系电话': phone,
        '配送范围': range_,
    }
    return dic

 

5. 单页数据解析和保存

parsel_data()函数负责解析单页的快递网点列表,并调用info_url_parsel()函数获取每个网点的详细信息,最后将数据保存到CSV文件中。有个别城市的数据在翻页的时候有问题,可以使用异try-except捕获,避免程序报错

def parsel_data(region_code, page):
    headers = {
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "User-Agent": random.choice(ua_list()),
    }
    url = f"https://www.kuaidi100.com/network/net_{region_code}_all_all_{page}.htm"
    response = requests.get(url, headers=headers)
    parsel_text = parsel.Selector(response.text)
    divs = parsel_text.xpath('//div[@class="col_1 mt10px"]/div')
    for div in divs[:-1]:
        name = div.xpath('./div/p[1]/span/text()').get()
        name = name.strip().replace(':', '')  # 物流名称
        url = div.xpath('./div/p[1]/a/@href').get()
        dic = info_url_parsel(url)
        dic['物流名称'] = name
        print(dic)
        csv_write.writerow(dic)
        time.sleep(random.uniform(0.8,1.5))

6. 数据保存

本项目使用csv.DictWriter将采集到的数据保存到CSV文件中。需要保存到数据库的,则编写插入数据库语法即可。

if __name__ == '__main__':
    f = open('快递网点.csv', mode='w', encoding='utf-8', newline='')
    csv_write = csv.DictWriter(f, [
        '物流名称',
        '标题',
        '省份',
        '城市',
        '区',
        '公司地址',
        '联系电话',
        '配送范围',
    ])
    csv_write.writeheader()
    main()
    print('采集结束')
    f.close()

六、结果展示

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值