今天是4.18号。
上周五的时候参加了中国银联的暑期实习生笔试,然后收到通知说让周天早上去上海总部面试,自己又错过了那边打过来的电话,本想问可不可以视频面试的,结果是非常遗憾的没有去参加面试。本来暑期实习就不好找,怎么说最终还是怪自己。
论文还是没有出结果,大概还要等上一个星期吧,而python爬虫的学习也还要花差不多两周的时间。
首先声明下面的报错是在使用BeautifulSoup的基础上的
**(1).list index out of range **
这种情况基本就是你获取的列表为空,所以在选取第x各元素([x])时就会报错。
(2).requests 要对返回的状态码做判断
r=requests.get(url)
if r.status_code==200:
(3).异常
异常是指程序中的例外,违例情况。异常机制是指程序出现错误后,程序的处理方法。当出现错误后,程序的执行流程发生改变,程序的控制权转移到异常处理。可能情况有,比如写入文件的时候,磁盘满了,写不进去了;从网络抓取数据,网络突然断掉了;抓取数据时ip被封等等。
其他异常如写进文件时磁盘满了等情况在后面进行文件操作时才会涉及。单单就爬虫过程来看一般是在requests()过程中出现下面几种异常情况:
一、遇到网络问题时,Requests会抛出一个 ConnectionError 异常。
(具体情况有两种:一是请求的网址错误或不存在;二是网络中断)
二、遇到无效HTTP响应时,Requests则会抛出一个 HTTPError 异常。
(具体情况有:服务器拒绝连接,即ip被封等)
一般HTTPError又分为 4XX:客户端错误 和 5XX:服务器错误。
对于前两种异常通常使用try...exception...来解决,具体如下:
try:
#这一部分写正常的运行语句
req=requests.get(url)
...
...
except (requests.ConnectionError, IndexError, UnicodeEncodeError,TimeoutError)
print(e.args)
except requests.HTTPError as f:
print('The server couldn\'t fulfill the request.')
ip被封处理办法
三、若请求超时,则抛出一个 Timeout 异常。
(具体情况有:网络断开,但经常显示无法连接;网络阻塞;网络不稳定,网络无法完整传送服务器信息;系统原因,系统资源过低,不足以)
解决办法:
Timeout又分为connect timeout和read timeout。前者指的是你发出request请求到和服务器建立连接之间的等待时间;后者是同服务器建立连接后到服务器发回response之间的等待时间。那么在请求时可以加上相应的timeout时间,形式如下:
a).r = requests.get('https://XXXX.com', timeout=5)表示默认connect timeout和read timeout的值均为5秒;
b). r = requests.get('https://XXXX.com', timeout=(3.05, 27))表示connect timeout=3.05秒,read timeout=27秒;
c).r = requests.get('https://XXXX.com', timeout=None)则表示一直等待到服务器有响应为止。
此外再了解一些新的知识
(4).range()虽然返回的是一个整数列表,但不能直接进行赋值,例如a=range(10),而应该是a=list(range(10))
(5).用关键字lambda表示匿名函数,lambda x: x*x实际上就是:
def f(x):
return x * x
冒号前面的x表示函数参数。匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果;但用匿名函数也有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数。
最后附上: