我正在尝试为 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
您收到的错误通常意味着服务器在完成握手或数据传输之前突然关闭了 SSL/TLS 连接。
在您的情况下,这意味着您正在发出相同的重复请求,因此您在服务器端会受到速率限制或阻塞。
你能做什么?
131
)。话虽如此,您可以调整会话初始化代码:
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]
)
)