当前位置: 首页 > 科技观察

搜索代码,再也不用在谷歌上复制粘贴了

时间:2023-03-19 13:20:05 科技观察

先问你一个问题,如果你在编码的过程中遇到问题,不知道怎么解决,你通常会怎么办?当然是搜了,去哪里搜?比如这里我想知道如何在Python中使用requests,如何上传文件。我可能直接谷歌一下。结果很多,比如官方文档,StackOverflow等等,再一一查看。比如我输入关键字python请求上传文件,结果类似如下:这里给我的第一个结果是StackOverflow,结果链接是https://stackoverflow.com/questions/22567306/python-requests-file-upload,我打开了,然后找到了得票最高的答案。这里得票最高的答案如trivia所示,然后复制它的代码试试看,就可以了。不过好像还是有点麻烦?打开浏览器,打开Google或StackOverflow,然后尝试找到投票最高的答案。简介今天给大家介绍一款神器,叫howdoi。有了它,我们似乎可以和StackOverflow说再见了。接下来我们就来看看howdoi可以做什么。安装好后,我们可以直接输入这样一条命令,比如:howdoipythonrequestsuploadfile,返回结果给我是这样的:files={'upload_file':open('file.txt','rb')}values={'DB':'photcat','OUT':'csv','SHORT':'short'}r=requests.post(url,files=files,data=values)比如我要搜索python怎么发送一个POST请求,输入这个命令:howdoipythonrequestspost返回这样的结果:>>>importrequests>>>r=requests.post('http://httpbin.org/post',json={"key":"value"})>>>r.status_code200>>>r.json{'args':{},'data':'{"key":"value"}','files':{},'form':{},'headers':{'Accept':'*/*','Accept-Encoding':'gzip,deflate','Connection':'close','Content-Length':'16','Content-Type':'application/json','Host':'httpbin.org','User-Agent':'python-requests/2.4.3CPython/3.4.0','X-Request-Id':'xx-xx-xx'},'json':{'key':'value'},'origin':'x.x.x.x','url':'http://httpbin.org/post'}看起来不错,不是吧。例如,我想搜索如何在Python中将时间戳转换为日期时间,并输入此命令:howdoipythontimestamptodatetime返回结果如下:fromdatetimeimportdatetimets=int("1284101485")#ifyouencountera"yearisoutofrange"errorthetimestamp#maybeinmilliseconds,try`ts/=1000`inthatcaseprint(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d%H:%M:%S'))Java会吗?试一试:howdoijavatimestamptodatetime返回结果如下:Timestampstamp=newTimestamp(System.currentTimeMillis);Datedate=newDate(stamp.getTime);System.out.println(date);相当高。以上是如何实现的?没错,借助howdoi项目。howdoi那么这个howdoi到底是什么?我们可以在GitHub上找到,链接地址为:https://github.com/gleitz/howdoi。看看简介:Areyouahackprogrammer?您是否发现自己经常在谷歌上搜索如何完成基本的编程任务?假设您想知道如何在bash中格式化日期。当您可以简单地留在控制台中询问howdoi时,为什么还要打开浏览器并通读博客(冒着分心的风险)。意思就是如果你想搜索一些编程相关的解决方案,我们不需要打开浏览器,然后阅读文档或者博客,你可以使用howdoi直接得到答案。操作就是我们上面说的。howdoi是一个Python项目,我们可以使用pip命令安装:pip3installhowdoi如果是Mac,建议使用brew安装:brewinstallhowdoi安装完成后,可以使用howdoi命令。完整的用法如下:usage:howdoi.py[-h][-pPOS][-a][-l][-c][-j][-nNUM_ANSWERS][-C][-v][-eENGINE]QUERY[QUERY...]instantcodinganswersviathecommandlinepositionalarguments:QUERYthequestiontoansweroptionalarguments:-h,--helpshowthishelpmessageandexit-pPOS,--posPOSselectanswerinspecifiedposition(default:1)-a,--alldisplaythefulltextoftheanswer-l,--linkdisplay-onlyptheanswerenlor,--linkdisplay-onlyptheanswerenlor回复,--linkjson-outputreturnanswersinrawjsonformat,toprettyprinttry'howdoiprettyprintjsoncommandline'-nNUM_ANSWERS,--num-answersNUM_ANSWERSnumberofanswersstoreturn-C,--clear-cacheclearthecache-v,--version显示当前版本的howdoi-eENGINE,--engineENGINE只改变这个查询的搜索引擎。当前(默认),google支持的引擎:duckduckgo。但一般如上篇演示直接输入问题即可。例如,要查看如何在Python中打印traceback,此搜索:howdoiprintstacktracepython结果如下:还不错。原理这时候大家可能会有疑问,这是怎么实现的呢?为什么这么准确。其实只要看看源码就可以了。让我们来看看。其实源码在这里:https://github.com/gleitz/howdoi/blob/master/howdoi/howdoi.py。来看看这么多的定义:SUPPORTED_SEARCH_ENGINES=('google','bing','duckduckgo')URL=os.getenv('HOWDOI_URL')or'stackoverflow.com'USER_AGENTS=('Mozilla/5.0(Macintosh;IntelMacOSX10.7;rv:11.0)Gecko/20100101Firefox/11.0','Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:22.0)Gecko/20100101Firefox/22.0','Mozilla/5.0(WindowsNT6.1;rv:11.0)Gecko/20100101Firefox/11.0',('Mozilla/5.0(Macintosh;IntelMacOSX10_7_4)AppleWebKit/536.5(KHTML,likeGecko)''Chrome/19.0.1084.46Safari/536.5'),('Mozilla/5.0(Windows;WindowsNT6.1)AppleWebKit/536.5(KHTML,likeGecko)Chrome/19.0.1084.46''Safari/536.5'),)SEARCH_URLS={'bing':SCHEME+'www.bing.com/search?q=site:{0}%20{1}&hl=en','google':SCHEME+'www.google.com/search?q=site:{0}%20{1}&hl=en','duckduckgo':SCHEME+'duckduckgo.com/?q=site:{0}%20{1}&t=hj&ia=web'}看来我们知道了什么,这些答案都是从搜索引擎中得到的。然后我们再看一眼,看到了一个关键的_get_result方法,定义如下:def_get_result(url):try:returnhowdoi_session.get(url,headers={'User-Agent':_random_choice(USER_AGENTS)},proxies=get_proxies,verify=VERIFY_SSL_CERTIFICATE).textexceptrequests.exceptions.SSLError:_print_err('EncounteredanSSLError.TryusingHTTPinsteadof''HTTPSbysettingtheenvironmentvariable"HOWDOI_DISABLE_SSL".\n')raisesee,这里是一个发起get请求的请求,那么这个url到底是怎么回事呢?来自(哪里?让我们找到调用_get_result方法的地方:def_get_links(query):search_engine=os.getenv('HOWDOI_SEARCH_ENGINE','google')search_url=_get_search_url(search_engine)result=_get_result(search_url.format(URL,url_quote(query)))if_is_blocked(result):_print_err('Unabletofindananswerbecausethesearchenginetemporarilyblockedtherequest.Pleasewaitafewminutesorselectadifferentsearchengine.')raiseBlockError("Temporaryblockbysearchengine")html=pq(result)return_extract_links(html,search_engine)这里就是_get_links方法调用了form_result就是_get_result,传入网址还有query,其中search_url是通过_get_search_url方法传递给search_engine的,search_engine是通过环境变量HOWDOI_SEARCH_ENGINE获取的,默认是google,再看_get_search_url的实现,定义如下:def_get_search_url(search_engine):returnSEARCH_URLS。get(search_engine,SEARCH_URLS['google'])显然是在SEARCH_URLS中定义的,所以最后我们可以得到如下搜索URL:www.google.com/search?q=site:stackoverflow.com%20{query}&hl=en其中query就是我们要搜索的,比如搜索printstacktracepython,构造的URL是:https://www.google.com/search?q=site:stackoverflow.com%20print%20stack%20trace%20python&hl=en这是我们访问的结果:其实这是借助Google的StackOverflow的内容,python关键字的内容。然后howdoi只是提取TOP答案,然后解析并返回。

猜你喜欢