NiuCarrey 2024-03-09 20:44 采纳率: 50%
浏览 188

selenium爬取京东商品信息加载失败

selenium爬取京东商品信息加载失败

img

如图selenium爬取京东网站商品页面出现加载失败,无法加载当前页面剩余数据

主要代码如下

def get_page(driver):
    content = []
    for ele1 in driver.find_elements(By.CLASS_NAME,'gl-item'):
        pr = ele1.find_element(By.CLASS_NAME,'p-price').text
        na = ele1.find_element(By.CLASS_NAME,'p-name').text
        s = ele1.find_element(By.CLASS_NAME,'p-shop').text
        gid = ele1.get_attribute('data-sku')
        icon = ele1.find_element(By.CLASS_NAME,'p-icons').text
        content.append([gid,na,pr,s,icon])
    df = pd.DataFrame(data=content,columns=['id','name','price','shop','icon'])
    return df

def next(driver,p):
    page = driver.find_element(By.CSS_SELECTOR,'#J_bottomPage > span.p-skip > input')
    page.send_keys(Keys.BACK_SPACE)
    page.send_keys(Keys.BACK_SPACE)
    page.send_keys(str(p))
    time.sleep(5)
    page.send_keys(Keys.ENTER)

for i in range(1,101):
    df1 = pd.concat([df1,get_page(driver)])
    next(driver,i+1)

经过以下尝试:

  1. 增加代码等待时间

  2. 模拟页面拖动(键盘空格键向下)

driver.find_element(By.TAG_NAME,'body').send_keys(Keys.SPACE)
  1. 点击“重试”按钮
def pass_fresh(driver):
    t = driver.find_element(By.LINK_TEXT,'重试')
    ac = ActionChains(t)
    time.sleep(0.5)
    t.click()
    time.sleep(1)    
  1. 刷新当前页面
driver.find_element(By.TAG_NAME,'body').send_keys(Keys.F5)

多次尝试点击“重试”按钮、刷新页面仍无法加载(偶尔可以加载成功),求个解决方法。

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-09 20:45
    关注

    引自免费微信小程序:皆我百晓生

    针对您遇到的Selenium爬取京东商品信息加载失败的问题,根据您的代码和尝试,可以推测是由于动态加载内容或反爬机制导致数据未能完全加载。以下是一些解决方案和建议:

    1. 等待页面加载完成: 使用WebDriverWait配合expected_conditions来确保元素加载完成后再进行抓取,而不是简单地增加固定等待时间。例如:

      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      def get_page(driver):
          wait = WebDriverWait(driver, 20)
          content = []
          for ele1 in wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'gl-item'))):
              pr = ele1.find_element(By.CLASS_NAME,'p-price').text
              na = ele1.find_element(By.CLASS_NAME,'p-name').text
              s = ele1.find_element(By.CLASS_NAME,'p-shop').text
              gid = ele1.get_attribute('data-sku')
              icon = ele1.find_element(By.CLASS_NAME,'p-icons').text
              content.append([gid,na,pr,s,icon])
          df = pd.DataFrame(data=content,columns=['id','name','price','shop','icon'])
          return df
      
    2. 处理无限滚动加载: 如果页面采用的是滚动加载更多商品的方式,您可以模拟滚动到底部以触发更多数据加载。

      driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
      time.sleep(2)  # 可能需要根据实际情况调整等待时间
      
    3. 处理Ajax请求: 检查页面是否通过Ajax加载额外数据,如果是,则需要抓取相应的Ajax请求获取数据,或者使用Selenium执行JavaScript触发Ajax加载并等待其完成。

    4. 使用浏览器无头模式: 尝试将浏览器设置为无头模式(Headless Mode),有时候网站会针对非正常用户行为做出限制,无头模式下可能更不容易被识别为爬虫。

      options = webdriver.ChromeOptions()
      options.add_argument('--headless')
      driver = webdriver.Chrome(options=options)
      
    5. 处理反爬策略: 部分网站会检测请求中的User-Agent、Cookies等信息来判断是否为爬虫,您可以尝试定期更换User-Agent,或者模拟登录用户态以获取更多数据。

    6. 分析网络请求: 使用如Chrome开发者工具查看页面加载过程中的网络请求,找到实际加载商品数据的接口,直接对该接口发起请求,绕过前端渲染问题。

    7. 尝试其他抓取技术: 如果以上方法均无法解决问题,考虑结合如Selenium与requests库搭配使用,或者使用如Scrapy框架,模拟登录后通过API接口等方式获取数据。

    请逐一排查上述方案,并依据京东网页的实际加载逻辑进行相应调整。同时,请遵守相关法律法规以及网站的Robots协议,合理合法地进行数据抓取。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月9日

悬赏问题

  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?