我想用requests和bs4删除LinkedIn的内容,但是我在登录后加载页面的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()
我需要帮助来传递javascript加载而不使用Selenium。。。在
您应该手动发送所有XHR和JS请求[在登录时创建的同一会话中]。另外,传递请求头中的所有字段(从网络工具复制)。在
在保存HTML内容之前,我调用了
postConnectionRequests()
函数,收到了完整的页面。 希望这有帮助。在虽然在技术上可以模拟来自Python的所有调用,但在LinkedIn这样的动态页面上,我认为这将是非常乏味和脆弱的。在
不管怎样,在你打开LinkedIn之前,你应该先在浏览器中打开“开发者工具”,看看流量如何。您可以过滤来自Javascript的请求(在Firefox中,过滤器称为XHR)。在
然后在代码中模拟必要/有趣的请求。好处是服务器通常将结构化数据返回到Javascript,比如JSON。因此,您不需要做太多的HTML解析。在
如果您发现这种方式进展不大(这取决于特定的站点),那么您可能需要使用Selenium或其他替代方法,例如:
XHR由
JavaScript
发送,当Python使用请求和beautifulsoup获取页面时,它将不运行JavaScript代码。像Selenium
这样的工具加载页面并运行JavaScript。您也可以使用Headless Browsers
。在相关问题 更多 >
编程相关推荐