javascript - 下载领英页面
问题描述
如果我尝试下载任何其他页面,我可以。但是,如果我尝试下载特定的 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
负载有关。但我不知道如何下载该页面。
解决方案
试试这个:在您的网络浏览器中打开一个“隐身”或“私人”窗口。尝试转到特定的 LinkedIn 页面。您将被重定向到登录。您只有在登录后才能访问 LinkedIn 个人资料。
这是如何运作的?当 LinkedIn 收到请求时,它会查找请求中调用的特定 cookie li_at
。如果它没有找到这个 cookie,它会将请求者重定向到一个带有你所拥有的 JavaScript 的页面。此 JavaScript 用于将您重定向到登录页面。这就是所有window.location.href=
东西的意义所在。
您可以通过访问 LinkedIn、复制您自己的li_at
cookie 并将其添加到您的请求中来“伪造”登录请求。请注意,这只会暂时起作用:在某些时候,LinkedIn 会期望该 cookie 发生变化,您将不得不重新复制它。
您可以在 Chrome 开发者工具中找到该 cookie:
例如:
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/
推荐阅读
- android - android.view.InflateException: Binary XML file line #10: Error inflating class android.support.v7.widget.Toolbar
- c++ - 在 Visual Studio Enterprise 2017 中禁用自动生成的注释
- angular - 如何在不按键的情况下为 ag-Grid 列启用 MULTI-SORT?
- git - 如何在 Git 中识别已删除的远程分支?
- swift - 有没有办法只更改“问题”标签并为测验应用程序保留相同的“答案”选项?
- python - 为什么我的 odering 和 list_view 不能与 django 管理类中的字段集一起使用
- python - Craigslist selenium 诊断发生了什么
- average - 对 tableau 2019 中的所有度量值进行平均
- r - 如何在向量中找到值开始平稳的点
- flutter - 您如何在视频播放器类之外播放视频?