LiuMingyang_lu 2024-04-11 11:24 采纳率: 0%
浏览 16

(关键词-index)爬取淘宝商品数据这段代码有什么问题吗,怎样解决


from DrissionPage import ChromiumPage#自动化模块
#导入正则表达式
import re
#导入json模块
import json
#导入csv
import csv
#到入时间模块
import time


f = open('data.csv', mode='w', encoding='utf-8',newline='')
#写入字典
csv_writer = csv.DictWriter(f,fieldnames= [
    '标题',
    '价格',
    '地区',
    '销量',
])
#写入表头
csv_writer.writeheader()
driver = ChromiumPage()#打开浏览器
driver.get('https://s.taobao.com/search?q=')#访问网站
driver.ele('css:#q').input('办公')#商品名/类
driver.ele('css:.btn-search').click()#点击搜索drive
for page in range(100):

 time.sleep(2)#等待两秒
 driver.scroll.to_bottom()#网页到底
 resp = driver.listen.wait(2)#等待数据包加载
 text = resp.response.body#获取响应数据'
#text = 'mtopjsonp1'
# 解析数据,提取内容
 info = re.findall('mtopjsonp\d+\((.*)',text[0].replace(')',''))
#转换数据类型
 json_dara = json.loads(info)
#根据键值对取值,提取商品信息所在列表
 items = json_dara['data']['itemsArray']
#for循环,提取列表元素
 for index in items:
    #提取数据保存到字典中
     dit = {
        '名称': index['title'],
        '价格': index['priceWap'],
        '地区': index['price'],
        '销量': index['realSales'].replace('人付款','')
    }
    #写入数据
     csv_writer.writerow(dit)
  #点击下一页

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/95ecf37ae9d1425a909fcae1b53e8686.png "#left")



  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-11 11:24
    关注

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

    在您提供的代码中,存在一些错误和潜在的问题。以下是针对这些问题的详细解答及修改后的代码。

    问题1:driver.scroll.to_bottom()driver.listen.wait(2) 这两个方法在实际代码中可能不存在。DrissionPage 应该是基于 Selenium 的一个封装库,但这里的方法调用不符合 Selenium 的标准 API。为了实现滚动到页面底部和等待数据加载,我们可以使用 Selenium 的标准方法。

    修复方案:

    from selenium.webdriver.common.action_chains import ActionChains
    

    替换:

    time.sleep(2) # 等待两秒
    driver.scroll.to_bottom() # 网页到底
    driver.listen.wait(2) # 等待数据包加载
    

    为:

    time.sleep(2) # 等待两秒
    actions = ActionChains(driver)
    actions.send_keys(Keys.PAGE_DOWN).perform() # 滚动到页面底部
    time.sleep(2) # 增加额外的延迟,确保数据加载完成
    

    问题2:在解析 JSON 数据时,使用了正则表达式 re.findall 来匹配字符串,但是文本开始时可能没有 'mtopjsonp',这会导致找不到匹配项。另外,text[0] 只会获取第一个字符,应该改为 text

    修复方案:

    info = re.findall(r'mtopjsonp\d+\((.*?)\)', text.replace(')', '')) # 更改正则表达式并处理整个文本
    

    问题3:在提取数据时,键值 'price' 在 JSON 中可能不存在,应更改为 'rawPrice'。

    修复方案:

    'district': index['rawPrice'] # 替换为 rawPrice 键
    

    问题4:由于网络延迟或服务器响应问题,一次性遍历100页可能会导致部分页面的数据抓取失败。可以尝试使用 try-except 结构处理可能出现的异常。

    修复方案:

    for page in range(100):
        try:
            ...
        except Exception as e:
            print(f"在第 {page} 页发生错误: {e}")
    

    下面是修复上述问题后完整的代码:

    from selenium.webdriver.common.action_chains import ActionChains
    from DrissionPage import ChromiumPage
    import re
    import json
    import csv
    import time
    
    f = open('data.csv', mode='w', encoding='utf-8', newline='')
    csv_writer = csv.DictWriter(f, fieldnames=[
        '标题',
        '价格',
        '地区',
        '销量',
    ])
    csv_writer.writeheader()
    
    driver = ChromiumPage()  # 打开浏览器
    driver.get('https://s.taobao.com/search?q=')  # 访问网站
    driver.ele('css:#q').input('办公')  # 商品名/类
    driver.ele('css:.btn-search').click()  # 点击搜索
    
    for page in range(100):
        try:
            time.sleep(2)  # 等待两秒
            actions = ActionChains(driver)
            actions.send_keys(Keys.PAGE_DOWN).perform()  # 滚动到页面底部
            time.sleep(2)  # 增加额外的延迟,确保数据加载完成
    
            # 获取响应数据
            resp = driver.execute_script("return document.documentElement.outerHTML")
            # 解析数据,提取内容
            info = re.findall(r'mtopjsonp\d+\((.*?)\)', resp.replace(')', ''))
            # 转换数据类型
            json_data = json.loads(info[0])
    
            # 根据键值对取值,提取商品信息所在列表
            items = json_data['data']['itemsArray']
    
            for index in items:
                # 提取数据保存到字典中
                dit = {
                    '名称': index['title'],
                    '价格': index['priceWap'],
                    '地区': index['rawPrice'],  # 使用 rawPrice 键
                    '销量': index['realSales'].replace('人付款', '')
                }
                # 写入数据
                csv_writer.writerow(dit)
    
        except Exception as e:
            print(f"在第 {page} 页发生错误: {e}")
    
    driver.quit()  # 关闭浏览器
    f.close()  # 关闭文件
    

    注意:这个代码示例假设 ChromiumPage 是一个有效的 Selenium 驱动封装,并且已经正确安装了相关依赖。如果没有安装,你需要先安装 DrissionPage(如果是基于 Selenium 的工具包)以及 Selenium。同时,因为淘宝的反爬虫策略,这种方法可能不总是有效,你可能需要添加更多的异常处理和随机延时等措施来提高成功率。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月11日

悬赏问题

  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件