首页 > 解决方案 > 下载领英页面

问题描述

如果我尝试下载任何其他页面,我可以。但是,如果我尝试下载特定的 LinkedIn 页面,它会打印一堆 JavaScript。

from bs4 import BeautifulSoup
import requests

url = 'https://www.linkedin.com/in/profile/'
response = requests.get(url)

soup = BeautifulSoup(response.content, "html.parser")

print(soup)

结果:

<html><head>
<script type="text/javascript">
window.onload = function() {
  // Parse the tracking code from cookies.
  var trk = "bf";
  var trkInfo = "bf";
  var cookies = document.cookie.split("; ");
  for (var i = 0; i < cookies.length; ++i) {
    if ((cookies[i].indexOf("trkCode=") == 0) && (cookies[i].length > 8)) {
      trk = cookies[i].substring(8);
    }
    else if ((cookies[i].indexOf("trkInfo=") == 0) && (cookies[i].length > 8)) {
      trkInfo = cookies[i].substring(8);
    }
  }

  if (window.location.protocol == "http:") {
    // If "sl" cookie is set, redirect to https.
    for (var i = 0; i < cookies.length; ++i) {
      if ((cookies[i].indexOf("sl=") == 0) && (cookies[i].length > 3)) {
        window.location.href = "https:" + window.location.href.substring(window.location.protocol.length);
        return;
      }
    }
  }

  // Get the new domain. For international domains such as
  // fr.linkedin.com, we convert it to www.linkedin.com
  var domain = "www.linkedin.com";
  if (domain != location.host) {
    var subdomainIndex = location.host.indexOf(".linkedin");
    if (subdomainIndex != -1) {
      domain = "www" + location.host.substring(subdomainIndex);
    }
  }

  window.location.href = "https://" + domain + "/authwall?trk=" + trk + "&trkInfo=" + trkInfo +
      "&originalReferer=" + document.referrer.substr(0, 200) +
      "&sessionRedirect=" + encodeURIComponent(window.location.href);
}
</script>
</head></html>

我想这与async负载有关。但我不知道如何下载该页面。

标签: javascriptpythonasynchronousasync-awaitlinkedin

解决方案


试试这个:在您的网络浏览器中打开一个“隐身”或“私人”窗口。尝试转到特定的 LinkedIn 页面。您将被重定向到登录。您只有在登录后才能访问 LinkedIn 个人资料。

这是如何运作的?当 LinkedIn 收到请求时,它会查找请求中调用的特定 cookie li_at。如果它没有找到这个 cookie,它会将请求者重定向到一个带有你所拥有的 JavaScript 的页面。此 JavaScript 用于将您重定向到登录页面。这就是所有window.location.href=东西的意义所在。

您可以通过访问 LinkedIn、复制您自己的li_atcookie 并将其添加到您的请求中来“伪造”登录请求。请注意,这只会暂时起作用:在某些时候,LinkedIn 会期望该 cookie 发生变化,您将不得不重新复制它。

您可以在 Chrome 开发者工具中找到该 cookie:

Chrome 开发者工具截图

例如:

response = requests.get('https://www.linkedin.com/in/robertakarobin/', headers={
    'cookie': 'li_at=abc123'
})
print(response.content)

或者,在外壳中:

curl -H "cookie: li_at=abc123" -i https://www.linkedin.com/in/robertakarobin/

推荐阅读