J'essaie donc de parcourir la page à propos de LinkedIn pour obtenir les «spécialités» de certaines entreprises. Lorsque j'essaie de gratter LinkedIn avec une belle soupe, cela me donne une erreur d'accès refusé, j'utilise donc un en-tête pour simuler mon navigateur. Cependant, il donne cette sortie au lieu du HTML correspondant:
\ n \ nwindow.onload = function () {\ n // Analyse le code de suivi des cookies. \ n var trk = "bf"; \ n var trkInfo = "bf"; \ n var cookies = document. cookie.split (";"); \ n pour (var i = 0; i
8)) {\ n trk = cookies [i] .substring (8); \ n} \ n else if ((cookies [i] .indexOf ("trkInfo =") == 0) && (cookies [i] .length> 8)) {\ n trkInfo = cookies [i] .substring (8); \ n} \ n} \ n \ n if (window.location.protocol == "http : ") {\ n // Si le cookie" sl "est défini, redirigez vers https. \ n for (var i = 0; i 3)) {\ n window.location.href = "https:" + window.location.href.substring (window.location.protocol .length); \ n return; \ n} \ n} \ n} \ n \ n // Récupère le nouveau domaine. Pour les domaines internationaux tels que \ n // fr.linkedin.com, nous le convertissons en www.linkedin.com \ n var domain = "www.linkedin.com"; \ n if (domain! = Location.host) {\ n var subdomainIndex = location.host.indexOf (". linkedin"); \ n if (subdomainIndex! = -1) {\ n domain = "www" + location.host.substring (subdomainIndex); \ n} \ n} \ n \ n window.location.href = "https: //" + domaine + "/ authwall? trk =" + trk + "& trkInfo =" + trkInfo + \ n "& originalReferer =" + document.referrer.substr (0 , 200) + \ n "& sessionRedirect =" + encodeURIComponent (window.location.href); \ n} \ n \ n '
import requests from bs4 import BeautifulSoup as BS url = 'https://www.linkedin.com/company/biotech/' headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate", "DNT": "1", "Connection": "close", "Upgrade-Insecure-Requests": "1"} response = requests.get(url, headers=headers) print(response.content)
Qu'est-ce que je fais de mal? Je pense qu'il essaie de vérifier les cookies. Est-ce que je pourrais ajouter cela dans mon code?
3 Réponses :
Vous devez d'abord assembler la réponse.
page_content = BeautifulSoup(page_response.content, "html.parser") #we use the html parser to parse the url content and store it in a variable. textContent = [] for i in range(0, 20): paragraphs = page_content.find_all("p")[i].text textContent.append(paragraphs) # In my use case, I want to store the speech data I mentioned earlier. so in this example, I loop through the paragraphs, and push them into an array so that I can manipulate and do fun stuff with the data.
Ce n'est pas mon exemple, mais il peut être trouvé ici https://codeburst.io/web-scraping-101- avec-python-belle-soupe-bb617be1f486
Je pense que la question portait sur le contournement de la redirection de LinkedIn pour acquérir un code source HTML qui peut être analysé par une belle soupe, pas des problèmes avec l'utilisation d'une belle soupe.
Je pensais que c'était le problème: "Cependant, il donne cette sortie au lieu du HTML correspondant" et comme il imprime la réponse à la requête brute, il n'obtient pas de HTML.
LinkedIn effectue actuellement des réglages intéressants de cookies et des redirections ultérieures, ce qui empêche votre code de fonctionner tel quel. Cela ressort clairement de l'examen du JavaScript renvoyé lors de votre demande initiale. Fondamentalement, les cookies HTTP sont définis par le serveur Web pour le suivi des informations, et ces cookies sont analysés par le JavaScript que vous rencontrez, avant la redirection finale. Si vous procédez à une ingénierie inverse du JavaScript, vous constaterez que la redirection finale est quelque chose comme ceci (du moins pour moi en fonction de ma position et des informations de suivi):
import requests from bs4 import BeautifulSoup as BS url = 'https://www.linkedin.com/authwall?trk=bf&trkInfo=bf&originalReferer=&sessionRedirect=https%3A%2F%2Fwww.linkedin.com%2Fcompany%2Fbiotech%2F' with requests.Session() as s: response = s.get(url) print(response.content)
Vous pouvez également utiliser Python Request module pour maintenir les sessions pour vous, qui gérera automatiquement les en-têtes HTTP tels que les cookies afin que vous n'ayez pas à vous en soucier. Ce qui suit devrait vous donner la source HTML que vous recherchez. Je vous laisse le soin de mettre en œuvre BeautifulSoup et d'analyser ce que vous désirez.
url = 'https://www.linkedin.com/authwall?trk=bf&trkInfo=bf&originalReferer=&sessionRedirect=https%3A%2F%2Fwww.linkedin.com%2Fcompany%2Fbiotech%2F'
Vous pouvez utiliser Selenium pour obtenir la page avec un contenu JS dynamique. Vous devez également vous connecter car la page que vous souhaitez récupérer nécessite une authentification. Donc:
Distributing medical products
Résultat:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC EMAIL = '' PASSWORD = '' driver = webdriver.Chrome() driver.get('https://www.linkedin.com/company/biotech/') el = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'form-toggle'))) driver.execute_script("arguments[0].click();", el) WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'login-email'))).send_keys(EMAIL) WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'login-password'))).send_keys(PASSWORD) WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'login-submit'))).click() text = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="ember71"]/dl/dd[4]'))).text