京东商品详情数据接口(JD.item_get)

京东商品详情数据接口提供了商品详细信息,如标题、价格等,适用于电商应用、数据分析、个性化推荐等。开发者需注册获取API权限,注意遵守规则和安全操作。

京东商品详情数据接口是京东开放平台提供的一种API接口,通过调用该接口,开发者可以获取京东商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息。该接口的主要作用是帮助开发者获取商品的详细数据,从而更好地了解和分析商品详情。

要使用京东商品详情数据接口,开发者需要先在京东开放平台上注册并获取API权限和密钥。然后,使用相应的开发工具或语言调用接口,传入商品ID或其他条件,以获取商品的详细信息。获取到的数据可以帮助开发者进行各种应用,例如展示商品信息、对比不同商品的价格和评价、制定营销策略等。

京东商品详情数据接口的优点包括:

  1. 数据全面:可以获取到商品的详细信息,包括商品ID、标题、价格、库存量、图片等基本信息,以及一些扩展属性,帮助开发者全面了解商品情况。
  2. 数据实时:可以实时获取商品的最新详情数据,帮助开发者及时了解市场变化和用户反馈。
  3. 数据扩展:可以通过API的二次开发,实现更丰富的功能和应用,例如自定义查询条件、批量获取商品信息等。

需要注意的是,使用京东商品详情数据接口需要遵守京东开放平台的API使用规则和调用方式,确保合规操作。此外,为了保护系统的稳定性和安全性,建议在接口调用时加入相应的异常处理和日志记录。

今天给大家分享关于封装商品ID或者是商品链接获取京东商品详情数据接口方法 ,支持高并发请求。

JD.item_get-获得JD商品详情数据接口返回值说明

1.公共参数

名称类型必须描述
keyString调用key(必须以GET方式拼接在URL中,企业级服务商
secretString调用密钥
api_nameStringAPI接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]
cacheString[yes,no]默认yes,将调用缓存的数据,速度比较快
result_typeString[json,jsonu,xml,serialize,var_export]返回数据格式,默认为json,jsonu输出的内容中文可以直接阅读
langString[cn,en,ru]翻译语言,默认cn简体中文
versionStringAPI版本(复制V:Taobaoapi2014 获取 API SDK文件)

2.请求示例

3.响应示例

京东商品详情数据接口的应用场景非常广泛,主要包括以下几个方面:

  1. 电商应用: 这是最主要的应用场景,开发者可以将京东商品详情数据接口集成到自己的电商应用中,展示商品的基本信息、价格、库存、销量、评价等。用户可以更直观、更全面地了解商品,从而提高购物体验,增加购买转化率。
  2. 数据分析: 开发者可以利用京东商品详情数据接口获取的大量商品数据,进行数据挖掘和分析,掌握商品的销售情况、用户喜好、市场趋势等,为商品策略制定、营销方案优化提供数据支持。
  3. 个性化推荐: 基于用户的购物历史、浏览行为等数据,结合京东商品详情数据接口提供的商品信息,开发者可以构建个性化推荐系统,向用户推荐他们可能感兴趣的商品,提升用户满意度和购物体验。
  4. 比价工具: 对于需要比较不同平台商品价格的用户,开发者可以通过京东商品详情数据接口获取京东平台的商品价格信息,并结合其他平台的数据,为用户提供商品价格比较服务。
  5. 市场研究: 对于市场研究人员,可以通过京东商品详情数据接口获取的商品销售数据、用户评价等信息,进行市场竞争分析、用户行为研究等,为市场决策提供依据。

以上只是京东商品详情数据接口的一些典型应用场景,实际上,它的应用还可以根据具体需求进行扩展和创新。

from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import TimeoutException, NoSuchElementException, WebDriverException from bs4 import BeautifulSoup import requests import re import time import csv import random import os import sys from aip import AipNlp from webdriver_manager.chrome import ChromeDriverManager import pickle from selenium.webdriver.common.action_chains import ActionChains # 百度AI配置 APP_ID = '119348823' API_KEY = 'BMUyFD1qn0p4BgaRL5ZsFAHS' SECRET_KEY = 'jSvSCxAOm47OGB7JxM0g05UKWeagFFPe' client = AipNlp(APP_ID, API_KEY, SECRET_KEY) # 随机请求头 USER_AGENTS = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.142 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15" ] def get_driver(): """创建并配置浏览器驱动""" chrome_options = Options() # 调试时注释掉无头模式 # chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--window-size=1920,1080") chrome_options.add_argument(f"user-agent={random.choice(USER_AGENTS)}") chrome_options.add_argument("--disable-blink-features=AutomationControlled") chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option('useAutomationExtension', False) # 自动下载并管理ChromeDriver service = Service(ChromeDriverManager().install()) driver = webdriver.Chrome(service=service, options=chrome_options) # 隐藏自动化特征 driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") return driver def login_jd(driver): """执行京东登录流程""" print("开始登录京东账号...") login_url = "https://passport.jd.com/new/login.aspx" driver.get(login_url) time.sleep(3) # 检查是否已有cookies文件 cookies_file = "jd_cookies.pkl" if os.path.exists(cookies_file): print("检测到已有cookies文件,尝试加载...") with open(cookies_file, 'rb') as f: cookies = pickle.load(f) for cookie in cookies: driver.add_cookie(cookie) print("cookies加载完成") driver.refresh() time.sleep(2) # 检查登录是否成功 try: nickname = driver.find_element(By.CLASS_NAME, "nickname").text print(f"登录成功! 用户名: {nickname}") return True except: print("cookies已失效,需要重新登录") print("请手动完成登录...") print("等待用户登录(你有60秒时间完成登录)") # 等待登录完成 try: WebDriverWait(driver, 60).until( EC.presence_of_element_located((By.CLASS_NAME, "nickname")) ) nickname = driver.find_element(By.CLASS_NAME, "nickname").text print(f"登录成功! 用户名: {nickname}") # 保存cookies cookies = driver.get_cookies() with open(cookies_file, 'wb') as f: pickle.dump(cookies, f) print("登录状态已保存到cookies文件") return True except TimeoutException: print("登录超时,继续未登录状态爬取") return False def jd_book_crawler(search_keyword, max_pages=2): """修改后的京东图书爬虫函数 - 支持登录""" print("启动浏览器...") driver = get_driver() # 执行登录 login_success = login_jd(driver) books_data = [] try: print(f"访问京东首页...") driver.get("https://www.jd.com") time.sleep(random.uniform(1, 3)) print("京东首页加载成功") # 搜索图书 print(f"搜索关键词: {search_keyword}") try: # 多种定位搜索框的方式 search_box = WebDriverWait(driver, 15).until( EC.element_to_be_clickable((By.ID, "key")) ) except TimeoutException: # 备选定位方式 search_box = WebDriverWait(driver, 15).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "input.search-key")) ) # 模拟真实输入 search_box.clear() for char in search_keyword: search_box.send_keys(char) time.sleep(random.uniform(0.05, 0.15)) # 提交搜索 search_box.send_keys(Keys.ENTER) print("已提交搜索") time.sleep(random.uniform(2, 4)) # 验证是否跳转到搜索结果页 try: WebDriverWait(driver, 15).until( EC.url_contains("search") ) print("已进入搜索结果页") except TimeoutException: print("可能遇到验证码或反爬页面,尝试重新加载...") driver.get(f"https://search.jd.com/Search?keyword={search_keyword}") time.sleep(random.uniform(3, 5)) # 等待结果加载 print("等待商品列表加载...") try: # 多种等待商品加载的方式 WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".gl-item, .goods-list-v2 .item, .j-sku-item")) ) time.sleep(random.uniform(1, 2)) except TimeoutException: print("商品加载超时,尝试备用加载方式...") # 尝试滚动页面触发加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight/3);") time.sleep(2) driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);") time.sleep(2) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) for page in range(1, max_pages + 1): print(f"正在处理第 {page} 页") # 获取页面源码 html = driver.page_source soup = BeautifulSoup(html, 'html.parser') # 多种商品列表选择器 items = soup.select('.gl-item') # 京东主站 if not items: items = soup.select('.goods-list-v2 .item') # 图书频道 if not items: items = soup.select('.j-sku-item') # 备用选择器 if not items: print("警告:未找到商品元素,尝试保存页面源码以供分析") with open(f"jd_page_{page}.html", "w", encoding="utf-8") as f: f.write(html) print("页面源码已保存") continue print(f"本页找到 {len(items)} 个商品") for idx, item in enumerate(items): try: # 多种标题选择器 title_elem = item.select_one('.p-name a em') or \ item.select_one('.p-name a') or \ item.select_one('.p-name-type-2 a') or \ item.select_one('.name a') title = title_elem.text.strip() if title_elem else "N/A" # 多种价格选择器 price_elem = item.select_one('.p-price strong') or \ item.select_one('.p-price i') or \ item.select_one('.price-box .price') or \ item.select_one('.j-price') price = price_elem.text.strip() if price_elem else "0.00" # 提取SKU/ISBN isbn = item.get('data-sku') or item.get('data-spu') or "N/A" # 详情页URL detail_elem = item.select_one('.p-img a') or \ item.select_one('.pic a') or \ item.select_one('.name a') detail_url = detail_elem['href'] if detail_elem and 'href' in detail_elem.attrs else "" if detail_url and not detail_url.startswith('http'): detail_url = 'https:' + detail_url books_data.append({ 'title': title, 'price': price, 'isbn': isbn, 'url': detail_url }) if (idx + 1) % 5 == 0: print(f"已处理 {idx + 1}/{len(items)} 个商品") except Exception as e: print(f"商品 {idx + 1} 提取错误: {str(e)[:50]}...") # 翻页处理 if page < max_pages: print("尝试翻页...") try: # 多种翻页按钮定位方式 next_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '.pn-next, .pn-next:not(.disabled)')) ) driver.execute_script("arguments[0].scrollIntoView({behavior: 'smooth', block: 'center'});", next_btn) time.sleep(0.5) driver.execute_script("arguments[0].click();", next_btn) time.sleep(random.uniform(3, 5)) # 等待新页面加载 try: WebDriverWait(driver, 15).until( EC.presence_of_element_located( (By.CSS_SELECTOR, ".gl-item, .goods-list-v2 .item, .j-sku-item")) ) print("翻页成功") except TimeoutException: print("翻页后商品加载超时,继续尝试...") except (TimeoutException, NoSuchElementException): print("无法找到下一页按钮,尝试URL翻页...") current_url = driver.current_url if "page=" in current_url: new_page = page + 1 new_url = re.sub(r"page=\d+", f"page={new_page}", current_url) else: new_url = current_url + f"&page={new_page}" driver.get(new_url) time.sleep(random.uniform(3, 5)) print(f"已跳转到第 {new_page} 页") except Exception as e: print(f"爬取过程中发生严重错误: {str(e)}") # 保存当前页面供调试 with open("jd_error_page.html", "w", encoding="utf-8") as f: f.write(driver.page_source) print("错误页面已保存为 jd_error_page.html") finally: driver.quit() print(f"浏览器已关闭") print(f"爬取完成,共获取 {len(books_data)} 条图书数据") return books_data # 其他函数保持不变(analyze_comments_sentiment, main等) def analyze_comments_sentiment(comment_url): """评论情感分析""" if not comment_url: print("无有效URL,跳过评论分析") return [] print(f"开始分析评论: {comment_url}") driver = get_driver() sentiments = [] try: driver.get(comment_url) time.sleep(random.uniform(3, 5)) print("商品页面加载成功") # 切换到评论标签 - 更健壮的等待方式 print("切换到评论标签...") try: # 尝试点击评论标签 comment_tab = WebDriverWait(driver, 15).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "[data-anchor='#comment']")) ) driver.execute_script("arguments[0].click();", comment_tab) time.sleep(random.uniform(2, 3)) print("评论标签切换成功") except: # 如果找不到元素,尝试直接访问评论URL if "#comment" not in driver.current_url: driver.get(comment_url + "#comment") print("直接访问评论页") time.sleep(random.uniform(3, 5)) # 提取评论内容 comments = [] print("开始提取评论...") for page_num in range(1, 4): # 最多尝试3页 print(f"处理评论页 {page_num}") try: # 等待评论加载 WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".comment-item")) ) time.sleep(random.uniform(1, 2)) soup = BeautifulSoup(driver.page_source, 'html.parser') comment_items = soup.select('.comment-item') print(f"本页找到 {len(comment_items)} 条评论") for idx, item in enumerate(comment_items): try: comment_elem = item.select_one('.comment-con') or item.select_one('.comment-content') if comment_elem: comment = comment_elem.get_text(strip=True) if 10 < len(comment) < 200: # 过滤过长/过短评论 comments.append(comment) except: continue # 检查是否达到所需评论数 if len(comments) >= 15: print(f"已收集足够评论({len(comments)}条)") break # 尝试翻页 try: next_btn = driver.find_element(By.CSS_SELECTOR, '.ui-pager-next') if "disabled" in next_btn.get_attribute("class"): print("已是最后一页") break print("翻到下一页评论") driver.execute_script("arguments[0].scrollIntoView();", next_btn) time.sleep(0.5) driver.execute_script("arguments[0].click();", next_btn) time.sleep(random.uniform(2, 4)) except Exception as e: print(f"评论翻页失败: {str(e)[:50]}...") break except Exception as e: print(f"评论页处理错误: {str(e)[:50]}...") break except Exception as e: print(f"评论爬取失败: {str(e)[:50]}...") finally: driver.quit() if not comments: print("未获取到有效评论") return [] print(f"共获取 {len(comments)} 条评论,开始情感分析...") # 情感分析 sentiment_results = [] for i, comment in enumerate(comments[:15]): # 限制分析数量 try: # 控制请求频率 if i > 0 and i % 3 == 0: delay = random.uniform(0.5, 1.5) time.sleep(delay) # 确保文本长度符合要求 text = comment[:min(len(comment), 500)] result = client.sentimentClassify(text) if 'items' in result and len(result['items']) > 0: sentiment = result['items'][0]['sentiment'] sentiment_results.append(sentiment) # 打印进度 if (i + 1) % 5 == 0: print(f"已分析 {i + 1}/{len(comments[:15])} 条评论") except Exception as e: print(f"评论 {i + 1} 情感分析错误: {str(e)[:50]}...") print(f"情感分析完成,共分析 {len(sentiment_results)} 条评论") return sentiment_results def main(): print("=" * 50) print("京东图书爬虫与情感分析程序启动(支持登录)") print("=" * 50) # 创建浏览器实例 driver = get_driver() # 执行登录 login_success = login_jd(driver) # 爬取图书数据 print("\n开始爬取京东图书数据...") books = jd_book_crawler("Python编程", max_pages=2, driver=driver) # 保存结果到CSV if books: filename = 'jd_books.csv' with open(filename, 'w', newline='', encoding='utf-8-sig') as f: writer = csv.DictWriter(f, fieldnames=['title', 'price', 'isbn', 'url']) writer.writeheader() writer.writerows(books) print(f"\n数据已保存到 {filename}") # 对第一本书进行评论分析 if books: first_book = books[0] print(f"\n开始分析书籍评论: {first_book['title']}") sentiments = analyze_comments_sentiment(first_book['url']) if sentiments: # 统计情感分布 positive = sum(1 for s in sentiments if s == 2) negative = sum(1 for s in sentiments if s == 0) neutral = sum(1 for s in sentiments if s == 1) total = len(sentiments) print("\n情感分析结果:") print(f"样本数量: {total}") print(f"积极评价m: {positive} ({positive / total:.1%})") print(f"中性评价: {neutral} ({neutral / total:.1%})") print(f"消极评价: {negative} ({negative / total:.1%})") else: print("未获取到有效评论数据") else: print("没有可分析的图书数据") else: print("未爬取到图书数据") print("\n程序执行完成") driver.quit() if __name__ == "__main__": main() D:\python.exe C:/Users/32936/PycharmProjects/数据采集/作业.py ================================================== 京东图书爬虫与情感分析程序启动(支持登录) ================================================== 开始登录京东账号... 请手动完成登录... 等待用户登录(你有60秒时间完成登录) Traceback (most recent call last): File "C:\Users\32936\PycharmProjects\数据采集\作业.py", line 469, in <module> main() File "C:\Users\32936\PycharmProjects\数据采集\作业.py", line 427, in main books = jd_book_crawler("Python编程", max_pages=2, driver=driver) TypeError: jd_book_crawler() got an unexpected keyword argument 'driver' 登录超时,继续未登录状态爬取 开始爬取京东图书数据... Process finished with exit code 1 在这个代码的基础上修改
06-27
<think>我们遇到了一个错误:TypeError:jd_book_crawler()gotanunexpectedkeywordargument'driver'这是因为我们在调用jd_book_crawler时传递了driver参数,但是jd_book_crawler函数的定义并没有接收driver参数。我们需要修改jd_book_crawler函数,使其可以接收一个driver参数,这样我们就可以使用登录后的driver进行爬取。修改方案:1.jd_book_crawler函数定义中添加driver参数,并设置为可选,如果不传入则自己创建。2.在函数内部,如果传入了driver,则使用传入的driver;否则,自己创建。同时,我们注意到在main函数中,我们先创建了一个driver,然后用于登录,再传递给jd_book_crawler。但是,在jd_book_crawler函数内部,如果传入了driver,则不应该在函数结束时关闭driver(因为main函数后面还要用),但是我们在jd_book_crawler函数内部有finally:driver.quit(),这样会导致main函数中的driver被关闭,后续无法使用。因此,我们需要调整driver的生命周期管理:方案一:不在jd_book_crawler函数内部关闭driver,而是在main函数中统一管理。方案二:在jd_book_crawler函数内部根据driver是否为外部传入来决定是否关闭。这里我们选择方案二:在jd_book_crawler函数内部,如果driver是外部传入的,则不关闭;如果是自己创建的,则关闭。修改步骤:1.修改jd_book_crawler函数,增加一个参数driver,默认值为None。2.在函数内部,如果driver为None,则自己创建driver,并标记为内部创建(local_driver=True),否则使用传入的driver(并标记local_driver=False)。3.在finally块中,根据local_driver标志来决定是否关闭driver。同时,在analyze_comments_sentiment函数中,我们每次调用都会创建新的driver,这会导致登录状态丢失。我们可以考虑将登录后的driver也传递给它,但考虑到评论分析是独立的,且可能在不同的时间执行,我们暂时不修改(因为登录状态在cookies中,如果保存了cookies,则每次创建driver后加载cookies就可以保持登录状态)。但是,为了效率,我们可以考虑在main函数中创建一个driver,然后传递给所有函数。但这里我们先不改变analyze_comments_sentiment,因为它的调用在jd_book_crawler之后,且jd_book_crawler已经关闭了driver(如果自己创建的话)。我们现在的目标是在登录状态下爬取,所以jd_book_crawler使用登录后的driver,而analyze_comments_sentiment单独创建driver并加载cookies(如果登录成功,cookies文件存在,则它也会是登录状态)。但是,我们的login_jd函数已经保存了cookies,所以analyze_comments_sentiment中创建的driver也会加载同样的cookies文件(如果有的话),从而也是登录状态。因此,我们修改jd_book_crawler函数,使其可以接收driver参数,并管理自己的driver(如果是自己创建的则关闭,否则不关闭)。具体修改如下:</think>我注意到代码中存在一个错误:`jd_book_crawler()`函数不接受`driver`参数,但在`main()`函数中却传递了这个参数。让我们修复这个问题,并优化登录流程: ```python import os import pickle import time import random import csv from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException # ... 其他导入保持不变 ... def login_jd(driver): """执行京东登录流程 - 优化版本""" print("开始登录京东账号...") cookies_file = "jd_cookies.pkl" # 首先尝试加载cookies if os.path.exists(cookies_file): print("检测到已有cookies文件,尝试加载...") with open(cookies_file, 'rb') as f: cookies = pickle.load(f) # 清除现有cookies driver.delete_all_cookies() # 添加保存的cookies for cookie in cookies: # 确保domain正确 if 'domain' in cookie and '.jd.com' in cookie['domain']: try: driver.add_cookie(cookie) except Exception as e: print(f"添加cookie失败: {str(e)[:50]}...") print("cookies加载完成") # 刷新页面验证登录状态 driver.get("https://www.jd.com") time.sleep(2) # 检查登录是否成功 try: WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.CLASS_NAME, "nickname")) ) nickname = driver.find_element(By.CLASS_NAME, "nickname").text print(f"登录成功! 用户名: {nickname}") return True except: print("cookies已失效,需要重新登录") # 手动登录流程 print("请手动完成登录...") login_url = "https://passport.jd.com/new/login.aspx" driver.get(login_url) time.sleep(2) # 切换到账户登录 try: account_tab = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, ".login-tab-r")) ) account_tab.click() time.sleep(1) except: print("无法切换到账户登录,继续扫码登录") print("等待用户登录(你有60秒时间完成登录)") # 等待登录完成 try: WebDriverWait(driver, 60).until( EC.presence_of_element_located((By.CLASS_NAME, "nickname")) ) nickname = driver.find_element(By.CLASS_NAME, "nickname").text print(f"登录成功! 用户名: {nickname}") # 保存cookies cookies = driver.get_cookies() with open(cookies_file, 'wb') as f: pickle.dump(cookies, f) print("登录状态已保存到cookies文件") return True except TimeoutException: print("登录超时,继续未登录状态爬取") return False except Exception as e: print(f"登录失败: {str(e)}") return False def jd_book_crawler(search_keyword, max_pages=2, driver=None): """京东图书爬虫函数 - 支持外部传入driver""" if driver is None: print("启动浏览器...") driver = get_driver() should_close_driver = True # 标记是否需要关闭driver else: should_close_driver = False try: # 确保在京东首页 if "jd.com" not in driver.current_url: print(f"访问京东首页...") driver.get("https://www.jd.com") time.sleep(random.uniform(1, 3)) print("京东首页加载成功") # ... 其余爬取逻辑保持不变 ... except Exception as e: print(f"爬取过程中发生严重错误: {str(e)}") # 保存当前页面供调试 with open("jd_error_page.html", "w", encoding="utf-8") as f: f.write(driver.page_source) print("错误页面已保存为 jd_error_page.html") finally: if should_close_driver: driver.quit() print(f"浏览器已关闭") else: print(f"浏览器保持打开状态") print(f"爬取完成,共获取 {len(books_data)} 条图书数据") return books_data def main(): print("=" * 50) print("京东图书爬虫与情感分析程序启动(支持登录)") print("=" * 50) # 创建浏览器实例并登录 driver = get_driver() login_success = login_jd(driver) # 爬取图书数据 - 使用已登录的driver print("\n开始爬取京东图书数据...") books = jd_book_crawler("Python编程", max_pages=2, driver=driver) # ... 其余代码保持不变 ... # 最后关闭driver driver.quit() print("\n程序执行完成") ``` ### 关键修改解释: 1. **修复函数参数问题**: - 修改了`jd_book_crawler()`函数定义,添加了`driver=None`参数 - 添加了`should_close_driver`标志,确保只在函数内部创建driver时才关闭 2. **优化登录流程**: - 在加载cookies前先清除现有cookies - 添加了cookies域名的验证 - 切换到账户登录模式(避免默认的扫码登录) - 增加了错误处理和状态验证 3. **改进driver管理**: - `main()`函数统一管理driver生命周期 - 登录后保持driver打开状态用于爬取 - 爬取完成后统一关闭driver 4. **增强健壮性**: - 添加了更多异常处理 - 改进了登录状态验证 - 优化了页面加载检查 ### 使用说明: 1. **首次运行**: - 程序会打开登录页面 - 手动输入账号密码完成登录 - 登录状态会保存到`jd_cookies.pkl` 2. **后续运行**: - 自动加载保存的cookies - 无需手动登录 - 如果cookies失效,会提示重新登录 3. **登录提示**: - 程序会自动切换到账户登录模式 - 有60秒时间完成登录操作 - 登录成功后显示用户名 ### 注意事项: 1. **京东反爬机制**: - 登录后访问频率过高可能触发验证 - 建议添加随机延迟:`time.sleep(random.uniform(1, 3))` 2. **验证码处理**: - 可能需要处理滑动验证码 - 可以添加验证码识别模块或手动处理 3. **cookies有效期**: - 京东登录状态通常可持续数天 - 长时间未使用后需重新登录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值