Files
abot/xiuren/xiuren_dl.py
2025-02-24 15:05:45 +08:00

145 lines
4.4 KiB
Python

import requests
from bs4 import BeautifulSoup
import os
import time
import random
def get_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/114.0.0.0 Safari/537.36'
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
return response.text
except requests.exceptions.RequestException as e:
print(f"Error fetching {url}: {e}")
return None
def parse_initial_page(html):
soup = BeautifulSoup(html, 'html.parser')
posts = soup.find_all('a', href=lambda x: x and x.endswith('.html'))
first_two_posts = posts[:2]
post_info = []
print(posts)
for post in first_two_posts:
text = post.text.strip()
print(f"Post text: '{text}'") # 调试输出,检查实际内容
if not text:
print("Empty post text, skipping...")
continue
parts = text.split()
if len(parts) < 2:
print(f"Unexpected format in '{text}', skipping...")
continue
# 提取编号和图片总数
number = parts[0].replace('No.', '') if parts[0].startswith('No.') else None
pages = parts[-1].replace('P', '') if parts[-1].endswith('P') else None
if not number or not pages:
print(f"Failed to parse number or pages from '{text}', skipping...")
continue
try:
total_images = int(pages)
url = 'https://www.xiurenwang.cc/' + post['href']
post_info.append({'url': url, 'number': number, 'total_images': total_images})
except ValueError:
print(f"Invalid total_images value in '{text}', skipping...")
continue
print(f"post_info:{post_info}")
return post_info
def extract_title_and_first_image(html):
soup = BeautifulSoup(html, 'html.parser')
title = soup.title.text.strip()
images = soup.find_all('img', src=lambda x: x and 'pic/' in x)
if images:
first_image = images[0]
first_image_src = first_image['src']
return title, first_image_src
else:
return None, None
def parse_image_url(src):
image_filename = src.split('/')[-1]
starting_number = int(image_filename.split('.')[0])
return starting_number
def download_image(image_url, filename):
try:
response = requests.get(image_url)
response.raise_for_status()
with open(filename, 'wb') as f:
f.write(response.content)
except requests.exceptions.RequestException as e:
print(f"Error downloading {image_url}: {e}")
def download_images(image_urls, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for i, image_url in enumerate(image_urls):
filename = os.path.join(output_dir, f"{i + 1}.jpg")
download_image(image_url, filename)
time.sleep(random.uniform(1, 3))
def main():
initial_url = 'https://www.xiurenwang.cc/bang?f=7'
initial_html = get_html(initial_url)
if not initial_html:
return
post_info = parse_initial_page(initial_html)
if not post_info:
print("No valid posts found.")
return
for post in post_info:
post_url = post['url']
post_number = post['number']
total_images = post['total_images']
print(f"Processing post {post_number} with {total_images} images...")
post_html = get_html(post_url)
if not post_html:
continue
title, first_image_src = extract_title_and_first_image(post_html)
if not first_image_src:
print(f"No image found for post {post_number}")
continue
starting_number = parse_image_url(first_image_src)
# Construct full base URL
base_url = first_image_src.rsplit('/', 1)[0] + '/'
full_base_url = 'https:' + base_url
# Generate image URLs
image_urls = []
for i in range(total_images):
image_number = starting_number + i
image_url = full_base_url + str(image_number) + '.jpg'
image_urls.append(image_url)
# Create output directory
output_dir = post_number
download_images(image_urls, output_dir)
print(f"Downloaded {total_images} images for post {post_number}")
if __name__ == '__main__':
main()