当我访问一个si时,如何查找从浏览器发出的所有JavaScript请求

2024-09-28 17:27:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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。。。在


Tags: httpsselfcomurldataresponsedefpage
3条回答

您应该手动发送所有XHR和JS请求[在登录时创建的同一会话中]。另外,传递请求头中的所有字段(从网络工具复制)。在

self.header_static = {
        'authority': 'static-exp2.licdn.com',
        'method': 'GET',
        'path': '/sc/h/c356usw7zystbud7v7l42pz0s',
        'scheme': 'https',
        'accept': '*/*',
        'accept-encoding': 'gzip, deflate, br',
        'accept-language': 'en-GB,en;q=0.9,en-US;q=0.8,hi;q=0.7,la;q=0.6',
        'cache-control': 'no-cache',
        'dnt': '1',
        'pragma': 'no-cache',
        'referer': 'https://www.linkedin.com/jobs/',
        'sec-fetch-mode': 'no-cors',
        'sec-fetch-site': 'cross-site',
        'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Mobile Safari/537.36'
        }

def postConnectionRequests(self):
        urls = [
        "https://static-exp2.licdn.com/sc/h/62mb7ab7wm02esbh500ajmfuz",
        "https://static-exp2.licdn.com/sc/h/mpxhij2j03tw91bpplja3u9b",
        "https://static-exp2.licdn.com/sc/h/3nq91cp2wacq39jch2hz5p64y",
        "https://static-exp2.licdn.com/sc/h/emyc3b18e3q2ntnbncaha2qtp",
        "https://static-exp2.licdn.com/sc/h/9b0v30pbbvyf3rt7sbtiasuto",
        "https://static-exp2.licdn.com/sc/h/4ntg5zu4sqpdyaz1he02c441c",
        "https://static-exp2.licdn.com/sc/h/94cc69wyd1gxdiytujk4d5zm6",
        "https://static-exp2.licdn.com/sc/h/ck48xrmh3ctwna0w2y1hos0ln",
        "https://static-exp2.licdn.com/sc/h/c356usw7zystbud7v7l42pz0s",
        ]

        for url in urls:
            self.sess.get(url,headers=self.header_static)
            print("REQUEST SENT TO "+url)

在保存HTML内容之前,我调用了postConnectionRequests()函数,收到了完整的页面。 希望这有帮助。在

虽然在技术上可以模拟来自Python的所有调用,但在LinkedIn这样的动态页面上,我认为这将是非常乏味和脆弱的。在

不管怎样,在你打开LinkedIn之前,你应该先在浏览器中打开“开发者工具”,看看流量如何。您可以过滤来自Javascript的请求(在Firefox中,过滤器称为XHR)。在

network tab in developer tools

然后在代码中模拟必要/有趣的请求。好处是服务器通常将结构化数据返回到Javascript,比如JSON。因此,您不需要做太多的HTML解析。在

如果您发现这种方式进展不大(这取决于特定的站点),那么您可能需要使用Selenium或其他替代方法,例如:

XHR由JavaScript发送,当Python使用请求和beautifulsoup获取页面时,它将不运行JavaScript代码。像Selenium这样的工具加载页面并运行JavaScript。您也可以使用Headless Browsers。在

相关问题 更多 >