如何从网站上抓取所有图像?

时间:2019-05-02 09:10:09

标签: python web-scraping

我有一个网站,希望从website获取所有图像。

该网站本质上是一个动态的网站,我尝试使用Google的Agenty Chrome扩展程序并遵循以下步骤:

  • 我使用CSS选择器选择了要提取的一张图片,这将使扩展程序自动选择其他相同的图片。
  • 查看“显示”按钮,然后选择“ ATTR(属性)”。
  • 将src更改为ATTR字段。
  • 提供名称字段名称选项。
  • 保存并使用Agenty平台/ API运行。

这应该为我产生结果,但不是,它返回空输出。

还有更好的选择吗? BS4会为此提供更好的选择吗?任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

我假设您要下载网站上的所有图像。实际上,使用漂亮的汤4(BS4)有效地做到这一点非常容易。

#code to find all images in a given webpage

from bs4 import BeautifulSoup
import urllib.request
import requests
import shutil

url=('https://www.mcmaster.com/')
html_page = urllib.request.urlopen(url)
soup = BeautifulSoup(html_page, features="lxml")
for img in soup.findAll('img'):
    assa=(img.get('src'))
new_image=(url+assa)

您还可以将粘贴的图像下载到最后:

response = requests.get(my_url, stream=True)
with open('Mypic.bmp', 'wb') as file:
    shutil.copyfileobj(response.raw, file)

两行中的所有内容:

from bs4 import BeautifulSoup; import urllib.request; from urllib.request import urlretrieve
for img in (BeautifulSoup((urllib.request.urlopen("https://apod.nasa.gov/apod/astropix.html")), features="lxml")).findAll('img'): assa=(img.get('src')); urlretrieve(("https://apod.nasa.gov/apod/"+assa), "Mypic.bmp")

新图像应与python文件位于同一目录中,但可以通过以下方式移动:

os.rename()

在McMaster网站上,图像的链接不同,因此上述方法不起作用。以下代码应获取网站上的大多数图像:

from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
import re
import urllib.request
import shutil
import requests
req = Request("https://www.mcmaster.com/")
html_page = urlopen(req)

soup = BeautifulSoup(html_page, "lxml")

links = []

for link in soup.findAll('link'):
    links.append(link.get('href'))

print(links)

更新:我从一些github帖子中发现了以下更为准确的代码:

import requests
import re
image_link_home=("https://images1.mcmaster.com/init/gfx/home/.*[0-9]")
html_page = requests.get(('https://www.mcmaster.com/'),headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'}).text
for item in re.findall(image_link_home,html_page):
    if str(item).startswith('http') and len(item) < 150:
        print(item.strip())
    else:
        for elements in item.split('background-image:url('):
            for item in re.findall(image_link_home,elements):
                print((str(item).split('")')[0]).strip())

希望这会有所帮助!

答案 1 :(得分:0)

您应该使用scrapy,通过使用 css标记选择要下载的内容,它可以使抓取变得无缝。

答案 2 :(得分:0)

此网站使用CSS嵌入来存储图像。如果您检查源代码,则可以找到具有 https://images1.mcmaster.com/init/gfx/home/ 的链接,这些链接是实际的图像,但实际上是缝合在一起的(图像行)

示例:https://images1.mcmaster.com/init/gfx/home/Fastening-and-Joining-Fasteners-sprite-60.png?ver=1539608820

import requests
import re
url=('https://www.mcmaster.com/')
image_urls = []
html_page = requests.get(url,headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'}).text
for values in re.findall('https://images1.mcmaster.com/init/gfx/home/.*[0-9]',html_page):
    if str(values).startswith('http') and len(values) < 150:
        image_urls.append(values.strip())
    else:
        for elements in values.split('background-image:url('):
            for urls in re.findall('https://images1.mcmaster.com/init/gfx/home/.*[0-9]',elements):
                urls = str(urls).split('")')[0]
                image_urls.append(urls.strip())
print(len(image_urls))
print(image_urls)

注意:报废网站受版权保护

答案 3 :(得分:0)

您可以使用Agenty Web Scraping Tool

  1. 使用Chrome扩展程序设置抓取工具,以从图像中提取src属性
  2. 保存代理以在云上运行。

这是在Agenty论坛上回答的类似问题-https://forum.agenty.com/t/can-i-extract-images-from-website/24

images scraping

全面披露-我在Agenty工作