我要刮 LinkedIn 的内容使用请求和 bs4,但我在登录后加载页面的 JavaScript 遇到问题(我没有直接获取主页),我不想使用 Selenium
这是我的代码
import requests
from bs4 import BeautifulSoup
class Linkedin():
def __init__(self, url ):
self.url = url
self.header = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36"}
def saveRsulteToHtmlFile(self, nameOfFile=None):
if nameOfFile == None:
nameOfFile ="Linkedin_page"
with open(nameOfFile+".html", "wb") as file:
file.write(self.response.content)
def getSingInPage(self):
self.sess = requests.Session()
self.response = self.sess.get(self.url, headers=self.header)
soup = BeautifulSoup(self.response.content, "html.parser")
self.csrf = soup.find(attrs={"name" : "loginCsrfParam"})["value"]
def connecteToMyLinkdin(self):
self.form_data = {"session_key": "myemail@mail.com",
"loginCsrfParam": self.csrf,
"session_password": "mypassword"}
self.url = "https://www.linkedin.com/uas/login-submit"
self.response = self.sess.post(self.url, headers=self.header, data=self.form_data)
def getAnyPage(self,url):
self.response = self.sess.get(url, headers=self.header)
url = "https://www.linkedin.com/"
likedin_page = Linkedin(url)
likedin_page.getSingInPage()
likedin_page.connecteToMyLinkdin() #I'm connected but java script still loading
likedin_page.getAnyPage("https://www.linkedin.com/jobs/")
likedin_page.saveRsulteToHtmlFile()
我想要帮助在不使用 Selenium 的情况下传递 javascript 负载...
最佳答案
虽然在技术上可以模拟来自 Python 的所有调用,但在像 LinkedIn 这样的动态页面上,我认为它会非常乏味和脆弱。
无论如何,在您打开 LinkedIn 之前,您应该在浏览器中打开“开发人员工具”并查看流量如何。您可以过滤来自 Javascript 的请求(在 Firefox 中,过滤器称为 XHR)。
然后,您将在代码中模拟必要/有趣的请求。好处是服务器通常将结构化数据返回到 Javascript,例如 JSON。因此,您不需要做太多的 HTML 解析。
如果您发现这种方式进展不大(这实际上取决于特定站点),那么您可能必须使用 Selenium 或其他替代方法,例如:
关于javascript - 访问网站时如何查找浏览器发出的所有 JavaScript 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58867127/