Python WebCrawler,只有少数商品有折扣价格-指数错误

Python WebCrawler,只有少数商品有折扣价格-指数错误,python,web-crawler,index-error,Python,Web Crawler,Index Error,我是编程新手,正在尝试用python构建我的第一个小网络爬虫 目标:抓取产品列表页面-抓取品牌名称、文章名称、原价和新价格-保存在CSV文件中 状态:我已成功获取了品牌名称、商品名称以及原价,并将它们按正确顺序放入列表(例如10种产品)。由于所有项目都有品牌名称、说明和价格,因此我的代码将它们按正确的顺序输入csv 代码: import bs4 from urllib.request import urlopen as uReq from bs4 import Beau

我是编程新手,正在尝试用python构建我的第一个小网络爬虫

目标:抓取产品列表页面-抓取品牌名称、文章名称、原价和新价格-保存在CSV文件中

状态:我已成功获取了品牌名称、商品名称以及原价,并将它们按正确顺序放入列表(例如10种产品)。由于所有项目都有品牌名称、说明和价格,因此我的代码将它们按正确的顺序输入csv

代码:

    import bs4 
    from urllib.request import urlopen as uReq
    from bs4 import BeautifulSoup as soup

    myUrl = 'https://www.zalando.de/rucksaecke-herren/'

    #open connection, grabbing page, saving in page_html and closing connection 
    uClient = uReq(myUrl)
    page_html = uClient.read()
    uClient.close()

    #Datatype, html paser
    page_soup = soup(page_html, "html.parser")

    #grabbing information
    brand_Names = page_soup.findAll("div",{"class": "z-nvg-cognac_brandName-2XZRz z-nvg-cognac_textFormat-16QFn"})
    articale_Names = page_soup.findAll ("div",{"class": "z-nvg-cognac_articleName--arFp z-nvg-cognac_textFormat-16QFn"})
    original_Prices = page_soup.findAll("div",{"class": "z-nvg-cognac_originalPrice-2Oy4G"})
    new_Prices = page_soup.findAll("div",{"class": "z-nvg-cognac_promotionalPrice-3GRE7"})

    #opening a csv file and printing its header
    filename = "XXX.csv"
    file = open(filename, "w")
    headers = "BRAND, ARTICALE NAME, OLD PRICE, NEW PRICE\n"
    file.write(headers)

    #How many brands on page?
    products_on_page = len(brand_Names)

    #Looping through all brands, atricles, prices and writing the text into the CSV 
    for i in range(products_on_page): 
            brand = brand_Names[i].text
            articale_Name = articale_Names[i].text
            price = original_Prices[i].text
            new_Price = new_Prices[i].text
            file.write(brand + "," + articale_Name + "," + price.replace(",",".") + new_Price.replace(",",".") +"\n")

    #closing CSV
    file.close()
问题:我正在努力将折扣价格输入到正确的csv中。并非所有商品都有折扣,我目前看到我的代码有两个问题:

  • 我使用.findAll在网站上查找信息-由于折扣产品少于总产品,我的新价格包含的价格更少(例如10种产品的3个价格)。如果我能够将它们添加到列表中,我假设它们将显示在前3行中。我如何确保将新的价格添加到正确的产品削减中

  • 我得到了“索引错误:列表索引超出范围”错误,我认为这是由于我循环浏览10个产品造成的,但是对于新的价格,我比我的其他列表更快到达终点?这有意义吗?我的假设正确吗

  • 我非常感谢任何帮助

    谢谢,


    Thorsten

    由于某些商品没有
    'div.z-nvg-cognac_促销价格-3GRE7'
    标签,因此无法可靠地使用列表索引。
    但是,您可以选择所有容器标签(
    'div.z-nvg-cognac_infoContainer-MvytX'
    )并使用
    find
    选择每个项目上的标签

    from urllib.request import urlopen
    from bs4 import BeautifulSoup as soup
    import csv
    
    my_url = 'https://www.zalando.de/sporttaschen-reisetaschen-herren/'
    client = urlopen(my_url)
    page_html = client.read().decode(errors='ignore')
    page_soup = soup(page_html, "html.parser")
    
    headers = ["BRAND", "ARTICALE NAME", "OLD PRICE", "NEW PRICE"]
    filename = "test.csv"
    with open(filename, 'w', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(headers)
    
        items = page_soup.find_all(class_='z-nvg-cognac_infoContainer-MvytX')
        for item in items:
            brand_names = item.find(class_="z-nvg-cognac_brandName-2XZRz z-nvg-cognac_textFormat-16QFn").text
            articale_names = item.find(class_="z-nvg-cognac_articleName--arFp z-nvg-cognac_textFormat-16QFn").text
            original_prices = item.find(class_="z-nvg-cognac_originalPrice-2Oy4G").text
            new_prices = item.find(class_="z-nvg-cognac_promotionalPrice-3GRE7")
            if new_prices is not None: 
                new_prices = new_prices.text 
            writer.writerow([brand_names, articale_names, original_prices, new_prices])
    

    如果您希望每页获取超过24个项目,则必须使用运行js的客户端,如

    脚注:
    函数和变量的大小写为带下划线的小写。
    读取或写入csv文件时,最好使用库。

    处理文件时,您可以使用该语句。

    请不要发布代码截图,将相关代码复制到代码块中。发布输入示例too@bgse更新代码为blocks@Guilherme我不知道我是否明白,你能详细说明一下吗?你说输入是什么意思example@ThorsteinTorento我相信Guilherme是在要求您发布一个指向该网站的链接。这将有助于我们了解您的代码中哪些地方不起作用。hi@t.m.adam,非常感谢您的反馈和建议!我自己终于到了,但是你的代码看起来整洁多了!我注意到的一点是,页面一定已经改变了,因为页面上现在有超过24个项目。奇怪的是,当运行爬虫程序时,它只拾取24个项目。知道为什么吗?是的,其余的项目都是由js加载的。如果您在浏览器中禁用js并访问该页面,则可以对此进行测试。您可以使用
    selenium
    或有时通过ajaxapi获取所有项目。有空的时候我会发一个例子。你好@t.m.adam,太好了!谢谢出于兴趣,为什么页面会这样设置(加载这24个项目,然后通过JS加载其余项目)?谢谢,我不知道,我第一次看到这样的东西。对于同一组中的所有项目,它应该是静态html或js。不管怎么说,你用硒取得了效果吗?嗨@t.m.adam有趣!:)我会在下班后试一试——只是在午餐休息时看了一眼!我会随时通知你的
    from selenium import webdriver
    from bs4 import BeautifulSoup as soup
    import csv
    
    my_url = 'https://www.zalando.de/sporttaschen-reisetaschen-herren/'
    driver = webdriver.Firefox()
    driver.get(my_url)
    page_html = driver.page_source
    driver.quit()
    page_soup = soup(page_html, "html.parser")
    ...