【问题标题】:Python Web Scraper - Issue grabbing links from hrefPython Web Scraper - 从 href 抓取链接的问题
【发布时间】:2021-06-01 15:13:22
【问题描述】:

我一直在关注 this guide 来抓取 LinkedIn 和谷歌搜索。自创建指南以来,谷歌搜索结果的 HTML 发生了一些变化,因此我不得不稍微修改一下代码。我现在需要从搜索结果中获取链接,但遇到了一个问题,即由于错误,即使在从 this post 实施代码修复后程序也没有返回任何内容。我不确定我在这里做错了什么。

import Parameters
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from parsel import Selector
import csv

# defining new variable passing two parameters
writer = csv.writer(open(Parameters.file_name, 'w'))

# writerow() method to the write to the file object
writer.writerow(['Name', 'Job Title', 'Company', 'College', 'Location', 'URL'])

# specifies the path to the chromedriver.exe
driver = webdriver.Chrome('/Users/.../Python Scripts/chromedriver')
driver.get('https://www.linkedin.com')
sleep(0.5)

# locate email form by_class_name then send_keys() to simulate key strokes
username = driver.find_element_by_id('session_key')
username.send_keys(Parameters.linkedin_username)
sleep(0.5)

password = driver.find_element_by_id('session_password')
password.send_keys(Parameters.linkedin_password)
sleep(0.5)

sign_in_button = driver.find_element_by_class_name('sign-in-form__submit-button')
sign_in_button.click()
sleep(3)

driver.get('https:www.google.com')
sleep(3)

search_query = driver.find_element_by_name('q')
search_query.send_keys(Parameters.search_query)
sleep(0.5)

search_query.send_keys(Keys.RETURN)
sleep(3)

################# HERE IS WHERE THE ISSUE LIES ######################
#linkedin_urls = driver.find_elements_by_class_name('iUh30')
linkedin_urls = driver.find_elements_by_css_selector("yuRUbf > a")
for url_prep in linkedin_urls:
    url_prep.get_attribute('href')
#linkedin_urls = [url.text for url in linkedin_urls]
sleep(0.5)

print('Supposed to be URLs')
print(linkedin_urls)

搜索参数是

search_query = 'site:linkedin.com/in/ AND "python developer" AND "London"'

导致一个空列表:

我要抓取的 HTML 部分的片段:

编辑:如果我通过.find_elements_by_class_name 或 Sector97 的第一次编辑,这是输出。

【问题讨论】:

    标签: python python-3.x selenium web-scraping


    【解决方案1】:

    找到了一种替代解决方案,它可能会让您更轻松地实现您所追求的目标。归功于 A.Pond 在 https://stackoverflow.com/a/62050505

    使用 google search api 从结果中获取链接。 您可能需要先安装库

    pip install google
    

    然后就可以使用api快速提取任意数量的链接了:

    from googlesearch import search
    
    links = []
    query = 'site:linkedin.com/in AND "python developer" AND "London"'
    for j in search(query, tld = 'com',start = 0,stop = 100,pause=4): 
        links.append(j)
    

    我得到了前 100 个结果,但您可以根据需要调整参数以获得更多或更少的结果。

    您可以在此处查看有关此 api 的更多信息: https://www.geeksforgeeks.org/performing-google-search-using-python-code/

    【讨论】:

    • 干得好!!!哇。您对最后一个答案的更新有效,但这看起来是更好的选择。更快、更清洁。
    • 我有一个新问题,我发布并试图标记你,但它似乎没有通过。如果您有时间,将不胜感激!我认为这是我完成项目之前的最后一个或倒数第二个障碍。 stackoverflow.com/questions/66535833/…
    • 没问题我今天晚点看看
    • 对不起,直到现在才看到这个,看起来你已经在你的帖子上得到了答案。如果答案不能解决您的问题,请告诉我,我会看看
    【解决方案2】:

    我想我在您的代码中发现了错误。 而不是使用

    linkedin_urls = driver.find_elements_by_css_selector("yuRUbf > a")
    

    试试这个:

    web_elements = driver.find_elements_by_class_name("yuRUbf")
    

    这会让你得到父元素。然后,您可以使用简单的列表推导提取 url 文本:

    linkedin_urls = [elem.find_element_by_css_selector('a').get_attribute('href') for elem in web_elements]
    

    【讨论】:

    • 感谢您试一试。不幸的是,我得到的输出类似于.find_elements_by_class_name,它打印了标题和描述性信息,但不是在 href 中找到的直接 LinkedIn url。您可以查看我的编辑以获取屏幕截图。
    • 我想我已经修复了上面的代码让我知道它现在是否适合你
    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 2017-05-29
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多