Python 如何浏览受密码保护的网站

Python 如何浏览受密码保护的网站,python,selenium,web-scraping,Python,Selenium,Web Scraping,我有一个网站,我需要从中刮取一些数据(该网站是,我想刮保存的话) 这个网站是受密码保护的,我还认为有一些javascript内容我不明白(我认为某些元素是由浏览器加载的,因为当我设置html时它们不会显示) 我目前有一个使用selenium的解决方案,它确实可以工作,但它需要打开firefox,我真的希望有一个解决方案,我可以让它在后台作为一个只运行控制台的程序运行 如果可能的话,我将如何使用pythons请求库和最少的额外第三方库来归档 以下是我的selenium解决方案的代码: 从selen

我有一个网站,我需要从中刮取一些数据(该网站是,我想刮保存的话)

这个网站是受密码保护的,我还认为有一些javascript内容我不明白(我认为某些元素是由浏览器加载的,因为当我设置html时它们不会显示)

我目前有一个使用selenium的解决方案,它确实可以工作,但它需要打开firefox,我真的希望有一个解决方案,我可以让它在后台作为一个只运行控制台的程序运行

如果可能的话,我将如何使用pythons请求库和最少的额外第三方库来归档

以下是我的selenium解决方案的代码:

从selenium导入webdriver
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.common.by导入
从selenium.webdriver.support将预期的_条件导入为EC
从selenium.webdriver.common.keys导入密钥
导入时间
导入json
#创建新驱动程序
browser=webdriver.Firefox()
browser.get('https://www.merriam-webster.com/login')
#查找电子邮件和密码字段
用户名=浏览器。通过id(“ul电子邮件”)查找元素
密码=浏览器。通过\u id(“ul-password”)查找\u元素\u
#查找按钮登录
send=browser.通过\u id('ul-login')查找\u元素
#发送用户名和密码
用户名。发送密钥(“用户名”)
密码。发送密钥(“密码”)
#等待“接受cookies”按钮出现,然后单击它
WebDriverWait(浏览器,20)。直到(EC.元素可点击((By.CLASS\u名称,“接受cookies按钮”))。点击()
#单击登录按钮
发送。单击()
#“查找”按钮转到保存的单词
WebDriverWait(浏览器,20)。直到(EC.元素可点击((By.CLASS\u名称,“ul收藏夹”))。点击()
单词={}
#现在登录
#循环浏览已保存单词的页面
对于范围(2)中的i:
打印(“现在在第页”+str(i+1))
#查找下一页按钮
下一页=浏览器。按类别名称查找元素(“下一页”)
#等待“下一页”按钮可单击
WebDriverWait(浏览器,20)。直到(EC.element可点击((By.CLASS\u名称,“ul页面下一页”))
#找到页面上的所有单词
用于浏览器中的单词。按类名称(“项首单词”)查找元素:
#将href添加到听写器中
words[word.get_属性(“innerHTML”)]=word.get_属性(“href”)
#奈夫盖特进入下一页
下一页。单击()
browser.close()
#打印单词列表
以open(“output.json”,“w”,encoding=“utf-8”)作为文件:
file.write(json.dumps(words,indent=4))

如果要使用
请求
模块,则需要使用会话

要初始化会话,请执行以下操作:

session_requests = requests.session()
然后您需要一个带有用户名和密码的有效负载

payload = {
    "username":<USERNAME>,
    "password":<PASSWORD>}
现在您的会话应该已登录,因此要转到任何其他密码保护页面,请使用相同的会话:

result = session_requests.get(
    url, 
    headers = dict(referer = url)
)
然后可以使用
result.content
查看该页面的内容

编辑如果您的站点包含CSRF令牌,则需要将其包含在“有效负载”中。要获取CSRF令牌,请将“有效负载”部分替换为:

from lxml import html

tree = html.fromstring(result.text)
#you may need to manually inspect the tree to find how your CSRF token is specified.
authenticity_token = list(set(tree.xpath("//input[@name='csrfmiddlewaretoken']/@value")))[0]

payload = {
    "username":<USERNAME>,
    "password":<PASSWORD>,
    "csrfmiddlewaretoken":authenticity_token
    }
从lxml导入html
tree=html.fromstring(result.text)
#您可能需要手动检查树,以了解如何指定CSRF令牌。
真实性\u令牌=列表(set(tree.xpath(//input[@name='csrfmiddlewaretoken']/@value))[0]
有效载荷={
“用户名”:,
“密码”:,
“csrfmiddlewaretoken”:真实性令牌
}

selenium
静音模式与
会话一起使用
这似乎不起作用。我得到的响应与您未登录时得到的响应相同,或者它已登录且无法正确加载页面。正如我所说的,我非常确定在后台会有一些javascript的东西来加载单词。你知道如何解决这个问题吗?你的站点可能有一个需要包含的CSRF令牌,我已经编辑了我的答案以包含CSRF令牌。他们可能还需要设置cookie。
from lxml import html

tree = html.fromstring(result.text)
#you may need to manually inspect the tree to find how your CSRF token is specified.
authenticity_token = list(set(tree.xpath("//input[@name='csrfmiddlewaretoken']/@value")))[0]

payload = {
    "username":<USERNAME>,
    "password":<PASSWORD>,
    "csrfmiddlewaretoken":authenticity_token
    }