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

时间:2020-10-22 17:58:50

标签: python selenium selenium-webdriver selenium-chromedriver

我正在使用Selenium chromedriver处理Python脚本,以从指定数量的结果页面上抓取所有Google搜索结果(链接,标题,文本)。

我所拥有的代码似乎仅从第一页之后的所有页面中抓取第一结果。 我认为这与在scrape函数中设置for循环有关,但是我无法对其进行调整以使其达到我希望的方式。任何有关如何解决/更好的方法的建议,对此表示赞赏。

# 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)

1 个答案:

答案 0 :(得分:0)

您有缩进问题:

您应该将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)-Wikipédia','link':'https://fr.wikipedia.org/wiki/Cars_(film)','text':“汽车:Quatre Roues ,魁北克省的Bagnoles au或汽车,以及皮克斯电影制片厂的长期动画制作。\ nPays d'origine:États-Unis\nDurée:116分钟\nSociétéss电影制作:Pixar \ nGenre:动画\ nCars 2·Michel Fortin·Flash McQueen“},{'header':'Cars-Wikipedia,la enciclopedia libre','link':'https://es.wikipedia.org/wiki/Cars' ,“文字”:“ 2006年计算机动画作品展”,皮克斯动画工作室和迪斯尼影业电影公司制作的产品。\nAño:2006 \nGénero:Animación; Aventuras; Comedia; \\ Historia:John Lasseter Joe Ranft Jorgen Klubi ... \ nProductora:沃尔特·迪士尼影业;皮克斯动画工作室...'},{'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循环,否则您会因可疑活动而被Google禁止

步骤: 1.-从时间导入睡眠:from time import sleep 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())