如何从Google搜索结果页面中刮取所有结果(Python/Selenium ChromeDriver)

如何从Google搜索结果页面中刮取所有结果(Python/Selenium ChromeDriver),python,selenium,selenium-webdriver,selenium-chromedriver,Python,Selenium,Selenium Webdriver,Selenium Chromedriver,我正在编写一个Python脚本,使用selenium chromedriver从指定数量的结果页面上刮取所有google搜索结果(链接、标题、文本) 我的代码似乎只是从第一页之后的所有页面中删除第一个结果。 我认为这与我的for循环是如何在scrape函数中设置的有关,但我还不能调整它,使其按照我希望的方式工作。对于如何修复/更好地处理此问题,欢迎提出任何建议 # create instance of webdriver driver = webdriver.Chrome() url = 'ht

我正在编写一个Python脚本,使用selenium chromedriver从指定数量的结果页面上刮取所有google搜索结果(链接、标题、文本)

我的代码似乎只是从第一页之后的所有页面中删除第一个结果。 我认为这与我的for循环是如何在scrape函数中设置的有关,但我还不能调整它,使其按照我希望的方式工作。对于如何修复/更好地处理此问题,欢迎提出任何建议

# create instance of webdriver
driver = webdriver.Chrome()
url = 'https://www.google.com'
driver.get(url)

# set keyword
keyword = 'cars' 
# we find the search bar using it's name attribute value
searchBar = driver.find_element_by_name('q')
# first we send our keyword to the search bar followed by the ent
searchBar.send_keys(keyword)
searchBar.send_keys('\n')

def scrape():
   pageInfo = []
   try:
      # wait for search results to be fetched
      WebDriverWait(driver, 10).until(
      EC.presence_of_element_located((By.CLASS_NAME, "g"))
      )
    
   except Exception as e:
      print(e)
      driver.quit()
   # contains the search results
   searchResults = driver.find_elements_by_class_name('g')
   for result in searchResults:
       element = result.find_element_by_css_selector('a')
       link = element.get_attribute('href')
       header = result.find_element_by_css_selector('h3').text
       text = result.find_element_by_class_name('IsZvec').text
       pageInfo.append({
           'header' : header, 'link' : link, 'text': text
       })
       return pageInfo

# Number of pages to scrape
numPages = 5
# All the scraped data
infoAll = []
# Scraped data from page 1
infoAll.extend(scrape())

for i in range(0 , numPages - 1):
   nextButton = driver.find_element_by_link_text('Next')
   nextButton.click()
   infoAll.extend(scrape())

print(infoAll)

您有缩进问题:

您应该将
return pageInfo
置于for循环的外部,否则您将在第一次循环执行后返回结果

for result in searchResults:
       element = result.find_element_by_css_selector('a')
       link = element.get_attribute('href')
       header = result.find_element_by_css_selector('h3').text
       text = result.find_element_by_class_name('IsZvec').text
       pageInfo.append({
           'header' : header, 'link' : link, 'text': text
       })
       return pageInfo
像这样:

for result in searchResults:
       element = result.find_element_by_css_selector('a')
       link = element.get_attribute('href')
       header = result.find_element_by_css_selector('h3').text
       text = result.find_element_by_class_name('IsZvec').text
       pageInfo.append({
           'header' : header, 'link' : link, 'text': text
       })
return pageInfo
我已经运行了你的代码并得到了结果:

[{'header':'Cars(film)-维基百科,'link':'https://fr.wikipedia.org/wiki/Cars_(电影)‘文本’:‘汽车:魁北克省四重奏(汽车),这是皮克斯工作室合成图像动画整体的七重奏。\n原创作品:统一制作:116分钟\n制作周期:皮克斯动画工作室\n名称:动画\nCars 2·米歇尔·福廷·Flash麦昆“,{'header':'Cars-Wikipedia,la enciclopedia libre','link':'https://es.wikipedia.org/wiki/Cars“,”文本“:“2006年计算机动画公司的汽车,皮克斯动画工作室和兰扎达沃尔特迪斯尼工作室电影公司的产品。\n纳诺:2006\n尼罗:动画;复仇女神;喜剧;婴儿…\n历史:约翰·拉塞特Joe Ranft Jorgen Klubi…\n产品名称:沃尔特迪斯尼电影公司;皮克斯动画公司…},{'header':'''link':'https://fr.wikipedia.org/wiki/Flash_McQueen','text':''},{'header':'','link':'https://www.allocine.fr/film/fichefilm-55774/secrets-tournage/','text':''},{'header':'','link':'https://fr.wikipedia.org/wiki/Martin_(汽车)“‘文本’:”},

建议:

使用计时器控制for循环,否则您可能会因为可疑活动而被谷歌禁止

步骤: 1.-从时间导入睡眠:
从时间导入睡眠
2.-在最后一个循环中添加计时器:

for i in range(0 , numPages - 1):
    sleep(5) #It'll wait 5 seconds for each iteration
    nextButton = driver.find_element_by_link_text('Next')
    nextButton.click()
    infoAll.extend(scrape())

问题是什么,您是否收到错误?@Jortega未收到错误,问题是:我希望返回的结果集包含第1-5页的所有结果(或numPages中指定的任何页数)。但是我得到的结果只显示了第1、2、3、4和5页的第一个结果。我想知道如何从数据集中包含的每个页面上的所有结果中获取数据。嘿,伙计们,我正在尝试运行此脚本,但得到错误“NosTouchElementException:没有这样的元素:无法找到元素:{“方法”:“css选择器”“,”选择器“:“h3”}(会话信息:chrome=90.0.4430.212)”。有什么线索可以说明是什么原因造成的吗?