在经过认证的登录会话后,通过Scrapy
问题描述:
在环顾四周后使用Selenium,似乎如果您通过Scrapy登录到网站,则如果尝试在蜘蛛内使用Selenium,则认证的登录会话不会转移。有没有办法将该会话转移到Selenium?或者我需要用Selenium重新登录网站吗?在经过认证的登录会话后,通过Scrapy
谢谢!
答
该会话很可能只是您的cookie。因此,要将会话转换为Selenium webdriver,您需要将scrapy请求的cookie设置为硒。
Scrapy足够聪明,可以自行追踪cookie,您可以在response.headers
中找到当前请求的cookie。
然后你可以设置这些Cookie您的webdriver:
import re
foo = response.headers['Set-Cookie']
values = {k.strip():v for k,v in re.findall(r'(.*?)=(.*?);', foo)}
driver.add_cookie(values)
注:一些网站可以使用也需要更复杂的会话
driver.add_cookie({'name': 'foo', 'domain': 'bar'})
可以使用字典理解像变换response.headers['Set-Cookie']
到词典其他标题匹配,但您也可以通过将您的scrapy响应标题复制到您的selenium webdriver来复制该标题。
答
检查也有类似的问题在这里scrapy selenium authentication
日志与scrapy API
# call scrapy post request with after_login as callback
return FormRequest.from_response(
response,
# formxpath=formxpath,
formdata=formdata,
callback=self.browse_files
)
通会话硒司机
# logged in previously with scrapy api
# partial solution
cookies = map(lambda e: e.strip(), cookie2.split(";"))
for cookie in cookies:
cookie_map = {"name": name, "value": value}
print "adding cookie"
print cookie_map
self.driver.add_cookie(cookie_map)
self.driver.get(response.url)
files = self.wait_for_elements_to_be_present(By.XPATH, "//*[@id='files']", response)
print files
嗨感谢这么多,我来试试出。但是我对python和我很陌生; ma对于在re.findall(r'(。*?)=(。*?);''中为k,v的'values = {k.strip():v' ,foo)}'line。你是否在行内定义了一个函数?我只想知道,所以我可以查找任何需要了解该行的相关教程。 –
这被称为[词典理解](http://*.com/questions/1747817/create-a-dictionary-with-list-comprehension-in-python)它有点更先进的技术,但基本上它转换字符串标题''“cookie1 = value1; cookie2 = value”'进入字典'{“cookie1”:“value1”,“cookie2”:“value2”}' – Granitosaurus
非常感谢。它并没有结束工作,但无论如何感谢!我采取了用硒手动重新登录并导航回到我所在的位置。 –