通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python爬虫如何处理404页面

python爬虫如何处理404页面

Python爬虫处理404页面的方法包括:检查HTTP状态码、设置错误处理机制、使用重试机制、记录日志。

处理404页面最直接的方法是检查HTTP响应的状态码,当状态码为404时,执行相应的错误处理逻辑。可以通过requests库中的response.status_code属性来获取HTTP状态码,并根据状态码进行判断和处理。例如,可以跳过404页面、记录日志或重试请求。

一、检查HTTP状态码

当使用Python进行网络请求时,可以通过检查HTTP响应的状态码来判断页面是否存在。通常,状态码200表示请求成功,而状态码404表示页面不存在。

1、使用requests库

requests是Python中一个非常流行的HTTP请求库,使用它可以很方便地发送HTTP请求并处理响应。以下是一个基本示例:

import requests

url = 'http://example.com/somepage'

response = requests.get(url)

if response.status_code == 404:

print('Page not found!')

else:

print('Page found, processing...')

在这个示例中,我们发送了一个GET请求并检查了响应的状态码。如果状态码为404,则输出“Page not found!”;否则,继续处理页面内容。

2、使用urllib库

urllib是Python内置的HTTP请求库,同样可以用来检查HTTP状态码。以下是一个示例:

from urllib import request, error

url = 'http://example.com/somepage'

try:

response = request.urlopen(url)

if response.getcode() == 404:

print('Page not found!')

else:

print('Page found, processing...')

except error.HTTPError as e:

if e.code == 404:

print('Page not found!')

else:

print('HTTP error occurred:', e)

二、设置错误处理机制

在爬虫程序中,可能会遇到各种不同的HTTP错误。为了提高爬虫的健壮性,可以设置错误处理机制来处理这些错误,包括404错误。

1、使用try-except块

在请求过程中,可以使用try-except块来捕获并处理HTTP错误:

import requests

url = 'http://example.com/somepage'

try:

response = requests.get(url)

response.raise_for_status() # 如果响应状态码不是200,抛出HTTPError

print('Page found, processing...')

except requests.exceptions.HTTPError as err:

if err.response.status_code == 404:

print('Page not found!')

else:

print('HTTP error occurred:', err)

在这个示例中,raise_for_status()方法会在响应状态码不是200时抛出HTTPError异常。我们在except块中捕获该异常并检查状态码是否为404。

2、设置超时和重试

为了提高爬虫的可靠性,可以设置请求超时和重试机制。以下是一个示例:

import requests

from requests.adapters import HTTPAdapter

from requests.packages.urllib3.util.retry import Retry

url = 'http://example.com/somepage'

设置重试策略

retry_strategy = Retry(

total=3,

status_forcelist=[404, 500, 502, 503, 504],

method_whitelist=["HEAD", "GET", "OPTIONS"]

)

adapter = HTTPAdapter(max_retries=retry_strategy)

http = requests.Session()

http.mount("http://", adapter)

http.mount("https://", adapter)

try:

response = http.get(url, timeout=5)

response.raise_for_status()

print('Page found, processing...')

except requests.exceptions.HTTPError as err:

if err.response.status_code == 404:

print('Page not found!')

else:

print('HTTP error occurred:', err)

except requests.exceptions.RequestException as err:

print('Request error occurred:', err)

在这个示例中,我们设置了一个重试策略,针对404、500、502、503和504状态码进行重试,并在请求超时时抛出异常。

三、记录日志

在爬虫程序中记录日志是非常重要的,尤其是在处理错误时。通过记录日志,可以方便地排查问题和优化爬虫。

1、使用logging库

logging是Python内置的日志记录库,可以用来记录各种级别的日志信息。以下是一个示例:

import requests

import logging

logging.basicConfig(filename='crawler.log', level=logging.INFO)

url = 'http://example.com/somepage'

try:

response = requests.get(url)

response.raise_for_status()

logging.info('Page found: %s', url)

except requests.exceptions.HTTPError as err:

if err.response.status_code == 404:

logging.error('Page not found: %s', url)

else:

logging.error('HTTP error occurred: %s', err)

except requests.exceptions.RequestException as err:

logging.error('Request error occurred: %s', err)

在这个示例中,我们将日志记录到crawler.log文件中,并记录了不同类型的日志信息。

2、记录详细信息

为了更好地分析问题,可以记录更多的详细信息,例如请求头、响应头和请求参数。以下是一个示例:

import requests

import logging

logging.basicConfig(filename='crawler.log', level=logging.INFO)

url = 'http://example.com/somepage'

headers = {'User-Agent': 'my-crawler'}

params = {'q': 'search term'}

try:

response = requests.get(url, headers=headers, params=params)

response.raise_for_status()

logging.info('Page found: %s', url)

logging.info('Response headers: %s', response.headers)

except requests.exceptions.HTTPError as err:

if err.response.status_code == 404:

logging.error('Page not found: %s', url)

else:

logging.error('HTTP error occurred: %s', err)

logging.error('Request headers: %s', headers)

logging.error('Request params: %s', params)

except requests.exceptions.RequestException as err:

logging.error('Request error occurred: %s', err)

logging.error('Request headers: %s', headers)

logging.error('Request params: %s', params)

在这个示例中,我们记录了请求头、响应头和请求参数等详细信息,以便更好地分析问题。

四、使用重试机制

在处理404页面时,可以使用重试机制来提高爬虫的健壮性。通过设置重试策略,可以在请求失败时自动重试,从而提高爬虫的成功率。

1、使用requests库的重试机制

requests库中没有直接提供重试机制,但可以使用requests库的HTTPAdapterRetry类来实现重试机制。以下是一个示例:

import requests

from requests.adapters import HTTPAdapter

from requests.packages.urllib3.util.retry import Retry

url = 'http://example.com/somepage'

设置重试策略

retry_strategy = Retry(

total=3,

status_forcelist=[404, 500, 502, 503, 504],

method_whitelist=["HEAD", "GET", "OPTIONS"]

)

adapter = HTTPAdapter(max_retries=retry_strategy)

http = requests.Session()

http.mount("http://", adapter)

http.mount("https://", adapter)

try:

response = http.get(url, timeout=5)

response.raise_for_status()

print('Page found, processing...')

except requests.exceptions.HTTPError as err:

if err.response.status_code == 404:

print('Page not found!')

else:

print('HTTP error occurred:', err)

except requests.exceptions.RequestException as err:

print('Request error occurred:', err)

在这个示例中,我们设置了一个重试策略,针对404、500、502、503和504状态码进行重试,并在请求超时时抛出异常。

2、使用tenacity库

tenacity是一个非常强大的重试库,可以用来实现更加灵活的重试机制。以下是一个示例:

import requests

from tenacity import retry, stop_after_attempt, wait_fixed

url = 'http://example.com/somepage'

@retry(stop=stop_after_attempt(3), wait=wait_fixed(2))

def fetch_page(url):

response = requests.get(url)

response.raise_for_status()

return response

try:

response = fetch_page(url)

print('Page found, processing...')

except requests.exceptions.HTTPError as err:

if err.response.status_code == 404:

print('Page not found!')

else:

print('HTTP error occurred:', err)

except requests.exceptions.RequestException as err:

print('Request error occurred:', err)

在这个示例中,我们使用tenacity库的retry装饰器来实现重试机制,设置了最多重试3次,每次重试间隔2秒。

五、处理404页面的其他方法

除了上述方法外,还有一些其他的方法可以用来处理404页面。

1、使用代理

在进行网络请求时,可以使用代理来避免被目标网站屏蔽。以下是一个示例:

import requests

url = 'http://example.com/somepage'

proxies = {

'http': 'http://10.10.1.10:3128',

'https': 'http://10.10.1.10:1080',

}

try:

response = requests.get(url, proxies=proxies)

response.raise_for_status()

print('Page found, processing...')

except requests.exceptions.HTTPError as err:

if err.response.status_code == 404:

print('Page not found!')

else:

print('HTTP error occurred:', err)

except requests.exceptions.RequestException as err:

print('Request error occurred:', err)

在这个示例中,我们使用了一个代理服务器来发送请求,以避免被目标网站屏蔽。

2、使用异步请求

在进行大量网络请求时,可以使用异步请求来提高爬虫的效率。以下是一个使用aiohttp库的示例:

import aiohttp

import asyncio

async def fetch_page(session, url):

async with session.get(url) as response:

if response.status == 404:

print('Page not found!')

else:

print('Page found, processing...')

return await response.text()

async def main():

url = 'http://example.com/somepage'

async with aiohttp.ClientSession() as session:

await fetch_page(session, url)

asyncio.run(main())

在这个示例中,我们使用aiohttp库来发送异步请求,并检查响应状态码是否为404。

六、总结

在本文中,我们介绍了Python爬虫处理404页面的多种方法,包括检查HTTP状态码、设置错误处理机制、使用重试机制、记录日志、使用代理和异步请求等。通过这些方法,可以提高爬虫的健壮性和成功率,从而更高效地抓取目标网站的数据。希望本文对你有所帮助,祝你在爬虫开发中取得成功!

相关问答FAQs:

如何在Python爬虫中识别404页面?
在Python爬虫中,您可以通过检查HTTP响应状态码来识别404页面。使用requests库时,可以通过response.status_code来获取状态码。如果返回的状态码是404,则表示请求的页面不存在。通过这样的方式,您可以在爬虫中进行相应的处理,例如记录日志或重试请求。

处理404页面时,有哪些常见的策略?
常见的策略包括重试机制、错误日志记录和备用链接访问。当爬虫遇到404页面时,可以设定一个重试次数,尝试再次请求其他可能的URL。同时,记录404错误的URL,以便后续分析和优化爬虫策略。此外,可以设置备用链接,若主链接不可用,自动切换到备用链接进行爬取。

如何优化爬虫以避免频繁遇到404页面?
为了优化爬虫并减少404页面的出现,建议在爬取之前进行URL有效性检查。可以使用站点地图或API获取有效链接列表,确保爬虫只访问已知可用的URL。此外,定期更新爬虫的目标URL,监控网站的内容变化,确保您爬取的页面仍然存在,从而提高爬取的成功率。

相关文章