试图从web python + bs4获取所有imgs

时间:2018-02-18 21:33:25

标签: python beautifulsoup python-requests

首先,我会说,由于我的代码注释是西班牙语,我会尝试用英语解释它们,即使代码非常明显且易于理解。如果我解释太明显的事情,不要感到侮辱:)

所以我试图从网站上获取所有img,但它似乎并不是真的想要。我读过一些类似的文章,但似乎都没有。

import requests
from bs4 import BeautifulSoup as bs
import os

您可以访问网站并亲自查看HTML。

# url de las imgs
url = 'https://dbz.space/cards/'

这里请求解析它的网页

# descargamos la pagina para scrapear
page = requests.get(url)
soup = bs(page.text, 'html.parser')

在这里,我搜索该类的所有图像

# localizamos todas las imgs con esa clase
image_tags = soup.findAll("img", {"class": "thumb on"})

在这里,我只看看文件夹imgs是否存在,如果它没有创建一个然后进入它内部

# si no existe imgs lo creamos
if not os.path.exists('imgs'):
    os.makedirs('imgs')

# cambiamos de directorio
os.chdir('imgs')

用于命名所有图像的变量

# para el nombre de la imagen
x = 0

最后是保存过程

# guardando imagenes
for image in image_tags:
    try:
        url = image['src']
        response = requests.get(url)

        if response.status_code == 200:
            with open('img-' + str(x) + '.jpg', 'wb') as f:
                f.write(requests.get(url).content)
                f.close()
                x += 1
        print('Nueva imagen en carpeta')

    except:
        pass

因此,网络上的imgs位于div标签内,并且他们有一个类"拇指在"它们还包含src(显然)链接,这是我想要访问的文件夹名为" imgs"

3 个答案:

答案 0 :(得分:0)

如果你想要的只是图像文件本身的URL ......

> <img class="thumb on"
> src="https://dbz.s3.amazonaws.com/v2/global/character/thumb/card_1011720_thumb.png">

然后简单地......

yourBSobj.find("img", {"class": "thumb on"}).attrs['src']

我实际上会使用find_all(),因此您可以遍历图像循环,进行处理/保存等,然后查看结果。

答案 1 :(得分:0)

首先,正如@ cricket_007所说,img标签确实是由JavaScript异步加载的。但是,不需要使用Selenium

经过检查,您可以看到每个img代码都位于此代码中:

<div class="..." res="..." base="..." aim="" quantity="" release="1" imgur="x">

此标记在源代码中可用(即未由JavaScript加载)。在这里,我们可以获得x值,该值是imgur URL的一部分。一个例子:

<div class="..." res="1010160" base="1010161" aim="" quantity="" release="1" imgur="yK0wNs3">

获取imgur值后,您可以将URL设为:

'https://i.imgur.com/{}.png'.format(imgur)

由于网址为https://i.imgur.com/yK0wNs3.png

完整代码:

r = requests.get('https://dbz.space/cards/')
#soup = BeautifulSoup(r.text, 'lxml')
soup = bs(r.text, 'html.parser')

if not os.path.exists('imgs'):
    os.makedirs('imgs')
os.chdir('imgs')

i = 0
for item in soup.find_all('div', imgur=True):
    imgur = item['imgur']
    if imgur:
        r = requests.get('https://i.imgur.com/{}.png'.format(imgur))
        with open('img-{}.jpg'.format(i), 'wb') as f:
            f.write(r.content)
        i += 1

部分输出:

enter image description here

注意:我正在使用f.write(r.content)而不是f.write(requests.get(url).content)。无需再发送一个请求。

答案 2 :(得分:-1)

所以错误说出File "pilla.py", line 6, in <module> soup = BeautifulSoup(r.text, 'lxml') NameError: name 'BeautifulSoup' is not defined 通过更改soup的变量BeautifulSoup bslxlm的{​​{1}}来解决完整代码就在这里:

html.parser

非常感谢你的帮助。真的很赞美它:))