最近看到一个很有意思的库,直接在命令行中查询你想要的东西,就不用上百度,谷歌了,直接在命令行中搞,是不是很方便!项目地址:https://github.com/gleitz/howdoi

整个代码的逻辑就是根据命令行解析出参数和要查询的内容,然后向谷歌发起请求,默认是在stackoverflow.com查询= =!,然后处理获取到的内容。

设置请求的代理

在发起请求的时候,这里加入了获取代理的部分get_proxies(),用于获取请求的代理

1
2
3
4
5
6
7
8
def _get_result(url):
try:
return requests.get(url, headers={'User-Agent': random.choice(USER_AGENTS)}, proxies=get_proxies(),
verify=VERIFY_SSL_CERTIFICATE).text
except requests.exceptions.SSLError as e:
print('[ERROR] Encountered an SSL Error. Try using HTTP instead of '
'HTTPS by setting the environment variable "HOWDOI_DISABLE_SSL".\n')
raise e

下面是get_proxies()函数,是对urllib.request.getproxies()的一个封装

1
2
3
4
5
6
7
8
9
10
def get_proxies():
proxies = getproxies()
filtered_proxies = {}
for key, value in proxies.items():
if key.startswith('http'):
if not value.startswith('http'):
filtered_proxies[key] = 'http://%s' % value
else:
filtered_proxies[key] = value
return filtered_proxies

其中urllib.request.getproxies()是这样描述的:

这个函数返回了一个协议名到代理服务器url的字典。它会以大小写不敏感的形式扫描名字为<scheme>_proxy的环境变量,对于所有的操作系统这都是第一步,当它找不到的时候,会去再Mac OSX系统配置和Windows注册表中寻找代理信息。如果同时出现了大写的配置和小写的配置,那么优先使用小写配置。

如果环境变量REQUEST_METHOD已经设置,通常说明你的脚本是运行在一个CGI环境,那么环境变量HTTP_PROXY将会被忽略。这是因为那个变量会被客户端使用Proxy的HTTP头注入。如果你需要在一个CGI环境中使用HTTP代理,要么显式的使用ProxyHandler,或者是使用小写变量。

所以对于howdoi的应用,要么你系统配置了全局的代理,要么是手动的在系统的环境变量设置http_proxy之类的环境变量。

1
2
3
4
5
6
7
8
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)

或者

1
2
$ export HTTP_PROXY="http://10.10.1.10:3128"
$ export HTTPS_PROXY="http://10.10.1.10:1080"

但是我发现不论是我采用哪种方式,howdoi都不能正常运行。。会Failed to establish network connection

使用pyquery处理请求的响应

pyquery是一个Python的类似jquery的库,允许你在xml文档中创造jquery查询的库。API尽可能的像jquery。pyquery使用lxml来实现xml和html的快速操纵。

用法就是经过PyQuery类实例化的对象就像jquery的$一样

1
2
3
from pyquery import PyQuery as pq
d = pq(url='http://google.com/')
d("#hello")