python报错解决锦集

168 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

今天分享一些python中常见的报错及解决方法

1.报错:TypeError: string indices must be integers, not ‘str‘

今天对抓取的数据处理的时候遇到报错:TypeError: string indices must be integers, not 'str'

字面的意思是索引值应该是整型而不是str类型,回到代码中打印获取的数据类型发现是str类型,但是数据看上去是字典类型的,报错如图所示:

1670050054065.png

那么处理起来就很简单了,只要使用json中的json.loads将str类型的数据转化成dict类型的就可以了。json中的loads和dumps方法详细的使用与区别在之前的文章中有提到,可以去看看

2.报错:在python连接数据库时报错pymysql.err.programmingError

去网上看了很多种解决的方法,都试了一遍发现问题还是没有解决,后来一行一行的排查,还是没发现问题所在,尝试将xpath复制到网页中查看是否获取到结果时终于发现问题所在,原来是复制xpath的语法错误问题,自己手动修改了xpath语法就没有报错了。我看了其他博主将单引号改成三双引号也解决了问题,大家也可以试一下,如果没有用的话可以试着修改xpath语法。

3.报错:# urllib3.exceptions.MaxRetryError

今天使用requests异步加载抓取数据的时候报错:

urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=6723): Max retries exceeded with url: /wd/hub/session (Caused by NewConnectionError ('<urllib3.connection.HTTPConnection object at 0x0000000003517D68>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。',))

遇到这个问题的有三种情况:

  1. IP被封:短时间内同一个ip发出大量的请求,就会被网站检测到。

    解决方法:添加代理ip

2.请求头过时:重新构建请求头包括User-Agent、cookie等内容

3.计算机没有联网:计算机没有网络或者网络错误时也会显示报错,今天我报错的原因就是抓取的外网数据没有开VPN,而且cookie值也过期了

4.报错:# TypeError: write() argument must be str, not list

今天写爬虫的时候遇到的问题:

将抓取的数据保存下来的时候报错:TypeError: write() argument must be str, not list。字面意思是write写入的应该是str类型的数据,而不是一个list类型的数据,回到代码中:

                try:
                    title1 = title1_list[i].replace("】","")
                    title2 = title2_list[i].replace("\n","")
                    name1 = title1 + title2
                    product_dict = {
                        "product_name": name1,
                        "product_id": product_id_list[i]
                    }
                    product_list.append(product_dict)
                except:
                    pass
                print("保存的数据为:",product_list)
            product_list = json.dumps(product_list,ensure_ascii=False,indent=2)
            return pages,product_list

检查发现保存前已经使用dumps转化格式了,那为什么还是会显示保存的是列表呢,保存之前的数据打印一下保存的数据看一下发现了原因,获取到的数据为空,所以才没有保存数据。找到问题所在解决起来就很轻松了,只要加入一个判断的条件,判断抓取的数据是否为空就可以了,代码如下:

        data = self.product_html
        # print(data)
        data = etree.HTML(data)
        #商品数量
        try:
            product_num = data.xpath('//*[@id="content"]/div[1]/div/div[1]/p/em/text()')[0]
        except:
            # 出现滑块,需要拖动滑块
            drop_block = DropBlock()
            drop_block.drop_block(url)
            product_num = data.xpath('//*[@id="content"]/div[1]/div/div[1]/p/em/text()')[0]
        if int(product_num) == 0:
            pages = 0
            list1 = {
                "product_name": "Null",
                "product_id": "Null"
            }
            list1 = json.dumps(list1,ensure_ascii=False,indent=2)
            return pages,list1

首先获取到商品详情页的数据是否为0,这是唯一可以辨别商品数据为空的数据,因为空数据的页数也会显示为1,所以这里采用商品数量作为判断商品数量是否为空的依据,所以现在只需要在保存数据前加入判断的条件就可以了。将空的列表替换成指定的数据,这样就不会造成空列表保存不了的情况了,最后记得返回空的数据之前也要使用dumps转化