python3中使用builtwith的方法(很详细)

1. 首先通过pip install builtwith安装builtwith

C:\Users\Administrator>pip install builtwith
Collecting builtwith
  Downloading builtwith-1.3.2.tar.gz
Installing collected packages: builtwith
  Running setup.py install for builtwith ... done
Successfully installed builtwith-1.3.2  

2. 在pycharm中新建工程并输入下面测试代码

import builtwith
tech_used = builtwith.parse(‘http://www.baidu.com‘)
print(tech_used)  

运行会得到下面的错误:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe F:/python/first/FirstPy
Traceback (most recent call last):
  File "F:/python/first/FirstPy", line 1, in <module>
    import builtwith
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\builtwith\__init__.py", line 43
    except Exception, e:
                    ^
SyntaxError: invalid syntax  

Process finished with exit code 1  

原因是builtwith是基于2.x版本的,需要修改几个地方,在pycharm出错信息中双击出错文件,进行修改,主要修改下面三种:
1. Python2中的 “Exception ,e”的写法已经不支持,需要修改为“Exception as e”。
2. Python2中print后的表达式在Python3中都需要用括号括起来。
3. builtwith中使用的是Python2中的urllib2工具包,这个工具包在Python3中是不存在的,需要修改urllib2相关的代码。
1和2容易修改,下面主要针对第3点进行修改:
首先将import urllib2替换为下面的代码:

import urllib.request
import urllib.error  

然后将urllib2的相关方法替换如下:

request = urllib.request.Request(url, None, {‘User-Agent‘: user_agent})
response = urllib.request.urlopen(request)  

再次运行项目,遇到下面错误:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe F:/python/first/FirstPy
Traceback (most recent call last):
  File "F:/python/first/FirstPy", line 3, in <module>
    builtwith.parse(‘http://www.baidu.com‘)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\builtwith\__init__.py", line 62,
in builtwith
    if contains(html, snippet):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\builtwith\__init__.py", line 105,
in contains
    return re.compile(regex.split(‘\\;‘)[0], flags=re.IGNORECASE).search(v)
TypeError: cannot use a string pattern on a bytes-like object  

Process finished with exit code 1  

这是因为urllib返回的数据格式已经发生了改变,需要进行转码,将下面的代码:

if html is None:
    html = response.read()  

修改为

if html is None:
     html = response.read()
     html = html.decode(‘utf-8‘)  

再次运行得到最终结果如下:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe F:/python/first/FirstPy
{‘javascript-frameworks‘: [‘jQuery‘]}  

Process finished with exit code 0  

但是如果把网站换成 ‘www.163.com‘,运行再次报错如下:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe F:/python/first/FirstPy
Error: ‘utf-8‘ codec can‘t decode byte 0xcd in position 500: invalid continuation byte
Traceback (most recent call last):
  File "F:/python/first/FirstPy", line 2, in <module>
    tech_used = builtwith.parse(‘http://www.163.com‘)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\builtwith\__init__.py", line 63,
in builtwith
    if contains(html, snippet):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\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  

Process finished with exit code 1  

似乎还是编码的问题,将编码设置成 ‘GBK’,运行成功如下:

C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe F:/python/first/FirstPy
{‘web-servers‘: [‘Nginx‘]}  

Process finished with exit code 0  

所以不同的网站需要用不同的解码方式么?下面介绍一种判别网站编码格式的方法。
我们需要安装一个叫chardet的工具包,如下:

C:\Users\Administrator>pip install chardet
Collecting chardet
  Downloading chardet-2.3.0-py2.py3-none-any.whl (180kB)
    100% |████████████████████████████████| 184kB 616kB/s
Installing collected packages: chardet
Successfully installed chardet-2.3.0  

C:\Users\Administrator>  

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

{‘encoding‘: ‘utf-8‘, ‘confidence‘: 0.99}  

将builtwith对应的代码做下面修改:

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

记得 import chardet!!!!
加入chardet判断字符编码的方式后,就能适配网站了~~~~

http://blog.csdn.net/fengzhizi76506/article/details/61617067

时间: 2024-10-11 16:14:05

python3中使用builtwith的方法(很详细)的相关文章

Python3中BeautifulSoup的使用方法

BeautifulSoup的使用 我们学习了正则表达式的相关用法,但是一旦正则写的有问题,可能得到的就不是我们想要的结果了,而且对于一个网页来说,都有一定的特殊的结构和层级关系,而且很多标签都有id或class来对作区分,所以我们借助于它们的结构和属性来提取不也是可以的吗? 所以,这一节我们就介绍一个强大的解析工具,叫做BeautiSoup,它就是借助网页的结构和属性等特性来解析网页的工具,有了它我们不用再去写一些复杂的正则,只需要简单的几条语句就可以完成网页中某个元素的提取. 废话不多说,接下

JavaScript 中 Date 对象 getFullYear()方法的详细解释

getFullYear()函数用于使用当地时间返回当前Date对象中的年份值.也就是"年月日"中"年"的数值.例如:2013年7月15日,就返回2013:公元前123年5月12日,就返回-123. 该函数属于Date对象,所有主流浏览器均支持该函数. 语法 date.getFullYear( )getFullYear()函数的返回值为Number类型,返回当前Date对象的年份值 示例&说明 // 定义一个"2013-07-21"的Dat

STL中的set使用方法详细!!!!

1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作.vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入.排序.删除.查找等.让用户在STL使用过程中,并不会感到陌生. 关于set,必须说明的是set关联式容器.set作为一个容器也是

【python】Python3中出现&#39;gbk&#39; codec can&#39;t encode characte的成功解决方法?

亲身测试,所遇问题完全解决!2018/07/08 21:37 环境:windows,Pycharm,python3.6.2 使用Python写文件的时候,或者将网络数据流写入到本地文件的时候,大部分情况下会遇到:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position ... 这个问题. 网络上有很多类似的文件讲述如何解决这个问题,但是无非就是encode,decode相关的,这是导致该问题出现的真正原因吗

S5中新增的Array方法详细说明

ES5中新增的Array方法详细说明 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=3220 一.前言-索引 ES5中新增的不少东西,了解之对我们写JavaScript会有不少帮助,比如数组这块,我们可能就不需要去有板有眼地for循环了. ES5中新增了写数组方法,如下: forEach (js v1.6) map (js v1.6) filter (js v1.6

python3 中encode 和decode的使用方法。

编码: 将文本转换成字节流的过程.即Unicode----------->特定格式的编码方式,产生特定的字节流保存在硬盘中(一般为utf-8格式). 解码: 将硬盘中的字节流转换成文本的过程.即特定格式的字节流------------->Unicode. 注意: 在内存中写的所有的字符,一视同仁,都是Unicode编码,但只有往硬盘保存或者基于网络传输时,才能确定你输入的字符是英文还好汉文,这就是Unicode转换成其他编码格式的过程. 在Python3中的字符串类型: 文本字符串类型: 即我

Python3中出现UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in ordinal not in range(128)的解决方法

添加代码 import sys import codecs sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) Python3中出现UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128)的解决方法 原文地址:https://www.cnblogs.com/liangxc/p/10228027.html

Python3 中 Yield 理解与使用

转自Felix文章 Python3 中 yield 对初学者一直是一个难点存在,网上很多教程,噼里啪啦写了很多,也举了很多例子,但是读完之后还是不知所以然,下面问题还是不知道如何回答,内容有点多,有些地方可能有点啰嗦,但都是满满的干货. - yield 究竟是干嘛的? - yield 是怎么执行的? - yield 的好处是什么? 1. 迭代器与可迭代对象 开始之前,先理解一下迭代器与可迭代对象,因为 yield 其实是一种特殊的迭代器,不过这种迭代器更加优雅. 可迭代对象 # 可迭代对象:列表

在python3环境安装builtwith模块

1.安装命令: pip install builtwith 如果在命令行提示如下错误: Fatal error in launcher: Unable to create process using '"' 使用如下命令: python3 -m pip install builtwith 2.导入模块会出现错误提示: 原因:builtwith模块是基于urllib2开发的,但是在Python3中urllib2分拆成了urllib.request和urllib.error两个包,导致找不到包: 解