3
votes

Web scraping LinkedIn ne me donne pas le html ... qu'est-ce que je fais de mal?

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?


0 commentaires

3 Réponses :


-1
votes

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


2 commentaires

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.



2
votes

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'


0 commentaires

0
votes

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


0 commentaires