我已经在python中创建了一个脚本,以从网页中获取电话号码,但是由于该号码在图片中,因此我对如何获取该电话号码一无所知。
以下是该数字在该页面上的显示方式:
到目前为止,我已经写过:
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)
如何从该网页上抓取这个电话号码?
答案 0 :(得分:1)
你在这里。
线索以以下html开头,该html表示电话号码可能具有base64编码
该电话号码的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来匹配图像。根据每次比赛的位置,您必须从左到右对输出进行排序。