Python Can';Don’不要从网页上抓取电话号码

Python Can';Don’不要从网页上抓取电话号码,python,python-3.x,web-scraping,Python,Python 3.x,Web Scraping,我已经用python创建了一个脚本来从网页中获取电话号码,但我找不到任何关于如何获取该号码的想法,因为该号码在图像中 这是该数字在该页面上的显示方式: 到目前为止,我写过: import requests from bs4 import BeautifulSoup url = "use_above_link" def get_phone_number(link): resp = requests.get(link) soup = BeautifulSoup(resp.te

我已经用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)

我如何才能从该网页中获取这个电话号码?1。使用付费OCR服务

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

建立一个谷歌云项目并启用vision API。然后将您获取的图像传递到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。使用开放式CV

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

你找到并剪下10张图片——每一个数字对应一张。这将是您的主设置。然后,您需要通过以下方式匹配图像。根据每个匹配的位置,您必须从左到右排列输出。

给您

线索从以下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 alternate(第二个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)

我认为在图像中制作的目的是为了让你不会。但你可以尝试OCR技术。我只能在有任何有效的图像url时尝试OCR,但我找不到一个@Norrius。下载图像并将其提供给谷歌眼镜?当你没有使用@Robert Cotterman的链接时,如何下载?我想你需要修改一下你的问题,因为你的评论还不清楚你的动机是什么?如果我找到了那个电话号码的任何图像url,我就不必写这篇文章了。问题是,无论我选择Pytesheract、open cv还是cloud,我都找不到任何url可供输入。希望你能理解。好的,你需要重新构思你的问题。问题不在于你无法从图像中获取数字。问题是你无法从网页中获取图像源。这不太容易。有一个javascript函数用于设置图像源。在这个文件中:查找
s.attr(“src”,“data:image/png;base64,”+e.image\u text)
并从那里进行反向工程。非常好的解决方案@QHarr!!!现在浏览一下这些评论,了解到一个非常棘手的问题总是会从不同角度受到不同类型的攻击。老实说,我认为备用url适用于移动设备,您只需在原始url中添加/m/即可发出一个请求。