无法从网页中获取电话号码

时间:2019-05-25 20:10:24

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

我已经在python中创建了一个脚本,以从网页中获取电话号码,但是由于该号码在图片中,因此我对如何获取该电话号码一无所知。

Website link

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

enter image description here

到目前为止,我已经写过:

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)

如何从该网页上抓取这个电话号码?

2 个答案:

答案 0 :(得分:1)

你在这里。

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

enter image description here

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

向该网址发出第二个请求,以[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)

答案 1 :(得分:0)

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来匹配图像。根据每次比赛的位置,您必须从左到右对输出进行排序。