【问题标题】:Can't grab a phone number from a webpage无法从网页中获取电话号码
【发布时间】:2019-05-25 20:10:23
【问题描述】:

我在 python 中创建了一个脚本来从网页中获取电话号码,但我不知道如何获取该号码,因为该号码在图像中。

Website link

这是该数字在该页面上的显示方式:

到目前为止我已经写了:

import requests
from bs4 import BeautifulSoup

url = "use_above_link"

def get_phone_number(link):
    resp = requests.get(link)
    soup = BeautifulSoup(resp.text,"lxml")
    phone = soup.select_one("img.phone-num-img")['src']
    print(phone)

if __name__ == '__main__':
  get_phone_number(url)

我怎样才能从那个网页上抓取这个电话号码?

【问题讨论】:

  • 我认为在图像中制作的目的是让您不要这样做。但你总是可以尝试 OCR 技术。
  • 我只能在有任何有效的图像 url 时尝试使用 OCR,但我没有找到一个 @Norrius。
  • 下载图像并将其提供给谷歌眼镜?
  • 当您没有使用@Robert Cotterman 的链接时如何下载?
  • 我认为你需要修改你的问题一次,因为你的 cmets 很不清楚你的动机是什么?

标签: python python-3.x web-scraping


【解决方案1】:

给你。

线索以以下html开头,表明电话号码可能具有base64编码

该电话号码的 base64 编码值为MDA5NzE1MjE3NjQ4MDY=。该值不存在于该页面上,但存在于您可以从初始页面 html 中提取的其他 url 之一。

向该 url 发出第二个请求,定位 [data-tel] 属性,这是存储编码字符串的位置,提取 base64 编码字符串并解码。

import requests
from bs4 import BeautifulSoup as bs
import base64

with requests.Session() as s:
    r = s.get('https://dubai.dubizzle.com/motors/used-cars/hyundai/accent/2018/6/8/hyundai-accent-excellent-condition-still-u-2/?back=L21vdG9ycy91c2VkLWNhcnMvP3BhZ2U9MzUmcHJpY2VfX2d0ZT0mcHJpY2VfX2x0ZT0meWVhcl9fZ3RlPSZ5ZWFyX19sdGU9JmtpbG9tZXRlcnNfX2d0ZT0ma2lsb21ldGVyc19fbHRlPSZzZWxsZXJfdHlwZT1PVyZrZXl3b3Jkcz0maXNfYmFzaWNfc2VhcmNoX3dpZGdldD0wJmlzX3NlYXJjaD0xJnBsYWNlc19faWRfX2luPSZwbGFjZXNfX2lkX19pbj01OSUyQzkwJTJDMTMzJTJDMTA2JTJDMTg4JTJDJmFkZGVkX19ndGU9JmF1dG9fYWdlbnQ9&shownumber')
    soup = bs(r.content, 'lxml')
    link = 'https://dubai.dubizzle.com' + soup.select_one('[media][href$=shownumber]')['href']
    r = s.get(link)
    soup = bs(r.content, 'lxml')
    encoded = soup.select_one('[data-tel]')['data-tel']
    tel = base64.b64decode(encoded)
    print(tel)

注意事项:

看起来 rel 替代(第二个 url)只是一个移动设备 url,您可以只发出一个请求并将 /m/ 替换为原始 url,即

https://dubai.dubizzle.com/m/motors/used-cars/hyundai/accent/2018/6/8/hyundai-accent-excellent-condition-still-u-2/?back=L21vdG9ycy91c2VkLWNhcnMvP3BhZ2U9MzUmcHJpY2VfX2d0ZT0mcHJpY2VfX2x0ZT0meWVhcl9fZ3RlPSZ5ZWFyX19sdGU9JmtpbG9tZXRlcnNfX2d0ZT0ma2lsb21ldGVyc19fbHRlPSZzZWxsZXJfdHlwZT1PVyZrZXl3b3Jkcz0maXNfYmFzaWNfc2VhcmNoX3dpZGdldD0wJmlzX3NlYXJjaD0xJnBsYWNlc19faWRfX2luPSZwbGFjZXNfX2lkX19pbj01OSUyQzkwJTJDMTMzJTJDMTA2JTJDMTg4JTJDJmFkZGVkX19ndGU9JmF1dG9fYWdlbnQ9&shownumber#

然后代码简化为:

import requests
from bs4 import BeautifulSoup as bs
import base64

r = requests.get('https://dubai.dubizzle.com/m/motors/used-cars/hyundai/accent/2018/6/8/hyundai-accent-excellent-condition-still-u-2/?back=L21vdG9ycy91c2VkLWNhcnMvP3BhZ2U9MzUmcHJpY2VfX2d0ZT0mcHJpY2VfX2x0ZT0meWVhcl9fZ3RlPSZ5ZWFyX19sdGU9JmtpbG9tZXRlcnNfX2d0ZT0ma2lsb21ldGVyc19fbHRlPSZzZWxsZXJfdHlwZT1PVyZrZXl3b3Jkcz0maXNfYmFzaWNfc2VhcmNoX3dpZGdldD0wJmlzX3NlYXJjaD0xJnBsYWNlc19faWRfX2luPSZwbGFjZXNfX2lkX19pbj01OSUyQzkwJTJDMTMzJTJDMTA2JTJDMTg4JTJDJmFkZGVkX19ndGU9JmF1dG9fYWdlbnQ9&shownumber')
soup = bs(r.content, 'lxml')
encoded = soup.select_one('[data-tel]')['data-tel']
tel = base64.b64decode(encoded)
print(tel)

【讨论】:

  • 非常好的解决方案@QHarr !!!现在通过 cmets 了解一个稍微棘手的问题总是会从不同的角度受到不同类型的攻击。
  • 老实说,我认为备用网址适用于移动设备,您只需在原始网址中添加 /m/ 即可发出一个请求。
【解决方案2】:

1.使用付费 OCR 服务

解决此问题的最快方法是使用 OCR 服务。缺点:它们不是免费的。

例如:设置谷歌云项目并启用视觉 API。 Instructions here.然后把你获取的图片传给API,取回数字。

import requests
from bs4 import BeautifulSoup
from google.cloud import vision

url = "use_above_link"
client = vision.ImageAnnotatorClient()

def get_phone_number(link):
  resp = requests.get(link)
  soup = BeautifulSoup(resp.text,"lxml")
  phone_src_url = soup.select_one("img.phone-num-img")['src']
  print(phone_src_url)
  response = client.annotate_image({
    'image': {'source': {'image_uri': phone_src_url }},
    'features': [{'type': vision.enums.Feature.Type.TEXT_DETECTION}],
  })


if __name__ == '__main__':
  get_phone_number(url)

2。使用 OPEN CV

此方法将涉及您自己编写大量代码。这里的主要假设是您将解析 dubizzle 链接。如果是这种情况,这些电话号码的字体是标准的。您必须将每个数字的图像从 0 到 9 解析为可识别的曲线。然后您将需要检测每个图像中的曲线。 Detailed instructions here.

您找到并剪下 10 张图片 - 每个数字一张。这将是您的大师套装。然后您需要通过关注the tutorial I linked 来匹配图像。根据每个匹配的位置,您必须从左到右对输出进行排序。

【讨论】:

  • 如果我找到该电话号码的任何图片网址,我不必创建此帖子。问题是,无论我选择 pytesseract、open cv 还是 cloud,我都找不到任何 url。希望你能理解。
  • 好的,您需要重新构建您的问题。问题不在于您无法从图像中获取数字。问题是您无法从网页中获取图像源。
  • 这不会那么容易。有一个 javascript 函数正在设置图像源。在此文件中:dbzstatic-a.akamaihd.net/… 查找 s.attr("src", "data:image/png;base64," + e.image_text) 并从那里进行逆向工程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 2018-03-01
  • 2018-07-23
相关资源
最近更新 更多