【问题标题】:Image source is different in html between my browser and get request我的浏览器和获取请求之间的 html 图像源不同
【发布时间】:2021-11-27 03:35:28
【问题描述】:

我怀疑这是因为我误解了 lxml 或 html 的工作原理,如果有人能在我的知识范围内填补这个空白,我将不胜感激。

我的代码是:

url = "https://prnt.sc/ca0000"
response = requests.get(url,headers={'User-Agent': 'Chrome'})

# Navigate to the correct img src.
tree = html.fromstring(response.content)
xpath = '/html/body/div[3]/div/div/img/@src'

imageURL = tree.xpath(xpath)[0]

print(imageURL)

我希望这样做会得到如下结果:

data:image/png;base64,iVBORw0KGgoAAA...((这真的很长))...Jggg==

如果我理解正确,那是图像在我的计算机上本地存储的位置。

但是当我运行代码时,我得到:

“https://prnt.sc/ca0000”

为什么这些不同?

【问题讨论】:

  • 服务器可能会向不同的浏览器和/或设备(台式机、笔记本电脑、平板电脑、手机)发送不同的 HTML。它可能使用标头 User-Agent 来识别浏览器,您可能必须在请求中设置正确的值 - Chrome 可能还不够。这也可能是其他问题 - 许多现代页面使用 JavaScript 添加内容(并检测机器人/脚本),但请求无法运行 JavaScript。
  • 在 HTML 中,我看到两个 img 具有不同的 scr - 其中一个具有图像链接,另一个具有 https://prnt.sc/ca0000。你可能会使用错误的xpath - 最好使用idclass

标签: python html xpath lxml


【解决方案1】:

问题是此页面使用javaScriptdata:image/png;base64 ... 代替https://prnt.sc/ca0000requests 不能使用JavaScript

但是有两个img 与不同的scr - 第一个具有图像的标准URL (https:///....),另一个具有假https://prnt.sc/ca0000

所以即使没有JavaScript,这个 xpath 也适用于我

xpath = '//img[@id="screenshot-image"]/@src'

此代码获取正确的网址并下载图片。

import requests
from lxml import html

url = "https://prnt.sc/ca0000"

response = requests.get(url, headers={'User-Agent': 'Chrome'})

tree = html.fromstring(response.content)

image_url = tree.xpath('//img[@id="screenshot-image"]/@src')[0]

print(image_url)

# -- download ---

response = requests.get(image_url, headers={'User-Agent': 'Chrome'})

with open('image.png', 'wb') as fh:
    fh.write(response.content)

结果

https://image.prntscr.com/image/797501c08d0a46ae93ff3a477b4f771c.png

【讨论】:

    猜你喜欢
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2016-01-11
    相关资源
    最近更新 更多