Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Time-delayed grequests without using grequests.map()

This is the first time I've tried to use a library with less-than-ideal levels of documentation and example code, so bear with me. I have a tiny bit of experience with the Requests library, but I need to send separate requests to a specific address every second:

  • Without waiting for the first request to complete, handling the individual responses as they come in
  • The responses' content need to be parsed separately
  • While limiting the total number of connections

I can't figure out how to satisfy these conditions simultaneously. grequests.map() will give me the responses' content that I want, but only in a batch after they've all completed. grequests.send() seems to only return a response object that doesn't contain the html text of the web page. (I may be wrong about grequests.send(), but I haven't yet found an example that pulls content from that object)

Here's the code that I have so far:

import grequests
from time import sleep

def print_res(res, **kwargs):
    print res
    print kwargs

headers =   {'User-Agent':'Python'}

req = grequests.get('http://stackoverflow.com', headers=headers, hooks=dict(response=print_res), verify=False)

for i in range(3):
    job = grequests.send(req, grequests.Pool(10))
    sleep(1)

The response I get:

1
<Response [200]>
{'verify': False, 'cert': None, 'proxies': {'http': 'http://127.0.0.1:8888', 'ht
tps': 'https://127.0.0.1:8888'}, 'stream': False, 'timeout': None}
2
<Response [200]>
{'verify': False, 'cert': None, 'proxies': {'http': 'http://127.0.0.1:8888', 'ht
tps': 'https://127.0.0.1:8888'}, 'stream': False, 'timeout': None}
3
<Response [200]>
{'verify': False, 'cert': None, 'proxies': {'http': 'http://127.0.0.1:8888', 'ht
tps': 'https://127.0.0.1:8888'}, 'stream': False, 'timeout': None}

I've tried accessing the html response with req.content, and job.content, but neither work.

like image 465
Neodied Avatar asked Oct 01 '22 00:10

Neodied


1 Answers

Of course, while writing up this question I realized that I hadn't tried to access res.content, which turns out to be exactly what I needed.

Lesson learned: The object that is returned to the response hook in the grequests.get() statement has a content attribute which contains the text of the response sent from the server.

like image 95
Neodied Avatar answered Oct 28 '22 15:10

Neodied