python - Linkedin - 通过python登录问题
问题描述
我正在做学校项目,需要的第一部分是登录到linkedin帐户,但是我在执行此任务时遇到问题。我相信我成功通过了身份验证,但是当我想继续新闻提要时,我无法到达那里。
import requests as re
from bs4 import BeautifulSoup
class LoginController:
@staticmethod
def _get_login_parameters(session, url):
page_content = session.get(url).content
soup = BeautifulSoup(page_content, "html.parser")
csrf_param = soup.find("input", {"name": "loginCsrfParam"}).get("value")
csrf_token = soup.find("input", {"name": "csrfToken"}).get("value")
sidsring = soup.find("input", {"name": "sIdString"}).get("value")
return csrf_param, csrf_token, sidsring
def __init__(self, email, password):
self.email = email
self.password = password
self.login_request(self.email, self.password)
def login_request(self, email, password):
login_url = "https://www.linkedin.com/login?fromSignIn=true&trk=guest_homepage-basic_nav-header-signin"
submit_login = "https://www.linkedin.com/uas/login-submit"
session = re.Session()
csrf_param, csrf_token, sidsring = self._get_login_parameters(session, login_url)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0'}
login_data = ({
"session_key": email,
"loginCsrfParam": csrf_param,
"csrfToken": csrf_token,
"session_password": password,
"trk": "guest_homepage-basic_nav-header-signin",
"sIdString": sidsring
})
login_data = {k: str(v).encode("utf-8") for k, v in login_data.items()}
session.post(submit_login, data=login_data, allow_redirects=True)
response = session.get("https://www.linkedin.com/feed/", allow_redirects=True)
print(BeautifulSoup(response.content, features="html.parser").prettify())
if __name__ == "__main__":
LoginController("username", "pwd")
我试图在这里找到一些解决方案,但这里的大多数示例甚至都不起作用或没有帮助我解决我的问题。有人知道吗?
BTW 响应请求的结果是这样的:[在此处输入图像描述][1] [1]:https://i.stack.imgur.com/9TiJt.png
附加信息:我没有任何错误信息。该代码不会将我转发到预期的网站。
URL存在(预期结果)ctrlv.link/CWle ..我自己尝试了多次。
要使代码正常工作,您只需添加您的 linkedin 凭据(最后一行代码),您应该能够在 html 中看到与我相同的结果。
期望的行为:能够在 HTML 中找到“欢迎”一词。
解决方案
因为我无法找出代码可能有什么问题,所以我决定通过使用 selenium 来使用不同的方法。这是我的解决方案。
从 selenium 导入时间导入 webdriver 导入 selenium.common.exceptions 作为例外
class LoginController:
@staticmethod
def _linkedin_login(login, pwd):
options = webdriver.ChromeOptions()
options.add_argument("Start-mmaximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("detach", True)
path = r"your path to chormedriver\chromedriver.exe"
try:
new_session = webdriver.Chrome(options=options, executable_path=path)
except exceptions.WebDriverException:
print("[!] Please download new/stable verison "
"of Chrome new_session at https://chromedriver.chromium.org/downloads")
try:
new_session.get("https://www.linkedin.com/login")
new_session.find_element_by_id("username").send_keys(login)
new_session.find_element_by_id("password").send_keys(pwd)
new_session.find_element_by_xpath("//button[contains(text(), 'Sign in')]").click()
time.sleep(3)
except ImportError:
print("[-] Something went wrong")
def __init__(self, login, pwd):
self.login = login
self.pwd = pwd
self._linkedin_login(self.login, self.pwd)
if __name__ == "__main__":
LoginController("username", "pwd")
我可能还有最后一个问题。我不太擅长基于 python 标准编写代码。这里有人是开发人员还是比我更有经验并且可以重构代码使其看起来应该的(我的意思是如果在我的代码中命名是可以的,我也不确定我是否使用了应该使用的@staticmethond,如果功能不是太大,应该分成更多更小的功能等)谢谢。
推荐阅读
- python - dask可以读取块中的压缩文件吗?
- android - 如何从android中的活动刷新片段列表
- c# - c#:无法与服务器建立连接
- image - 如何使用带有 flatlist 的 react-native-image-carousel 库
- saml-2.0 - SingleLogout 和 Logout 有什么区别?
- java - 我无法使用 jdbc 将 blob 图像插入到 oracle db
- c# - 如何通过表达式树生成的委托调用自己?
- function - ecma5 vs 6 中的函数调用
- c# - Azure Web 作业文件不工作(作业因退出代码 -532462766 而失败)
- angular - 在下拉列表中显示 JSON 数据