我正在尝试从 danbooru 抓取图像,但使用 BeautifulSoup 时出现 SSLEOFError 违反协议 1002 错误

问题描述 投票:0回答:1

我正在尝试为 danbooru 图像制作图像抓取器,我使用网络驱动程序“selenium”制作了一个版本,它工作正常,但对于大型数据集,需要花费很多时间。

因此我想使用 bs4 'BeautifulSoup,但我在第二个版本中收到此错误:

处理 get_images_srcs 时出错:HTTPSConnectionPool(host='danbooru.donmai.us', port=443): url 超出最大重试次数:/posts/'my url' (由 SSLError(SSLEOFError(8, 'EOF 发生违反协议 (_ssl.c:1002)')))

如果我在浏览器中尝试,“我的网址”部分工作正常,所以从我的连接端来看这不是问题。

这是我的简单功能:

def get_image_src(self, post_id):
    image_src = []  
    search_url = f"{self.base_url}/posts/{post_id}?q={quote(self.tag)}"
    try:
        response = self.session.get(search_url) # self.session is initialized already
        if response.status_code != 200:
            print(f"{response.status_code} is the status code : not 200")
            return image_src 
        soup = BeautifulSoup(response.text, 'html.parser')
        image = soup.find("img", class_="fit-width")
        if image:
            image_src.append(image.get("src"))
    except Exception as e:
        print(f"Error processing get_images_srcs {post_id}: {str(e)}")
    return image_src

这是我的会话初始化函数:

def _make_session(self):
    session = requests.Session()
    adapter = HTTPAdapter(
        pool_connections=25,
        pool_maxsize=25,
        max_retries=Retry(
            total=4,
            backoff_factor=1, 
            status_forcelist=[443,503,504] 
        )
    )
    session.headers.update({
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Referer': 'https://danbooru.donmai.us'
    })
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session
web-scraping ssl beautifulsoup
1个回答
0
投票

您收到的错误通常意味着服务器在完成握手或数据传输之前突然关闭了 SSL/TLS 连接。

在您的情况下,这意味着您正在发出相同的重复请求,因此您在服务器端会受到速率限制或阻塞

你能做什么?

  • 放慢速度和/或增加延迟。您需要一个大型数据集,因此如果您在请求之间引入睡眠或限制并发性,您可能会完成工作。
  • 确保您的标题正确(在您的示例中,Chrome 版本已过时 - 最新版本是
    131
    )。
  • 引入 try- except 来处理瞬态 SSL 错误。

话虽如此,您可以调整会话初始化代码:

adapter = HTTPAdapter(
    pool_connections=5,
    pool_maxsize=5,
    max_retries=Retry(
        total=5,
        backoff_factor=2,  # increase the delay between retries
        status_forcelist=[429, 443, 503, 504]
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.