最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)網(wǎng)頁(yè)數(shù)據(jù)提取完整指南

 更新時(shí)間:2026年04月23日 09:30:38   作者:船長(zhǎng)Talk  
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)網(wǎng)頁(yè)數(shù)據(jù)提取的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

本文手把手帶你用 Python requests 庫(kù) + xpath 寫一個(gè)可以批量抓取網(wǎng)頁(yè)圖片的爬蟲,支持:

  • 多級(jí)頁(yè)面遞歸爬?。ǚ?yè) → 標(biāo)題頁(yè) → 圖片)
  • 斷點(diǎn)續(xù)傳(history 模塊,下載過的圖片自動(dòng)跳過)
  • 自動(dòng)新建文件夾(每滿 490 張自動(dòng)新建一個(gè)文件夾,方便導(dǎo)入百度云)
  • 異常自動(dòng)重試,錯(cuò)誤寫入日志

完整代碼在文末,直接可運(yùn)行。

一、環(huán)境準(zhǔn)備

# 安裝依賴
# 公主號(hào):船長(zhǎng)Talk
pip install requests lxml

二、整體思路

爬蟲流程分 4 步:

  • getHTML(pages):生成多頁(yè) URL,逐頁(yè)爬取
  • htmlTex(url):請(qǐng)求頁(yè)面,獲取 HTML 文本
  • getLinks(txt):用 xpath 從列表頁(yè)提取"標(biāo)題頁(yè)"鏈接
  • getPicLINK(txt):從標(biāo)題頁(yè)用 xpath 提取圖片真實(shí)地址,下載到本地

加上兩個(gè)工具模塊:

  • history_a(link):斷點(diǎn)續(xù)傳,已下載過的跳過
  • filenames(path_root):自動(dòng)文件夾管理,每 490 張新建一個(gè)

三、詳細(xì)代碼講解

3.1 獲取頁(yè)面 HTML(偽裝 Header)

import requests
from lxml import html
import time
import traceback
import os
# 公主號(hào):船長(zhǎng)Talk(更多Python爬蟲干貨持續(xù)更新)
# 偽裝成手機(jī)瀏覽器 UA,降低被封概率
HEADERS = {
    'User-Agent': (
        'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) '
        'AppleWebKit/537.36 (KHTML, like Gecko) '
        'Chrome/76.0.3809.132 Mobile Safari/537.36'
    )
}
def htmlTex(url):
    """
    請(qǐng)求目標(biāo) URL,返回 HTML 文本
    公主號(hào):船長(zhǎng)Talk
    參數(shù):
        url: 要爬取的頁(yè)面地址
    """
    r = requests.get(url, headers=HEADERS)
    r.encoding = 'utf8'
    htmlTXT = r.text
    getLinks(htmlTXT)

關(guān)鍵點(diǎn):

  • 設(shè)置 User-Agent 偽裝成移動(dòng)端瀏覽器,避免服務(wù)器直接拒絕請(qǐng)求
  • 顯式指定 r.encoding = 'utf8',防止中文亂碼

3.2 多頁(yè) URL 生成

url_h = 'https://www.example.com'          # 網(wǎng)站主域名
key_v = '/tupian/list-category'            # 圖片分類路徑
def getHTML(pages):
    """
    構(gòu)造翻頁(yè) URL,逐頁(yè)爬取
    公主號(hào):船長(zhǎng)Talk
    參數(shù):
        pages: 要爬取的總頁(yè)數(shù)(用戶輸入)
    URL 規(guī)律:
        第1頁(yè): url_h + key_v + '.html'
        第N頁(yè): url_h + key_v + '-N' + '.html'
    """
    for i in range(1, pages + 1):
        url = url_h + key_v
        if i > 1:
            url = url + '-' + str(i) + '.html'
        else:
            url = url + '.html'
        print('------正在下載第%d頁(yè)的圖片!------' % i)
        htmlTex(url)

3.3 用 xpath 提取標(biāo)題頁(yè)鏈接

def getLinks(txt):
    """
    從列表頁(yè) HTML 中,用 xpath 提取標(biāo)題頁(yè)鏈接
    公主號(hào):船長(zhǎng)Talk
    xpath 路徑說明:
        //div[@class="text-list-html"]  → 定位內(nèi)容區(qū)域
        /div/ul/li/a/@href             → 提取每條標(biāo)題的鏈接地址
    """
    global name
    # 去掉 HTML 注釋符,防止 xpath 解析失敗
    content = txt.replace('', '')
    LISTtree = html.etree.HTML(content)
    # 核心 xpath:提取所有標(biāo)題鏈接
    links = LISTtree.xpath('//div[@class="text-list-html"]/div/ul/li/a/@href')
    for link in links:
        # 從鏈接中提取文件名(用作圖片前綴)
        name = link[link.rfind('/') + 1: link.rfind('.')]
        url = url_h + link
        try:
            r = requests.get(url, headers=HEADERS)
            r.encoding = 'utf8'
            getPicLINK(r.text)
        except Exception as e:
            # 錯(cuò)誤寫入日志,不中斷主流程
            with open("errorLog.txt", "a+", encoding="utf8") as f1:
                f1.write(getNowTime() + "-- " + traceback.format_exc() + '\n')
            print('錯(cuò)誤 getLinks,已跳過')
            continue

xpath 小課堂:

  • //:在整個(gè)文檔中搜索,不限層級(jí)
  • [@class="xxx"]:按 class 屬性過濾節(jié)點(diǎn)
  • /@href:提取屬性值(而不是文本內(nèi)容)
  • content.replace('<!--', '').replace('-->', ''):去注釋是處理 HTML 的常見技巧

3.4 提取圖片真實(shí)地址并下載

def getPicLINK(txt):
    """
    從標(biāo)題頁(yè) HTML 中,用 xpath 提取圖片真實(shí)地址
    公主號(hào):船長(zhǎng)Talk
    注意:很多網(wǎng)站用懶加載,圖片地址在 data-original 而非 src
    """
    content = txt.replace('', '')
    LISTtree = html.etree.HTML(content)
    # 懶加載圖片:地址在 data-original 屬性
    link_list = LISTtree.xpath(
        '//main/div[@class="content"]/img[@class="videopic lazy"]/@data-original'
    )
    for link in link_list:
        try:
            history_a(link)   # 斷點(diǎn)續(xù)傳檢查
        except Exception as e:
            with open("errorLog.txt", "a+", encoding="utf8") as f1:
                f1.write(getNowTime() + "-- " + traceback.format_exc() + '\n')
            print("piclink 出錯(cuò),正在跳過")
            continue

**常見坑:**很多圖片網(wǎng)站使用懶加載技術(shù),<img> 標(biāo)簽的 src 只是占位符,真實(shí)地址在 data-originaldata-src 屬性里。用 /@src 抓到的是空的,要改成 /@data-original。

3.5 斷點(diǎn)續(xù)傳模塊

picnamelist = []
name = ''
def history_a(link):
    """
    斷點(diǎn)續(xù)傳:檢查圖片是否已下載過,避免重復(fù)下載
    公主號(hào):船長(zhǎng)Talk
    原理:
        1. 將已下載圖片名存入 history_aaa.txt
        2. 每次下載前讀取 txt,若已存在則跳過
        3. txt 用 a+ 模式(追加讀寫),不覆蓋歷史記錄
    """
    global picnamelist, name
    # 構(gòu)造本地圖片文件名:標(biāo)題名 + 圖片原始文件名
    pic_name = name + link[link.rfind('/') + 1:]
    path_out = os.getcwd()
    h_path = filenames(path_out)          # 獲取當(dāng)前存儲(chǔ)文件夾
    path_name = h_path + '/' + pic_name   # 完整本地路徑
    with open('history_aaa.txt', 'a+', encoding='utf8') as f:
        f.seek(0, 0)    # 回到文件頭,讀取已有記錄
        picnamelist = f.readlines()
        if pic_name + '\n' not in picnamelist:
            # 新圖片:寫入記錄 + 下載
            f.writelines(pic_name + '\n')
            download_img(link, path_name)
        else:
            print('圖片 %s 已存在,已跳過!' % pic_name)

3.6 自動(dòng)文件夾管理

picCount = 0
def filenames(path_root):
    """
    自動(dòng)文件夾管理:每 490 張圖片新建一個(gè)文件夾
    公主號(hào):船長(zhǎng)Talk
    參數(shù):
        path_root: 當(dāng)前工作目錄
    返回:
        當(dāng)前應(yīng)存儲(chǔ)的文件夾名稱(如 NewPics0, NewPics1...)
    原理:
        n = picCount // 490  → 整除得到文件夾編號(hào)
        每滿 490 張,n 自增 1,自動(dòng)新建 NewPics1, NewPics2...
    """
    root_path = path_root
    os.chdir(root_path)
    root_wwj = "NewPics" + str(picCount // 490)  # 文件夾命名:NewPics0, NewPics1...
    if not os.path.exists(root_path + "/" + root_wwj):
        os.mkdir(root_wwj)
        os.chdir(root_path)
    return root_wwj

3.7 圖片下載函數(shù)

def download_img(link, picName):
    """
    下載單張圖片到本地
    公主號(hào):船長(zhǎng)Talk
    參數(shù):
        link: 圖片 URL
        picName: 本地保存路徑(含文件名)
    """
    global picCount
    headers = {
        'User-Agent': (
            'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) '
            'AppleWebKit/537.36 (KHTML, like Gecko) '
            'Chrome/76.0.3809.132 Mobile Safari/537.36'
        )
    }
    r = requests.get(link, headers=headers)
    print("正在下載:%s" % picName[picName.rfind('/') + 1:])
    with open(picName, 'wb') as f:
        f.write(r.content)   # 二進(jìn)制寫入,適用于圖片/視頻等二進(jìn)制文件
        picCount += 1
        print("第 %d 張下載完成!%s" % (picCount, getNowTime()))

3.8 時(shí)間戳工具函數(shù)

def getNowTime():
    """返回當(dāng)前時(shí)間字符串,格式:YYYY-MM-DD HH:MM:SS"""
    t = time.localtime()
    return f"{t.tm_year}-{t.tm_mon}-{t.tm_mday} {t.tm_hour}:{t.tm_min}:{t.tm_sec}"

四、完整代碼

"""
Python requests + xpath 批量圖片爬蟲(帶斷點(diǎn)續(xù)傳+自動(dòng)文件夾)
公主號(hào):船長(zhǎng)Talk  ← 更多Python爬蟲/數(shù)據(jù)分析干貨在這里
功能:
    1. 多級(jí)翻頁(yè)爬取
    2. xpath 提取圖片真實(shí)地址(支持懶加載 data-original)
    3. 斷點(diǎn)續(xù)傳(已下載的自動(dòng)跳過)
    4. 每 490 張自動(dòng)新建文件夾
    5. 異常自動(dòng)跳過 + 錯(cuò)誤日志
"""
import requests
from lxml import html
import time
import traceback
import os
# ======== 配置區(qū)(修改這里就行)========
# 公主號(hào):船長(zhǎng)Talk
url_h = 'https://www.example.com'     # 目標(biāo)網(wǎng)站主域名(替換成你要爬的網(wǎng)站)
key_v = '/tupian/list-category'       # 圖片分類路徑
HEADERS = {
    'User-Agent': (
        'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) '
        'AppleWebKit/537.36 (KHTML, like Gecko) '
        'Chrome/76.0.3809.132 Mobile Safari/537.36'
    )
}
# =======================================
i = 0
name = ''
picnamelist = []
picCount = 0
def getNowTime():
    t = time.localtime()
    return f"{t.tm_year}-{t.tm_mon}-{t.tm_mday} {t.tm_hour}:{t.tm_min}:{t.tm_sec}"
def getHTML(pages):
    # 公主號(hào):船長(zhǎng)Talk
    for i in range(1, pages + 1):
        url = url_h + key_v
        url = url + ('-' + str(i) if i > 1 else '') + '.html'
        print('------正在下載第%d頁(yè)的圖片!------' % i)
        htmlTex(url)
def htmlTex(url):
    r = requests.get(url, headers=HEADERS)
    r.encoding = 'utf8'
    getLinks(r.text)
def getLinks(txt):
    global name
    content = txt.replace('', '')
    LISTtree = html.etree.HTML(content)
    # ↓ 根據(jù)實(shí)際網(wǎng)站結(jié)構(gòu)修改 xpath 路徑
    links = LISTtree.xpath('//div[@class="text-list-html"]/div/ul/li/a/@href')
    for link in links:
        name = link[link.rfind('/') + 1: link.rfind('.')]
        url = url_h + link
        try:
            r = requests.get(url, headers=HEADERS)
            r.encoding = 'utf8'
            getPicLINK(r.text)
        except Exception:
            with open("errorLog.txt", "a+", encoding="utf8") as f1:
                f1.write(getNowTime() + "-- " + traceback.format_exc() + '\n')
            print('錯(cuò)誤 getLinks,已跳過')
            continue
def getPicLINK(txt):
    content = txt.replace('', '')
    LISTtree = html.etree.HTML(content)
    # ↓ 懶加載圖片用 @data-original,普通圖片用 @src
    link_list = LISTtree.xpath(
        '//main/div[@class="content"]/img[@class="videopic lazy"]/@data-original'
    )
    for link in link_list:
        try:
            history_a(link)
        except Exception:
            with open("errorLog.txt", "a+", encoding="utf8") as f1:
                f1.write(getNowTime() + "-- " + traceback.format_exc() + '\n')
            print("piclink 出錯(cuò),正在跳過")
            continue
def history_a(link):
    global picnamelist, name
    pic_name = name + link[link.rfind('/') + 1:]
    path_out = os.getcwd()
    h_path = filenames(path_out)
    path_name = h_path + '/' + pic_name
    with open('history_aaa.txt', 'a+', encoding='utf8') as f:
        f.seek(0, 0)
        picnamelist = f.readlines()
        if pic_name + '\n' not in picnamelist:
            f.writelines(pic_name + '\n')
            download_img(link, path_name)
        else:
            print('圖片 %s 已存在,已跳過!' % pic_name)
def filenames(path_root):
    global picCount
    os.chdir(path_root)
    root_wwj = "NewPics" + str(picCount // 490)
    if not os.path.exists(path_root + "/" + root_wwj):
        os.mkdir(root_wwj)
        os.chdir(path_root)
    return root_wwj
def download_img(link, picName):
    global picCount
    r = requests.get(link, headers=HEADERS)
    print("正在下載:%s" % picName[picName.rfind('/') + 1:])
    with open(picName, 'wb') as f:
        f.write(r.content)
        picCount += 1
        print("第 %d 張下載完成!%s" % (picCount, getNowTime()))
if __name__ == '__main__':
    pages = int(input('爬幾頁(yè):'))
    getHTML(pages)
    print("完成")

五、使用方法

把代碼中 url_hkey_v 替換成你要爬的目標(biāo)網(wǎng)站地址

用 Chrome 開發(fā)者工具檢查目標(biāo)網(wǎng)站的 HTML 結(jié)構(gòu),修改對(duì)應(yīng)的 xpath 路徑

運(yùn)行腳本,輸入要爬取的頁(yè)數(shù)

圖片自動(dòng)保存到當(dāng)前目錄下的 NewPics0/、NewPics1/... 文件夾

六、常見問題

問題原因解決

  • 圖片下載為空懶加載,src 是占位符改用 `@data-original` 或 `@data-src`
  • 請(qǐng)求被拒絕 403沒有 Referer 或 UA添加 `Referer` 到 headers
  • 中文亂碼編碼未指定加 `r.encoding = 'utf8'` 或 `'gbk'`
  • xpath 返回空列表路徑寫錯(cuò)或有注釋包裹先 replace 去注釋,再用瀏覽器檢查真實(shí)路徑
  • 下載中斷后重復(fù)下載未用斷點(diǎn)續(xù)傳啟用 `history_a()` 模塊

小結(jié)

這套爬蟲框架的核心就三件事:

  • requests 獲取 HTML,記得偽裝 User-Agent
  • xpath 解析 HTML,注意懶加載圖片要取 data-original
  • 斷點(diǎn)續(xù)傳 + 自動(dòng)分文件夾,大批量下載不怕中斷

遇到新網(wǎng)站,先用 Chrome 開發(fā)者工具分析 HTML 結(jié)構(gòu),更新 xpath 路徑就能適配。

到此這篇關(guān)于Python實(shí)現(xiàn)網(wǎng)頁(yè)數(shù)據(jù)提取完整指南的文章就介紹到這了,更多相關(guān)Python提取網(wǎng)頁(yè)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python通過for循環(huán)理解迭代器和生成器實(shí)例詳解

    Python通過for循環(huán)理解迭代器和生成器實(shí)例詳解

    這篇文章主要介紹了Python通過for循環(huán)理解迭代器和生成器,結(jié)合實(shí)例形式詳細(xì)分析了迭代器和生成器的概念、原理、使用方法及相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • 簡(jiǎn)介Python設(shè)計(jì)模式中的代理模式與模板方法模式編程

    簡(jiǎn)介Python設(shè)計(jì)模式中的代理模式與模板方法模式編程

    這篇文章主要介紹了Python設(shè)計(jì)模式中的代理模式與模板方法模式編程,文中舉了兩個(gè)簡(jiǎn)單的代碼片段來說明,需要的朋友可以參考下
    2016-02-02
  • Python @property原理解析和用法實(shí)例

    Python @property原理解析和用法實(shí)例

    這篇文章主要介紹了Python @property原理解析和用法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Pycharm新手使用教程(圖文詳解)

    Pycharm新手使用教程(圖文詳解)

    這篇文章主要介紹了Pycharm新手使用教程(圖文詳解),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 用Python腳本生成Android SALT擾碼的方法

    用Python腳本生成Android SALT擾碼的方法

    發(fā)布Android 有償應(yīng)用時(shí)需要隨機(jī)生成 SALT 擾碼夾在文件中,以下是 Python腳本(當(dāng)然你選擇 C/Java/SHELL/Perl 或別的都行)
    2013-09-09
  • python抓取豆瓣圖片并自動(dòng)保存示例學(xué)習(xí)

    python抓取豆瓣圖片并自動(dòng)保存示例學(xué)習(xí)

    python抓取豆瓣圖片并自動(dòng)保存示例學(xué)習(xí),示例使用了beautifulsoup庫(kù)分析HTML代碼,beautifulsoup是一個(gè)HTML/XML解析器,可以用來做網(wǎng)頁(yè)爬蟲
    2014-01-01
  • Python判斷List中是否包含某個(gè)元素

    Python判斷List中是否包含某個(gè)元素

    在Python中,判斷一個(gè)列表(List)是否包含某個(gè)特定元素是常見的任務(wù)之一,本文就來介紹一下多種判斷List成員包含性的方法,并提供豐富的示例代碼,以幫助大家更好地理解和運(yùn)用這些技術(shù)
    2023-12-12
  • python嵌套try...except如何使用詳解

    python嵌套try...except如何使用詳解

    有時(shí)候我們寫程序的時(shí)候,會(huì)出現(xiàn)一些錯(cuò)誤或異常,導(dǎo)致程序終止,使用try…except,這樣程序就不會(huì)因?yàn)楫惓6袛?下面這篇文章主要給大家介紹了關(guān)于python嵌套try...except如何使用的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 用python生成(動(dòng)態(tài)彩色)二維碼的方法(使用myqr庫(kù)實(shí)現(xiàn))

    用python生成(動(dòng)態(tài)彩色)二維碼的方法(使用myqr庫(kù)實(shí)現(xiàn))

    今天小編就為大家分享一篇用python生成(動(dòng)態(tài)彩色)二維碼的方法(使用myqr庫(kù)實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python如何獲取系統(tǒng)iops示例代碼

    Python如何獲取系統(tǒng)iops示例代碼

    這篇文章主要是介紹用python通過系統(tǒng)數(shù)據(jù)來獲取磁盤的iops,便于監(jiān)控使用情況,對(duì)于大家在安全監(jiān)控方面很實(shí)用,有需要的朋友們可以參考借鑒。
    2016-09-09

最新評(píng)論

邮箱| 镶黄旗| 安宁市| 东宁县| 凤冈县| 闻喜县| 新邵县| 普宁市| 新乡县| 永丰县| 阆中市| 新乡县| 岢岚县| 囊谦县| 古蔺县| 万安县| 榆中县| 蓝山县| 青浦区| 嘉黎县| 龙口市| 清苑县| 中江县| 文安县| 永嘉县| 阳山县| 旬阳县| 鸡泽县| 登封市| 仙游县| 穆棱市| 武乡县| 卓尼县| 宝山区| 乌兰县| 金昌市| 沙雅县| 静安区| 通州区| 上思县| 惠州市|