• 【技术分享】Python爬虫脚本+XML解析实现自动保存某商城的商品图


    在这里插入图片描述

    1.背景介绍

    Python脚本可以实现数据的爬取,而XML可以解析网页数据。将Python爬虫脚本与XML解析功能相结合,可以实现自动保存某商城的商品图功能。

    注:本功能仅用于学习爬虫功能写Demo使用,严禁用于商业用途,且不可频繁使用以免对远程服务器造成攻击。

    2.代码分析

    整个过程分为三步,分别是:创建图片保存目录、组装数据发送请求、接收并解析数据

    2.1.创建图片保存的目录

    首先判断目录是否存在,不存在则创建,代码如下:

    import os
    file_path = r"./商品文件夹/"
    if not os.path.exists(file_path):
        os.mkdir(file_path)
    
    • 1
    • 2
    • 3
    • 4

    2.2.定一下载函数

    定义一个下载函数,使用requests包来发送请求。接收请求后使用open函数获取图片内容,然后将图片内容写入到文件中。

    import requests
    # 下载函数
    def img_down(img_url):
        img_name = file_path + "/" + img_url.split('/')[-1]
        r = requests.get(img_url, headers=headers, verify=False)
        with open(img_name, 'wb') as f:
            f.write(r.content)
            f.close
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.3.发送请求解析数据

    使用for循环来控制页码数;使用变量page来实现页码的自动增加;使用requests来发送请求数据,使用etree来解析捕捉到的HTML数据。为了防止访问过快,还可以使用time.sleep()函数来实现间隔请求,避免访问过快导致IP被封。

    import os
    import requests
    import time
    from lxml import etree
    import warnings
    warnings.filterwarnings('ignore')
    
    def get_details():
        for i in range(1, 51):  # 页数循环
            page = f'&page={i}'  # 翻页参数
            # 商品链接地址
            url = "XXX"
            url = url + page
            res = requests.get(url, headers=headers, verify=False).text
            #         print(res)
            tree = etree.HTML(res)
            # print(res)
    
            li_list = tree.xpath('//*[@id="J_goodsList"]/ul/li')
            # print(li_list)
            # exit()
            for j in li_list:
                img_url = 'http:' + j.xpath('./div/div/a/img/@data-lazy-img')[0]
                #             print(img_url)
                img_down(img_url)
                print("图片下载成功,图片链接: " + img_url)
                time.sleep(100)
            print("======第" + str(i) + "页的照片全部下载完成======")
    
        print("执行结束")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    2.源代码(全)

    代码如下,可直接拿来使用。必要时替换headers和商品的url链接即可。

    import os
    import requests
    import time
    from lxml import etree
    import warnings
    warnings.filterwarnings('ignore')
    
    
    # 创建目录
    file_path = r"./商品文件夹/"
    if not os.path.exists(file_path):
        os.mkdir(file_path)
    
    # headers
    headers = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "user-agent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36",
    }
    
    
    # 下载函数
    def img_down(img_url):
        img_name = file_path + "/" + img_url.split('/')[-1]
        r = requests.get(img_url, headers=headers, verify=False)
        with open(img_name, 'wb') as f:
            f.write(r.content)
            f.close
    
    # 
    def get_details():
        for i in range(1, 51):  # 页数循环
            page = f'&page={i}'  # 翻页参数
            # 商品链接地址
            url = "XXX"
            url = url + page
            res = requests.get(url, headers=headers, verify=False).text
            #         print(res)
            tree = etree.HTML(res)
            # print(res)
    
            li_list = tree.xpath('//*[@id="J_goodsList"]/ul/li')
            # print(li_list)
            # exit()
            for j in li_list:
                img_url = 'http:' + j.xpath('./div/div/a/img/@data-lazy-img')[0]
                #             print(img_url)
                img_down(img_url)
                print("图片下载成功,图片链接: " + img_url)
                time.sleep(100)
            print("======第" + str(i) + "页的照片全部下载完成======")
    
        print("执行结束")
    
    if __name__ == '__main__':
        # 执行程序
        get_details()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
  • 相关阅读:
    成都某公司笔试题sql
    c语言练习84:动态内存管理
    效率工作:一键为多种资产添加统一材质(小插件)
    代码随想录算法训练营第五天| 哈希表理论基础、242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
    u-view的使用
    前端开发:export 和 export default的区别
    git常用命令
    雅思口语同替高分表达
    LeetCode1547. Minimum Cost to Cut a Stick——区间dp
    go语言基础笔记
  • 原文地址:https://blog.csdn.net/m0_38068876/article/details/128059235