【问题标题】:Trying to print HREF tags from a site and getting weird results尝试从站点打印 HREF 标记并得到奇怪的结果
【发布时间】:2020-01-07 02:25:59
【问题描述】:

我正在尝试打印以下链接的 HREF 标记。

这是我的第一次尝试。

# the Python 3 version:
from bs4 import BeautifulSoup
import urllib.request

resp = urllib.request.urlopen("https://www.linkedin.com/search/results/all/?keywords=tim%20morgan&origin=GLOBAL_SEARCH_HEADER")
soup = BeautifulSoup(resp, from_encoding=resp.info().get_param('charset'))

for link in soup.find_all('a', href=True):
    print(link['href'])

当我运行它时,我得到了这个。

/feed/
/feed/
/feed/
/mynetwork/
/jobs/
/messaging/
/notifications/
#

这是我的第二次尝试。

# and a version using the requests library, which as written will work in both Python 2 and 3:
from bs4 import BeautifulSoup as bs
import requests
r = requests.get('https://www.linkedin.com/search/results/all/?keywords=tim%20morgan&origin=GLOBAL_SEARCH_HEADER')
soup = bs(r.content, 'lxml')
links = [item['href'] if item.get('href') is not None else item['src'] for item in soup.select('[href^="https"]') ]
print(links)

当我运行它时,我得到了这个。

['https://static-exp1.licdn.com/sc/h/n7m1fekt1d9hawp3s7wats11', 'https://static-exp1.licdn.com/sc/h/al2o9zrvru7aqj8e1x2rzsrca', 'https://static-exp1.licdn.com/sc/h/2if24wp7oqlodqdlgei1n1520', 'https://static-exp1.licdn.com/sc/h/eahiplrwoq61f4uan012ia17i', 'https://static-exp1.licdn.com/sc/h/2if24wp7oqlodqdlgei1n1520', 'https://static-exp1.licdn.com/sc/h/eahiplrwoq61f4uan012ia17i', 'https://static-exp1.licdn.com/sc/h/c7y7qgvm2uh1zn8pgl84l3rty', 'https://static-exp1.licdn.com/sc/h/auhsc2hi2zkvt7nbqep2ejauv', 'https://static-exp1.licdn.com/sc/h/9vf4mi871c6wolrcm3pgqywes', 'https://static-exp1.licdn.com/sc/h/7z1536jzhgep1sw5uk19e8ec7', 'https://static-exp1.licdn.com/sc/h/a0on5mxqtufmy9y66neg9mdgy', 'https://static-exp1.licdn.com/sc/h/1edhu1lemiqjsbgubat2dejxr', 'https://static-exp1.licdn.com/sc/h/2gdon0pq1074su3zwdop1y2g1']

我期待看到这样的东西:

https://www.linkedin.com/in/timlmorgan/
https://www.linkedin.com/in/timmorgan3/
https://www.linkedin.com/in/tim-morgan-19543731/

等等等等等等

我猜LinkedIn 一定在做一些我不知道的特别的事情。当我对“https://www.nytimes.com/”运行相同的代码时,我得到了我期望的结果。这只是一个学习练习。我很想知道这里发生了什么。我对实际扫描 LinkedIn 的数据不感兴趣。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    LinkedIn 异步加载数据,如果我们实际上在您正在获取的 URL 上查看源代码(Windows 上的 Ctrl + U),您将找不到预期的结果,因为 Javascript 正在加载在页面已经加载了基本信息之后。

    BeautifulSoup 不会在获取该数据的页面上执行 Javascript。

    要解决这个问题,实际上需要找出 API 函数并让您的脚本调用这些函数。

    https://www.linkedin.com/voyager/api/search/filters?filters=List()&keywords=tim%20morgan&q=universalAll&queryContext=List(primaryHitType-%3EPEOPLE)

    除了调整您的呼叫以通过CSRF 检查。或者实际使用他们的API

    【讨论】:

    • 哦,我明白了。现在说得通了。谢谢,桑尼帕特尔!!
    • 查看其他答案,了解您的问题的潜在解决方案:Selenium,它提供绑定并可以为您控制单独的浏览器(无头或无头)。
    • @mgrollins,另一个答案是 OP。 ;D
    • 哈哈@SunnyPatel!至少他们将您的答案标记为正确:-)
    【解决方案2】:

    我测试了一些似乎可以解决问题的 Selenium 代码。

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    
    driver = webdriver.Firefox(executable_path=r'C:\files\geckodriver.exe')
    driver.set_page_load_timeout(30)
    driver.get("https://www.google.com/")
    
    driver.get("https://www.linkedin.com/search/results/all/?keywords=tim%20morgan&origin=GLOBAL_SEARCH_HEADER")
    
    
    continue_link = driver.find_element_by_tag_name('a')
    elems = driver.find_elements_by_xpath("//a[@href]")
    for elem in elems:
        print(elem.get_attribute("href"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2013-08-21
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多