python异常数据处理_Python爬虫提高之异常处理

Python爬虫框架之异常处理

任何访问服务器获取数据的请求,都需要做异常处理,当然爬虫更需要我们对各种异常进行处理。只有这样才能提高爬虫的健壮性。如果我们的爬虫足够健壮,那么就能确保程序几个月不停止。

我们从以下几个方面做出讲解:

一:try except处理异常代码块

二:普通请求函数的超时处理

三:selenium+chrome | phantomjs 的超时处理

四:自定义函数的死锁or超时处理

五:自定义线程的死锁or超时处理

六:自重启的程序设计

一:基础try except异常处理

try except的语句可以让我们的程序跳过代码中可能出现的异常

try:

pass http://code.py40.com/deliver-article/#

#可能出错的语句

except Exception as e:

pass

#保留错误的url,留待下次重跑

print(e)

finally:

#无论是否处理了异常都继续运行

print(time.ctime())

1

2

3

4

5

6

7

8

9

10

try:

passhttp://code.py40.com/deliver-article/#

#可能出错的语句

exceptExceptionase:

pass

#保留错误的url,留待下次重跑

print(e)

finally:

#无论是否处理了异常都继续运行

print(time.ctime())

二:请求函数的超时处理

2.1:普通请求:

2.1.1单请求类型:

import requests

requests.get(url,timeout=60)

1

2

importrequests

requests.get(url,timeout=60)

2.1.2会话保持类型:

import requesocks

session = requesocks.session()

response = session.get(URL,headers=headers,timeout=10)

1

2

3

importrequesocks

session=requesocks.session()

response=session.get(URL,headers=headers,timeout=10)

三:selenium+chrome | phantomjs 的超时处理

2.2.1:selenium+chrome的超时设置

官网原文:http://selenium-python.readthedocs.io/waits.html

显式等待:、等待某个条件发生,然后再继续进行代码。

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()

driver.get("http://somedomain/url_that_delays_loading")

try:

element = WebDriverWait(driver, 10).until( #这里修改时间

EC.presence_of_element_located((By.ID, "myDynamicElement"))

)

finally:

driver.quit()

1

2

3

4

5

6

7

8

9

10

11

12

13

fromseleniumimportwebdriver

fromselenium.webdriver.common.byimportBy

fromselenium.webdriver.support.uiimportWebDriverWait

fromselenium.webdriver.supportimportexpected_conditionsasEC

driver=webdriver.Firefox()

driver.get("http://somedomain/url_that_delays_loading")

try:

element=WebDriverWait(driver,10).until(#这里修改时间

EC.presence_of_element_located((By.ID,"myDynamicElement"))

)

finally:

driver.quit()

隐式等待:是告诉WebDriver在尝试查找一个或多个元素(如果它们不是立即可用的)时轮询DOM一定时间。默认设置为0,一旦设置,将为WebDriver对象实例的生命期设置隐式等待。

from selenium import webdriver

driver = webdriver.Firefox()

driver.implicitly_wait(10) # seconds

driver.get("http://somedomain/url_that_delays_loading")

myDynamicElement = driver.find_element_by_id("myDynamicElement")

1

2

3

4

5

6

fromseleniumimportwebdriver

driver=webdriver.Firefox()

driver.implicitly_wait(10)# seconds

driver.get("http://somedomain/url_that_delays_loading")

myDynamicElement=driver.find_element_by_id("myDynamicElement")

2.2.2:phantomjs的超时设置

这里使用不带selenium的phantomjs,需要使用js。主要设置语句是

#JavaScript

page.settings.resourceTimeout = 5000; // 等待5秒

var system = require('system');

var args = system.args;

var url = args[1];

var page = require('webpage').create();

page.settings.resourceTimeout = 5000; // 等待5秒

page.onResourceTimeout = function(e) {

console.log(e.errorCode);   //打印错误码

console.log(e.errorString);//打印错误语句

console.log(e.url);     //打印错误url

phantom.exit(1);

};

page.open(url, function(status) {

if(status==='success'){

var html=page.evaluate(function(){

returndocument.documentElement.outerHTML;

});

console.log(html);

}

phantom.exit();

});

//$phantomjs xx.js http://bbs.pcbaby.com.cn/topic-2149414.html

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#JavaScript

page.settings.resourceTimeout=5000;//等待5秒

varsystem=require('system');

varargs=system.args;

varurl=args[1];

varpage=require('webpage').create();

page.settings.resourceTimeout=5000;//等待5秒

page.onResourceTimeout=function(e){

console.log(e.errorCode);  //打印错误码

console.log(e.errorString);//打印错误语句

console.log(e.url);    //打印错误url

phantom.exit(1);

};

page.open(url,function(status){

if(status==='success'){

varhtml=page.evaluate(function(){

returndocument.documentElement.outerHTML;

});

console.log(html);

}

phantom.exit();

});

//$phantomjsxx.jshttp://bbs.pcbaby.com.cn/topic-2149414.html

四:自定义函数的死锁or超时处理

这个非常重要!!

python是顺序执行的,但是如果下一句话可能导致死锁(比如一个while(1))那么如何强制让他超时呢?他本身如果没有带有超时设置的话,就要自己运行信号(import signal)来处理

#coding:utf-8

import time

import signal

def test(i):

time.sleep(0.999)#模拟超时的情况

print "%d within time"%(i)

return i

def fuc_time(time_out):

# 此为函数超时控制,替换下面的test函数为可能出现未知错误死锁的函数

def handler(signum, frame):

raise AssertionError

try:

signal.signal(signal.SIGALRM, handler)

signal.alarm(time_out)#time_out为超时时间

temp = test(1) #函数设置部分,如果未超时则正常返回数据,

return temp

except AssertionError:

print("%d timeout"%(i))# 超时则报错

if __name__ == '__main__':

for i in range(1,10):

fuc_time(1)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#coding:utf-8

importtime

importsignal

deftest(i):

time.sleep(0.999)#模拟超时的情况

print"%d within time"%(i)

returni

deffuc_time(time_out):

# 此为函数超时控制,替换下面的test函数为可能出现未知错误死锁的函数

defhandler(signum,frame):

raiseAssertionError

try:

signal.signal(signal.SIGALRM,handler)

signal.alarm(time_out)#time_out为超时时间

temp=test(1)#函数设置部分,如果未超时则正常返回数据,

returntemp

exceptAssertionError:

print("%d timeout"%(i))# 超时则报错

if__name__=='__main__':

foriinrange(1,10):

fuc_time(1)

五:自定义线程的死锁or超时处理

在某个程序中一方面不适合使用selenium+phantomjs的方式(要实现的功能比较难不适合)因为只能用原生的phantomjs,但是这个问题他本身在极端情况下也有可能停止(在超时设置之前因为某些错误)

那么最佳方案就是用python单独开一个线程(进程)调用原生phantomjs,然后对这个线程进程进行超时控制。

这里用ping这个命令先做测试,

import subprocess

from threading import Timer

import time

kill = lambda process: process.kill()

cmd = ["ping", "www.google.com"]

ping = subprocess.Popen(

cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

my_timer = Timer(5, kill, [ping])#这里设定时间,和命令

try:

my_timer.start()#启用

stdout, stderr = ping.communicate()#获得输出

#print stderr

print(time.ctime())

finally:

print(time.ctime())

my_timer.cancel()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

importsubprocess

fromthreadingimportTimer

importtime

kill=lambdaprocess:process.kill()

cmd=["ping","www.google.com"]

ping=subprocess.Popen(

cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)

my_timer=Timer(5,kill,[ping])#这里设定时间,和命令

try:

my_timer.start()#启用

stdout,stderr=ping.communicate()#获得输出

#print stderr

print(time.ctime())

finally:

print(time.ctime())

my_timer.cancel()

六:程序自动重启

比如我们的程序在某种情况下报错多次,那么当满足条件后,让其重启即可解决大多数问题,当然这只不过是治标不治本而已,如果这个程序重启没有大问题(例如读队列类型)那么自重启这是最省力的方式之一。

import time

import sys

import os

def restart_program():

python = sys.executable

os.execl(python, python, * sys.argv)

if __name__ == "__main__":

print 'start...'

print u"3秒后,程序将结束...".encode("utf8")

time.sleep(3)

restart_program()

1

2

3

4

5

6

7

8

9

10

11

12

importtime

importsys

importos

defrestart_program():

python=sys.executable

os.execl(python,python,*sys.argv)

if__name__=="__main__":

print'start...'

printu"3秒后,程序将结束...".encode("utf8")

time.sleep(3)

restart_program()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BERT部署加速622%,YOLOv7部署加速590%,这款开源压缩神器火了!

导读 众所周知,计算机视觉技术(CV)是企业人工智能应用比重最高的领域之一。为降低企业成本,工程师们一直在探索各类模型压缩技术,来产出“更准、更小、更快”的AI模型部署落地。而在自然语言处理领域(NLP&…

程序员面试金典 - 面试题 10.10. 数字流的秩(map/树状数组)

文章目录1. 题目2. 解题2.1 map2.2 树状数组1. 题目 假设你正在读取一串整数。每隔一段时间,你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构和算法来支持这些操作,也就是说: 实现 track(int x) 方法,每读入…

python常用函数的用法_python中常用函数整理

1、map map是python内置的高阶函数,它接收一个函数和一个列表,函数依次作用在列表的每个元素上,返回一个可迭代map对象。 class map(object):""" map(func, *iterables) --> map objectMake an iterator that computes the…

.NET中得到计算机硬件信息

VB.NET中得到计算机硬件信息 本文汇集了在.net中得到计算机硬件信息的一些功能。 得到显示器分辨率 Dim X As Short System.http://dev.21tx.com/os/windows/" target"_blank">Windows.Forms.Screen.PrimaryScreen.Bounds.Width Dim Y As Short System.…

diffusion新高度!可一次性生成200张图??

文 | Pine 明敏(凹非寺)源 | 量子位给AI一个提示词,一次性出200张图!生成速度嗖嗖的,不到3分钟全搞定。喜欢哪张任君挑选,还能直接二次调整编辑。咱就是说,这回用AI画画,终于不废人了…

转正

三个月的时间悄悄的溜走这也是我走出学校之前与社会的一段磨合期感觉自己是幸运的因为在我身边总是可以遇到很多很好的朋友一起陪伴着走过风风雨雨或许生活是残酷的或许我们总是会遇到这样那样不如意的事情但是只要我们勇敢的去面对雨后的天空总会有绚丽的彩虹不要埋怨命运因为…

程序员面试金典 - 面试题 17.09. 第 k 个数(set优先队列/DP)

1. 题目 有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。 注意,不是必须有这些素因子,而是必须不包含其他的素因子。 例如,前几个数按顺序应该是 1,3,5,7&…

python怎么封装供java调用_python调用第三方java包实例

先看结果:对于python与java的互调,我一开始是用的py4j,但是后来发现在使用方法的时候,不知道如何在python中导入jar包,然后网上的资料也比较少。后来想不出来办法,又看到有Jpype这个东东。博友们说Jpype的安装比较不好…

推特大裁员后,马斯克与白宫发生冲突!META 大批裁员正在路上

文 | 天于刀刀他来了他来了!他带着他的裁员方案走来了!带着他的水槽 sink in 的第一天,全球打工人的目光不由自主地聚焦于这个神奇的男人身上:paypal 帮派元老,特斯拉 starlink 创始人,埃隆火星人马斯克&am…

*如何循序渐进向DotNet架构师发展(转)

微软的DotNet开发绝对是属于那种入门容易提高难的技术。而要能够成为DotNet架构师没有三年或更长时间的编码积累基本上是不可能的。特别是在大型软件项目中,架构师是项目核心成员,承上启下,因此RUP方法论也认同以架构为核心,体现4…

如何利用python整合excel_使用 Python 合并多个格式一致的 Excel 文件(推荐)

一 问题描述 最近朋友在工作中遇到这样一个问题,她每天都要处理如下一批 Excel 表格:每个表格的都只有一个 sheet,表格的前两行为表格标题及表头,表格的最后一行是相关人员签字。最终目标是将每个表格的内容合并到一个 Excel 表格…

程序员面试金典 - 面试题 17.07. 婴儿名字(并查集)

1. 题目 每年,政府都会公布一万个最常见的婴儿名字和它们出现的频率,也就是同名婴儿的数量。 有些名字有多种拼法,例如,John 和 Jon 本质上是相同的名字,但被当成了两个名字公布出来。 给定两个列表,一个…

神经网络的简单偏好

文 | 许志钦知乎(已授权)源 | 天天机器学习作者注记我是2017年11月开始接触深度学习,至今刚好五年。2019年10月入职上海交大,至今三年,刚好第一阶段考核。2022年8月19号,我在第一届中国机器学习与科学应用大…

电影的音乐

Yann Tiersen,法国代表作:《天使爱美丽》《再见,列宁》 对于大家来说,一提到扬蒂尔森(Yann Tiersen)想到的便是《天使爱美丽》。的确《天使爱美丽》使这位法国音乐人一夜成为世界注目的艺术家。在我看来《天使爱美丽》的导演让皮埃尔热内(Jea…

python 列表写入csv_Python将字典数据写入CSV文件

# -*- coding: utf-8 -*- import os import time import csv class WriteCSV(): """定义成员变量""" def __init__(self): pass def init(self, info_list, info_dict_list): self.info_list info_list self.info_dict_list info_dict_list de…

数据结构--并查集(Disjoint-Set)

文章目录1. 并查集2. 操作2.1 初始化2.2 查询2.3 合并2.4 孤立3. 完整代码4. 相关题目5. 参考1. 并查集 并查集是一种树型的数据结构用于处理一些不相交集合(Disjoint Sets)的合并及查询问题 2. 操作 2.1 初始化 把每个点所在集合初始化为其自身&…

推特裁员大反转!马斯克哭求被裁员工回来

编 | Aeneas 好困源 | 新智元马斯克裁完一半员工后,发现推特运转不了了,现在正哭求一些人回来,堪称爽文情节了。打脸大戏来了!马斯克在上周五「灭掉」一半员工后,就后悔了。现在公司正在紧急联系数十名被裁的员工&…

Visual Studio 2008 Shell(翻译)

如果你现在在创建软件开发工具,你现在可以选择基于Visual Studio 2008 Shell。一个流行的Visual Studio 开发环境,Visual Studio Shell提供了一些核心功能,使你能够创建独一无二的应用程序,弹性的自定义能力帮助你推出更加特别的产…

word删除分节符后之前的格式乱了_办公室高级技能之Word邮件合并拆分

当我们需要批量生成名片,合同,成绩单等有相同内容的文件时,使用word邮件合并功能非常方便。如果你还需要把word文件发给不同的人就需要再拆分一下,用复制粘贴的方法拆分word,数量一多不仅效率低,还会因为文…

程序员面试金典 - 面试题 16.24. 数对和(双指针/哈希map)

文章目录1. 题目2. 解题2.1 排序双指针2.2 哈希map1. 题目 设计一个算法,找出数组中两数之和为指定值的所有整数对。一个数只能属于一个数对。 示例 1: 输入: nums [5,6,5], target 11 输出: [[5,6]]示例 2: 输入: nums [5,6,5,6], target 11 输出: [[5,6],[5…