开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
今天分享一些python中常见的报错及解决方法
1.报错:TypeError: string indices must be integers, not ‘str‘
今天对抓取的数据处理的时候遇到报错:TypeError: string indices must be integers, not 'str'
字面的意思是索引值应该是整型而不是str类型,回到代码中打印获取的数据类型发现是str类型,但是数据看上去是字典类型的,报错如图所示:
那么处理起来就很简单了,只要使用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] 由于目标计算机积极拒绝,无法连接。',))
遇到这个问题的有三种情况:
-
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转化