Python 循环浏览网页并下载所有图像

Python 循环浏览网页并下载所有图像,python,python-3.x,image,web-scraping,Python,Python 3.x,Image,Web Scraping,我有一个很好的URL结构可以循环: https://marco.ccr.buffalo.edu/images?page=0&score=Clear https://marco.ccr.buffalo.edu/images?page=1&score=Clear https://marco.ccr.buffalo.edu/images?page=2&score=Clear ... 我想循环浏览每一页并下载21幅图像(JPEG或PNG)。我已经看到了几个漂亮的Soap示例,但

我有一个很好的URL结构可以循环:

https://marco.ccr.buffalo.edu/images?page=0&score=Clear
https://marco.ccr.buffalo.edu/images?page=1&score=Clear
https://marco.ccr.buffalo.edu/images?page=2&score=Clear
...
我想循环浏览每一页并下载21幅图像(JPEG或PNG)。我已经看到了几个漂亮的Soap示例,但是我仍然在努力获得一些可以下载多个图像并循环URL的东西。我想我可以使用urllib像这样循环浏览每个URL,但我不确定图像保存的目的是什么。如有任何帮助,我们将不胜感激

for i in range(0,10):
    urllib.urlretrieve('https://marco.ccr.buffalo.edu/images?page=' + str(i) + '&score=Clear')
我试图关注这篇文章,但没有成功:

您可以使用
请求

from bs4 import BeautifulSoup as soup
import requests, contextlib, re, os

@contextlib.contextmanager
def get_images(url:str):
  d = soup(requests.get(url).text, 'html.parser') 
  yield [[i.find('img')['src'], re.findall('(?<=\.)\w+$', i.find('img')['alt'])[0]] for i in d.find_all('a') if re.findall('/image/\d+', i['href'])]

n = 3 #end value
os.system('mkdir MARCO_images') #added for automation purposes, folder can be named anything, as long as the proper name is used when saving below
for i in range(n):
  with get_images(f'https://marco.ccr.buffalo.edu/images?page={i}&score=Clear') as links:
    print(links)
    for c, [link, ext] in enumerate(links, 1):
       with open(f'MARCO_images/MARCO_img_{i}{c}.{ext}', 'wb') as f:
           f.write(requests.get(f'https://marco.ccr.buffalo.edu{link}').content)
输出:

['MARCO_img_1.jpg', 'MARCO_img_10.jpg', 'MARCO_img_11.jpg', 'MARCO_img_12.jpg', 'MARCO_img_13.jpg', 'MARCO_img_14.jpg', 'MARCO_img_15.jpg', 'MARCO_img_16.jpg', 'MARCO_img_17.jpg', 'MARCO_img_18.jpg', 'MARCO_img_19.jpg', 'MARCO_img_2.jpg', 'MARCO_img_20.jpg', 'MARCO_img_21.jpg', 'MARCO_img_3.jpg', 'MARCO_img_4.jpg', 'MARCO_img_5.jpg', 'MARCO_img_6.jpg', 'MARCO_img_7.jpg', 'MARCO_img_8.jpg', 'MARCO_img_9.jpg']

您可以使用
请求

from bs4 import BeautifulSoup as soup
import requests, contextlib, re, os

@contextlib.contextmanager
def get_images(url:str):
  d = soup(requests.get(url).text, 'html.parser') 
  yield [[i.find('img')['src'], re.findall('(?<=\.)\w+$', i.find('img')['alt'])[0]] for i in d.find_all('a') if re.findall('/image/\d+', i['href'])]

n = 3 #end value
os.system('mkdir MARCO_images') #added for automation purposes, folder can be named anything, as long as the proper name is used when saving below
for i in range(n):
  with get_images(f'https://marco.ccr.buffalo.edu/images?page={i}&score=Clear') as links:
    print(links)
    for c, [link, ext] in enumerate(links, 1):
       with open(f'MARCO_images/MARCO_img_{i}{c}.{ext}', 'wb') as f:
           f.write(requests.get(f'https://marco.ccr.buffalo.edu{link}').content)
输出:

['MARCO_img_1.jpg', 'MARCO_img_10.jpg', 'MARCO_img_11.jpg', 'MARCO_img_12.jpg', 'MARCO_img_13.jpg', 'MARCO_img_14.jpg', 'MARCO_img_15.jpg', 'MARCO_img_16.jpg', 'MARCO_img_17.jpg', 'MARCO_img_18.jpg', 'MARCO_img_19.jpg', 'MARCO_img_2.jpg', 'MARCO_img_20.jpg', 'MARCO_img_21.jpg', 'MARCO_img_3.jpg', 'MARCO_img_4.jpg', 'MARCO_img_5.jpg', 'MARCO_img_6.jpg', 'MARCO_img_7.jpg', 'MARCO_img_8.jpg', 'MARCO_img_9.jpg']

当你更新哈哈的时候,我正在写我的回复。这太棒了!我设置了目录和创建一个目录,但其他方面效果很好!“谢谢你!”安德烈很乐意帮忙!如果页面上的图像是jpeg或png,或者png是否保存为.jpg,是否有方法添加一些逻辑?似乎可以。我没有看到它下载超过第1页,即使n设置为3。另外,你能解释一下你函数中的“屈服线”吗?只是为了帮助我理解一点?非常感谢。@Andre请查看我最近的编辑。现在应该可以了<代码>收益是contextmanager实现的一部分。当你更新haha时,我正在写我的回复。这太棒了!我设置了目录和创建一个目录,但其他方面效果很好!“谢谢你!”安德烈很乐意帮忙!如果页面上的图像是jpeg或png,或者png是否保存为.jpg,是否有方法添加一些逻辑?似乎可以。我没有看到它下载超过第1页,即使n设置为3。另外,你能解释一下你函数中的“屈服线”吗?只是为了帮助我理解一点?非常感谢。@Andre请查看我最近的编辑。现在应该可以了<代码>产量是contextmanager实现的一部分。