目录

Python3用不了builtwith库?

更多分享:http://www.catbro.cn

一、前言:

  • BuiltWith是一个网站技术信息查询工具,开发团队来自于澳大利亚。利用该网站所提供的功能,你可以查询出某网站背后是由哪些技术来支持的,比如操作系统的类型、所采用的访问量统计服务、采用的发布平台、广告平台、语言框架、聚合功能、页面文档信息、网站编码及操作系统信息等等。可帮助更深一层次了解该网站的运营情况。
  • BuiltWith:网站查询工具的操作方法很简单,只需输入想要查询的网站地址,就可实时提供相应的数据,如果你是位对于架设网站有着浓厚兴趣的朋友的话,不妨试试这款工具,也许对于你在创建自已的网站时有所帮助。

二、BuiltWith的使用

  • 如果你的开发环境是Pyhton2,那么你仅需要执行pip install builtwith后,即可在代码中正常调用

      import builtwith
      print(builtwith.parse('http://example.webscraping.com'))
    
  • 其会返回该站点所使用的技术支持

      {'web-servers': ['Nginx'], 'web-frameworks': ['Web2py', 'Twitter Bootstrap'], 'programming-languages': ['Python'], 'javascript-frameworks': ['jQuery', 'Modernizr', 'jQuery UI']}
    

  • 如果你的开发环境是Python3时,你会发现,执行报错,

  • 1、执行import builtwith首先报如下错误

      File “”m line 1, in 
    
      File “…\site-packages\builtwith__init__.py”, line43
    
      “Exception, e”
    
  • 因为Exception, ePython2的写法,我们的环境是Python3,所以我们将其改为Exception as e 即可

  • 2、Python2中的print语句在Python3中需要写成print(),按照错误提示修改对应行数即可。

  • 3、builtwith中使用的是Python2中的urllib2工具包,这个工具包在Python3中是不存在的,替换import urllib2为如下代码

      import urllib.request  
      import urllib.error
    
  • 以及使用的urllib2的代码修改为:

       request = urllib.request.Request(url, None, {'User-Agent': user_agent})  
       response = urllib.request.urlopen(request)
    
  • Ok,那我们可以再次运行项目了吧?好开心,又可以愉快的玩耍了

  • No,又报错了

      	return re.compile(regex.split('\\;')[0], flags=re.IGNORECASE).search(v)  
      TypeError: cannot use a string pattern on a bytes-like object  
    
  • 因为urllib返回的数据格式已经发生了改变,我们需要做一下转码

      if html is None:  
      	html = response.read()  
      修改后
      if html is None:  
      	 html = response.read()  
      	 html = html.decode('utf-8')
    
  • 但是,这还不够完美,万一站点不是utf-8呢?

  • 我们可以这么做,如果再获得html的时候,我们知道它的编码,后面动态的转码不就可以了么?

  • 我们通过安装一个叫chardet的工具包,进行解析站点的编码

  • 首先通过pip3安装pip3 install chardet,然后在头部导入import chardet后代码修改如下

      if html is None:
      	html = response.read()
      	encode_type = chardet.detect(html)
      	if encode_type['encoding'] == 'utf-8':
      		html = html.decode('utf-8')
      	else:
      		html = html.decode('gbk')
    
  • Ok,可以愉快的玩耍了