python - 无法从网页中获取电话号码
问题描述
我已经在 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)
我怎样才能从那个网页上刮下这个电话号码?
解决方案
干得好。
线索以以下 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)