温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python爬虫实战之抓取异常的处理方法

发布时间:2020-11-30 10:09:55 来源:亿速云 阅读:242 作者:小新 栏目:编程语言

这篇文章给大家分享的是有关python爬虫实战之抓取异常的处理方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

可能在抓取的时候,某个账号突然就被封了,或者由于网络原因,某次请求失败了,该如何处理?对于前者,我们需要判断每次请求返回的内容是否符合预期,也就是看response url是否正常,看response content是否是404或者让你验证手机号等,对于后者,我们可以做一个简单的重试策略。处理这两种情况的代码如下

@timeout_decorator def get_page(url, user_verify=True, need_login=True):     """     :param url: 待抓取url     :param user_verify: 是否为可能出现验证码的页面(ajax连接不会出现验证码,如果是请求微博或者用户信息可能出现验证码),否为抓取转发的ajax连接     :param need_login: 抓取页面是否需要登录,这样做可以减小一些账号的压力     :return: 返回请求的数据,如果出现404或者403,或者是别的异常,都返回空字符串     """     crawler.info('本次抓取的url为{url}'.format(url=url))     count = 0       while count < max_retries:           if need_login:             # 每次重试的时候都换cookies,并且和上次不同,如果只有一个账号,那么就允许相同             name_cookies = Cookies.fetch_cookies()                          if name_cookies is None:                 crawler.warning('cookie池中不存在cookie,正在检查是否有可用账号')                 rs = get_login_info()                   # 选择状态正常的账号进行登录,账号都不可用就停掉celery worker                 if len(rs) == 0:                     crawler.error('账号均不可用,请检查账号健康状况')                     # 杀死所有关于celery的进程                     if 'win32' in sys.platform:                         os.popen('taskkill /F /IM "celery*"')                     else:                         os.popen('pkill -f "celery"')                 else:                     crawler.info('重新获取cookie中...')                     login.excute_login_task()                     time.sleep(10)           try:             if need_login:                 resp = requests.get(url, headers=headers, cookies=name_cookies[1], timeout=time_out, verify=False)                   if "$CONFIG['islogin'] = '0'" in resp.text:                     crawler.warning('账号{}出现异常'.format(name_cookies[0]))                     freeze_account(name_cookies[0], 0)                     Cookies.delete_cookies(name_cookies[0])                     continue             else:                 resp = requests.get(url, headers=headers, timeout=time_out, verify=False)               page = resp.text             if page:                 page = page.encode('utf-8', 'ignore').decode('utf-8')             else:                 continue               # 每次抓取过后程序sleep的时间,降低封号危险             time.sleep(interal)               if user_verify:                 if 'unfreeze' in resp.url or 'accessdeny' in resp.url or 'userblock' in resp.url or is_403(page):                     crawler.warning('账号{}已经被冻结'.format(name_cookies[0]))                     freeze_account(name_cookies[0], 0)                     Cookies.delete_cookies(name_cookies[0])                     count += 1                     continue                   if 'verifybmobile' in resp.url:                     crawler.warning('账号{}功能被锁定,需要手机解锁'.format(name_cookies[0]))                              freeze_account(name_cookies[0], -1)                     Cookies.delete_cookies(name_cookies[0])                     continue                   if not is_complete(page):                     count += 1                     continue                   if is_404(page):                     crawler.warning('url为{url}的连接不存在'.format(url=url))                     return ''           except (requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError, AttributeError) as e:             crawler.warning('抓取{}出现异常,具体信息是{}'.format(url, e))             count += 1             time.sleep(excp_interal)           else:             Urls.store_crawl_url(url, 1)             return page       crawler.warning('抓取{}已达到最大重试次数,请在redis的失败队列中查看该url并检查原因'.format(url))     Urls.store_crawl_url(url, 0) return ''

这里大家把上述代码当一段伪代码读就行了,主要看看如何处理抓取时候的异常。因为如果贴整个用户抓取的代码,不是很现实,代码量有点大。

感谢各位的阅读!关于python爬虫实战之抓取异常的处理方法就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI