数据抓取 --Beautiful Soup库的使用问题(4)使用 TRY EXCEPT 时的踩过的坑!

下面是try和except 的使用的基本逻辑图。(这边不多解释基础知识)

这里有个注意点: 

使用try 和 except 的里面的     ‘’‘ ’‘’  定义的列表,元组,字符串 是不共享的。 新的变量在try 和except的语句里面是并列关系的。 

 

 

 

 

举例:

最底下边是爬取一个网站商品的SKU的库存的部分代码,使用的逻辑是,

如果是多尺码,那么选择 try, 否则 except.

这里很多人估计都踩过坑,就是COLOR_XPATH列表为什么要在 try里面放完后,在except里面再搁置一个。

如果没有搁置会出现什么结果,(跳过代码往下看)

                          

 

try:
    # 多尺码,如果是多尺码,那么选择 try, 否则 except.
    pattern = re.compile('尺码')
    f = soup.find('span', text=pattern).get_text()
    type_of_size ='多尺码'
    print(type_of_size)

    # 颜色 XPATH
    COLOR_XPATH = ['//*[@name="goods_spec[颜色]"][1]/following-sibling::a[1]',
                   '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[2]',
                   '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[3]',
                   '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[4]',
                   '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[5]',
                   '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[6]',
                   '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[7]',
                   '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[8]',
                   '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[9]'
                   ]
    # 尺码 XPATH
    SIZE_XPATH = ['//*[@name="goods_spec[尺码]"][1]/following-sibling::a[1]',
                  '//*[@name="goods_spec[尺码]"][1]/following-sibling::a[2]',
                  '//*[@name="goods_spec[尺码]"][1]/following-sibling::a[3]',
                  '//*[@name="goods_spec[尺码]"][1]/following-sibling::a[4]',
                  '//*[@name="goods_spec[尺码]"][1]/following-sibling::a[5]',
                  '//*[@name="goods_spec[尺码]"][1]/following-sibling::a[6]',
                  '//*[@name="goods_spec[尺码]"][1]/following-sibling::a[7]',
                  '//*[@name="goods_spec[尺码]"][1]/following-sibling::a[8]',
                  '//*[@name="goods_spec[尺码]"][1]/following-sibling::a[9]',
                  '//*[@name="goods_spec[尺码]"][1]/following-sibling::a[10]'
                 ]

    # 判断是否是多颜色,如果是多颜色,那么选择 try, 否则 except.
    panduanyanse = soup.find_all('input',{'name':'goods_spec[颜色]'})
    try:
        # 多颜色
        panduanyanse = panduanyanse[1]
        print(panduanyanse)

        # 点击 颜色 然后 点击尺码
        # 点击颜色
        for x_path in COLOR_XPATH:
            try:
                color_click = browser.find_element_by_xpath(x_path)
                color_click.click()
                time.sleep(3)

                # 点击尺码,提取尺码和库存
                size_list = soup.find_all('input', {'name': 'goods_spec[尺码]'})
                num = 0

                for x_size in SIZE_XPATH:
                    try:
                        size_click = browser.find_element_by_xpath(x_size)
                        size_click.click()
                        size = size_list[num].get('rel')
                        num = num+1
                        print('16.尺寸:', size)

                        # 抓取库存,需要给两秒时间加载数据
                        time.sleep(2)

                        cli = browser.find_element_by_xpath('//*[@id="buy_goods_form"]/div/div[6]/ul/li[2]/div[1]/a[2]')

                        time.sleep(2)

                        m = browser.find_element_by_xpath('//*[@id="store_count"]')
                        m.click()
                        size_num = soup.find('span', store_count='store_count')
                        print('17.尺寸库存',size_num)
                    except:
                        continue

            except:
                continue


    except:
        # 单颜色
        ''

# 单尺码
except:
    # 均码
    print('均码')
    type_of_size = '均码'

    # 判断是否是多颜色,如果是多颜色,那么选择 try, 否则 except.
    panduanyanse = soup.find_all('input',{'name':'goods_spec[颜色]'})
    try:
        # 多颜色
        panduanyanse = panduanyanse[1]
        print('多颜色')


        # 点击 颜色 然后 点击尺码
        # 点击颜色
        COLOR_XPATH = ['//*[@name="goods_spec[颜色]"][1]/following-sibling::a[1]',
                       '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[2]',
                       '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[3]',
                       '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[4]',
                       '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[5]',
                       '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[6]',
                       '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[7]',
                       '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[8]',
                       '//*[@name="goods_spec[颜色]"][1]/following-sibling::a[9]'
                       ]
        for x_path in COLOR_XPATH:
            try:
                color_click = browser.find_element_by_xpath(x_path)
                color_click.click()
                time.sleep(3)

                soup = BeautifulSoup(browser.page_source, 'lxml')
                size_num = soup.find('span', id='store_count').get_text()
                print('17.尺寸库存', size_num)

            except:
                break

    except:
        print('单颜色')
        ''
        # 单颜色
        # size_num = soup.find('span', id='store_count').get_text()
        # print('17.尺寸库存:',size_num)

 

这是没有放置 COLOR_XPATH列表在except的结果。                             这是有放置 COLOR_XPATH列表在except的结果。 

                              

 

两边的区别很明显,没放置COLOR_XPATH列表在except,是抓不到尺寸库存的参数。

原因是:try 和 except 的里面的     ‘’‘ ’‘’  定义的列表,元组,字符串 是不共享的。 

建议:要么在使用 try和except 之前就已经定义好列表。要么就麻烦点两边都要放置‘’‘ ’‘’  定义的列表,元组,字符串。

 

友情提醒一下: 之前几个朋友在群里面有个疑问,就是使用 selenium和多线程 去爬取数据的使用出现CPU和内存占的太多。

最后发现是是同try和except 使用,发生类似的错误,导致浏览器没法关掉。 结果爬取了2小时候数据,电脑就崩掉了。 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值