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

浙公网安备 33010602011771号