Fork me on GitHub

python3中builtwith包不能使用的解决方法

    今天小编在写爬虫的时候遇到了一个问题。就是想利用 builtwith模块取检查网站的技术类型,但是!   小编的python版本是3.X,所以不出意外的出了问题

     在错误处仔细查看发现,builtwith的包中出现了错误,主要在_init_.py文件中,(涉及到Python3的对Exception和print的修改)

   语法错误(因为Python2中的Exception,e 的写法不再支持,需要修改成Exception as e.

               而且python2中的print语法与python3的不太一样,同样修改print,3.X主要修改为print())

except Exception , e:
print 'Error:', e

  大家打开安装builtwith包的_init_.py,然后大约在43,44行,修改过来,这样基本就好了。

        但是!!!!!

       虽然这个问题解决了,仍然不能使用,语法问题修改之后,会报一个没有安装urllib2的包的错误。

     通过pip install  urllib2也会提示找不到包。

     这是因为builtwith依赖于urllib2包。但Pyhton2中的urllib2工具包,在Python3中分拆成了urllib.request和urllib.error两个包。就导致找不到包,同时也没办法安装。

        第一,需要install urllib.request和install urllib.error 两个包,然后将builtwith包中的import urllib2修改为import urllib.request 和import urllib.error。

        第二,代码中的方法函数也需要修改,基本就是将urllib2.xxx修改为urllib.request.xxx。

(urllib2修改后对应的函数列表见:https://docs.python.org/2/library/urllib2.html)

       第三、在html = response.read()下面加上一句:html = html.decode('utf-8')(可以查找功能进行修改,就一个地方)

   但是!!!!

  又又又出现了错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "D:\python3\lib\site-packages\builtwith\__init__.py", line 63, in builtwith
    if contains(html, snippet):
  File "D:\python3\lib\site-packages\builtwith\__init__.py", line 106, in contains
    return re.compile(regex.split('\\;')[0], flags=re.IGNORECASE).search(v)
TypeError: cannot use a string pattern on a bytes-like object

    不同的网站需要用不同的解码方式,在网页编码时需要通过 chardet.detect() 获取原网页的编码

所以还需要安装 chardet 工具包,我们通过 pip 安装

pip install chardet

      将byte数据传入chardet的detect方法后会得到一个Dict,里面有两个值,一个是置信值,一个是编码方式

  所以将builtwith的包中_init_.py文件里修改如下

首先加入chardet包

import chardet

然后修改大约在44行左右记上

encode_type = chardet.detect(html)
                if encode_type['encoding'] == 'utf-8':
                    html = html.decode('utf-8')
                else:
                    html = html.decode('gbk'

这样就ok

posted @ 2017-11-23 12:53  战争热诚  阅读(600)  评论(0)    收藏  举报