Python grequests模塊使用場(chǎng)景及代碼實(shí)例
使用場(chǎng)景:
1) 爬蟲(chóng)設(shè)置ip代理池時(shí)驗(yàn)證ip是否有效
2)進(jìn)行壓測(cè)時(shí),進(jìn)行批量請(qǐng)求等等場(chǎng)景
grequests 利用 requests和gevent庫(kù),做了一個(gè)簡(jiǎn)單封裝,使用起來(lái)非常方便。
grequests.map(requests, stream=False, size=None, exception_handler=None, gtimeout=None)
另外,由于grequests底層使用的是requests,因此它支持
GET,OPTIONS, HEAD, POST, PUT, DELETE 等各種http method
所以以下的任務(wù)請(qǐng)求都是支持的
grequests.post(url, json={“name”:“zhangsan”})grequests.delete(url)
代碼如下:
import grequestsurls = [ ’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) for u in urls)print(grequests.map(rs)) # [<Response [200]>, None, <Response [200]>, None, None, <Response [418]>]def exception_handler(request, exception): print('Request failed')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))
實(shí)際操作中,也可以自定義返回的結(jié)果
修改grequests源碼文件:
例如:
新增extract_item() 函數(shù)合修改map()函數(shù)
def extract_item(request): ''' 提取request的內(nèi)容 :param request: :return: ''' item = dict() item['url'] = request.url item['text'] = request.response.text or '' item['status_code'] = request.response.status_code or 0 return itemdef map(requests, stream=False, size=None, exception_handler=None, gtimeout=None): '''Concurrently converts a list of Requests to Responses. :param requests: a collection of Request objects. :param stream: If True, the content will not be downloaded immediately. :param size: Specifies the number of requests to make at a time. If None, no throttling occurs. :param exception_handler: Callback function, called when exception occured. Params: Request, Exception :param gtimeout: Gevent joinall timeout in seconds. (Note: unrelated to requests timeout) ''' requests = list(requests) pool = Pool(size) if size else None jobs = [send(r, pool, stream=stream) for r in requests] gevent.joinall(jobs, timeout=gtimeout) ret = [] for request in requests: if request.response is not None: ret.append(extract_item(request)) elif exception_handler and hasattr(request, ’exception’): ret.append(exception_handler(request, request.exception)) else: ret.append(None) yield ret
可以直接調(diào)用:
import grequestsurls = [ ’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) for u in urls)response_list = grequests.map(rs, gtimeout=10)for response in next(response_list): print(response)
支持事件鉤子
def print_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)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. python 如何在 Matplotlib 中繪制垂直線2. bootstrap select2 動(dòng)態(tài)從后臺(tái)Ajax動(dòng)態(tài)獲取數(shù)據(jù)的代碼3. ASP常用日期格式化函數(shù) FormatDate()4. python中@contextmanager實(shí)例用法5. html中的form不提交(排除)某些input 原創(chuàng)6. CSS3中Transition屬性詳解以及示例分享7. js select支持手動(dòng)輸入功能實(shí)現(xiàn)代碼8. 如何通過(guò)python實(shí)現(xiàn)IOU計(jì)算代碼實(shí)例9. 開(kāi)發(fā)效率翻倍的Web API使用技巧10. vue使用moment如何將時(shí)間戳轉(zhuǎn)為標(biāo)準(zhǔn)日期時(shí)間格式
