Python 循环浏览网页并下载所有图像
我有一个很好的URL结构可以循环: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示例,但
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实现的一部分。