gpt4 book ai didi

python - 在 Eventlet 页面抓取器中维护 session ?

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:05 24 4
gpt4 key购买 nike

我正在尝试对需要身份验证(不是 http 身份验证)的站点进行一些抓取。我使用的脚本基于 this eventlet example .基本上,

urls = ["https://mysecuresite.com/data.aspx?itemid=blah1",
"https://mysecuresite.com/data.aspx?itemid=blah2",
"https://mysecuresite.com/data.aspx?itemid=blah3"]

import eventlet
from eventlet.green import urllib2

def fetch(url):
print "opening", url
body = urllib2.urlopen(url).read()
print "done with", url
return url, body

pool = eventlet.GreenPool(10)
for url, body in pool.imap(fetch, urls):
print "got body from", url, "of length", len(body)

建立 session 一点也不简单;我必须加载登录页面,从登录表单中提取一些变量,然后发送带有身份验证详细信息和这些变量的 POST 请求。 session好之后,剩下的请求都是简单的GET请求。

使用上面的代码作为引用点,我将如何创建池中其余部分将使用的 session ? (我需要并行进行后续请求)

最佳答案

无论如何我都不是这方面的专家,但看起来使用 urllib2 维护 session 状态的标准方法是为每个 session 创建一个自定义开启器实例。看起来像这样:

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())

然后您使用该开启器执行您必须执行的任何身份验证,并且所有 session 状态都将保留在开启器对象本身中。然后您可以将 opener 对象作为参数传递给并行请求。

这是一个示例脚本,它为多个用户并行登录到 secondlife.com,并同时为每个用户发出多个页面请求。这个特定站点的登录过程很棘手,因为它涉及在能够使用第二个请求登录之前从第一个请求捕获 CSRF token 。因此,登录方法非常困惑。不过,对于您感兴趣的任何网站,原则应该是相同的。

import eventlet
from eventlet.green import urllib2
import re

login_url = 'https://secure-web28.secondlife.com/my/account/login.php?lang=en&type=second-life-member&nextpage=/my/index.php?lang=en'

pool = eventlet.GreenPool(10)

def fetch_title(opener, url):
match = re.search(r'<title>(.*)</title>', opener.open(url).read())
if match:
return match.group(1)
else:
return "no title"

def login(login_url, fullname, password):
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
login_page = opener.open(login_url).read()
csrf_token = re.search(r'<input type="hidden" name="CSRFToken" value="(.*)"/>', login_page).group(1)
username, lastname = fullname.split()
auth = "CSRFToken=%s&form[type]=second-life-member&form[nextpage]=/my/index.php?lang=en&form[persistent]=Y&form[form_action]=Log%%20In&form[form_lang]=en&form[username]=%s&form[lastname]=%s&form[password]=%s&submit=Submit" % (
csrf_token, username, lastname, password)
logged_in = opener.open(login_url, auth).read()
return opener


def login_and_fetch(login_url, fullname, password, page_urls):
opener = login(login_url, fullname, password)
# note that this deliberately uses the global pool
pile = eventlet.GreenPile(pool)
for url in page_urls:
pile.spawn(fetch_title, opener, url)

return pile

login_urls = [login_url] *2
usernames = [...]
passwords = [...]
page_urls = [['https://secure-web28.secondlife.com/my/account/?lang=en-US',
'https://secure-web28.secondlife.com/my/community/events/index.php?lang=en-US']] * 2

for user_iter in pool.imap(login_and_fetch, login_urls, usernames, passwords, page_urls):
for title in user_iter:
print "got title", title

关于python - 在 Eventlet 页面抓取器中维护 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2294869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com