Python grequests模块使用场景及代码实例
使用场景:
1)爬虫设置ip代理池时验证ip是否有效
2)进行压测时,进行批量请求等等场景
grequests利用requests和gevent库,做了一个简单封装,使用起来非常方便。
grequests.map(requests,stream=False,size=None,exception_handler=None,gtimeout=None)
grequests.post(url,json={“name”:“zhangsan”})
grequests.delete(url)
importgrequests urls=[ 'http://www.baidu.com', 'http://www.qq.com', 'http://www.163.com', 'http://www.zhihu.com', 'http://www.toutiao.com', 'http://www.douban.com' ] rs=(grequests.get(u)foruinurls) print(grequests.map(rs))#[,None, ,None,None, ] defexception_handler(request,exception): print("Requestfailed") reqs=[ grequests.get('http://httpbin.org/delay/1',timeout=0.001), grequests.get('http://fakedomain/'), grequests.get('http://httpbin.org/status/500') ] print(grequests.map(reqs,exception_handler=exception_handler))
实际操作中,也可以自定义返回的结果
修改grequests源码文件:
例如:
新增extract_item()函数合修改map()函数
defextract_item(request): """ 提取request的内容 :paramrequest: :return: """ item=dict() item["url"]=request.url item["text"]=request.response.textor"" item["status_code"]=request.response.status_codeor0 returnitem defmap(requests,stream=False,size=None,exception_handler=None,gtimeout=None): """ConcurrentlyconvertsalistofRequeststoResponses. :paramrequests:acollectionofRequestobjects. :paramstream:IfTrue,thecontentwillnotbedownloadedimmediately. :paramsize:Specifiesthenumberofrequeststomakeatatime.IfNone,nothrottlingoccurs. :paramexception_handler:Callbackfunction,calledwhenexceptionoccured.Params:Request,Exception :paramgtimeout:Geventjoinalltimeoutinseconds.(Note:unrelatedtorequeststimeout) """ requests=list(requests) pool=Pool(size)ifsizeelseNone jobs=[send(r,pool,stream=stream)forrinrequests] gevent.joinall(jobs,timeout=gtimeout) ret=[] forrequestinrequests: ifrequest.responseisnotNone: ret.append(extract_item(request)) elifexception_handlerandhasattr(request,'exception'): ret.append(exception_handler(request,request.exception)) else: ret.append(None) yieldret
可以直接调用:
importgrequests urls=[ 'http://www.baidu.com', 'http://www.qq.com', 'http://www.163.com', 'http://www.zhihu.com', 'http://www.toutiao.com', 'http://www.douban.com' ] rs=(grequests.get(u)foruinurls) response_list=grequests.map(rs,gtimeout=10) forresponseinnext(response_list): print(response)
支持事件钩子
defprint_url(r,*args,**kwargs): print(r.url) url=“http://www.baidu.com” res=requests.get(url,hooks={“response”:print_url}) tasks=[] req=grequests.get(url,callback=print_url) tasks.append(req) ress=grequests.map(tasks) print(ress)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。