Avant de poser ma question, un peu de contexte est nécessaire. Je suis en train d'émettre HTTP GET
et POST
demandes à un site Web, avec les mises en garde suivantes:Quelle est la différence entre HttpClientFactory et Agent?
- Redirects devraient
- Les cookies sont nécessaires
- Les demandes doivent passer par un proxy SOCKS (V4A)
jusqu'à présent, je me sers twisted.web.client.Agent
et il est sous-classes (par exemple BrowserLikeRedirectAgent
), mais malheureusement, il semble que SOCKS procurations ne sont pas encore pris en charge (et ProxyAgent
est un non-aller parce que ce c lass est pour les proxies HTTP).
je suis tombé sur twisted-socks, qui semble me permettre de faire ce que je veux, mais je remarqué qu'il utilise HttpClientFactory
au lieu de l'agent, d'où ma question: quelle est la différence entre HttpClientFactory
et Agent
et quand dois-je utiliser chaque un?
Voici un exemple de code utilisant des chaussettes torsadées. J'ai deux questions supplémentaires:
Comment puis-je utiliser des cookies dans cet exemple? J'ai essayé passer un
dict
et une instancecookielib.CookieJar
-cookies
kwarg deHttpClientFactory
, mais cela génère une erreur (quelque chose sur une chaîne étant attendue ... comment diable puis-je envoyer des cookies comme une chaîne?)Cela peut-il code être refactorisé pour utiliser
Agent
? Ce serait idéal, car j'ai déjà une base de code raisonnablement grande qui est écrite avecAgent
à l'esprit.
`` `
import sys
from urlparse import urlparse
from twisted.internet import reactor, endpoints
from socksclient import SOCKSv4ClientProtocol, SOCKSWrapper
from twisted.web import client
class mything:
def __init__(self):
self.npages = 0
self.timestamps = {}
def wrappercb(self, proxy):
print "connected to proxy", proxy
def clientcb(self, content):
print "ok, got: %s" % content[:120]
print "timetamps " + repr(self.timestamps)
self.npages -= 1
if self.npages == 0:
reactor.stop()
def sockswrapper(self, proxy, url):
dest = urlparse(url)
assert dest.port is not None, 'Must specify port number.'
endpoint = endpoints.TCP4ClientEndpoint(reactor, dest.hostname, dest.port)
return SOCKSWrapper(reactor, proxy[1], proxy[2], endpoint, self.timestamps)
def main():
thing = mything()
# Mandatory first argument is a URL to fetch over Tor (or whatever
# SOCKS proxy that is running on localhost:9050).
url = sys.argv[1]
proxy = (None, 'localhost', 9050, True, None, None)
f = client.HTTPClientFactory(url)
f.deferred.addCallback(thing.clientcb)
sw = thing.sockswrapper(proxy, url)
d = sw.connect(f)
d.addCallback(thing.wrappercb)
thing.npages += 1
reactor.run()
if '__main__' == __name__:
main()
` ``