获取图像的绝对路径而不是 blank.gif

Get absolute paths to images instead of blank.gif

我正在处理一些网站,所以我有一个列表 图片的绝对路径,代码如下:

for img in images:
    try:
      if img["src"].startswith("http"):
        abs_img_url = img["src"]
      else:
        abs_img_url = urljoin(url, img["src"])
    except KeyError:
      # src attribute does not exist
      continue

问题出在这个 webpage,我会得到很多 blank.gif 图片,尽管浏览器会显示存储在 img["data-original"] 属性。令人惊讶的是 Firefox 检查器 在 img["src"] 中显示正确的图像,但是当您查看源代码时 你在 img["data-original"].

中看到它

你能解释一下这个问题吗?你会如何以编程方式处理它? 检测并下载正确的图像,而不是 blank.gif?

给出错误结果的示例图像元素:

<img alt="browser cache backend" class="lazy aligncenter size-full wp-image-57323" data-original="http://11986-presscdn-0-77.pagely.netdna-cdn.com/wp-content/uploads/2008/06/browser-cache-backend.jpg" height="190" itemprop="image" sizes="(max-width: 540px) 100vw, 540px" src="http://11986-presscdn-0-77.pagely.netdna-cdn.com/wp-content/themes/online-tech-tips-2013/images/blank.gif" srcset="http://11986-presscdn-0-77.pagely.netdna-cdn.com/wp-content/uploads/2008/06/browser-cache-backend.jpg 540w, http://11986-presscdn-0-77.pagely.netdna-cdn.com/wp-content/uploads/2008/06/browser-cache-backend-300x106.jpg 300w, http://11986-presscdn-0-77.pagely.netdna-cdn.com/wp-content/uploads/2008/06/browser-cache-backend-80x28.jpg 80w" width="540"/>

尝试添加一个条件来检测图像是否被调用blank.gif:

for img in images:
    try:
        if img["src"].startswith("http"):

        abs_img_url = img["src"]

        if img["src"][-9:]=='blank.gif':
            abs_img_url = img["data-original"]
      else:
        abs_img_url = urljoin(url, img["src"])
    except KeyError:
        # src attribute does not exist
        continue

问题是 JavaScript 在加载时动态地将源从 data-original 属性更改为 src 属性,并且由于 BeautifulSoup 不处理 JS 你最终导致图像的 src 属性无效。考虑到这一点,您有 2 个选择,要么解析 data-original 属性,要么在解析页面之前更改您的方法来处理 JS 代码,例如 Selenium 或 CasperJS 或 PhantomJS。

我认为搜索正确的属性是一个很好的方法,不会让你的抓取工具过于复杂。

my_images = []

for img in images:
    try:
        if img['src'].endswith('blank.gif'):
            my_images.append(img['data-original'])
        else:
            my_images.append(img['src'])
    except KeyError:
        continue

my_abs_images = [img if img.startswith('http') else urljoin(url, img) for img in my_images]