python - 如何从 Google 搜索结果页面中抓取所有结果(Python/Selenium ChromeDriver)
问题描述
我正在使用 selenium chromedriver 编写 Python 脚本,以从指定数量的结果页面中抓取所有谷歌搜索结果(链接、标题、文本)。
我拥有的代码似乎只是从第一页之后的所有页面中抓取第一个结果。我认为这与我的 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) — Wikipédia', 'link': 'https://fr.wikipedia.org/wiki/Cars_(film)', 'text': "Cars : Quatre Roues, ou Les Bagnoles au Québec (Cars), est le septième long-métrage d'animation entièrement en images de synthèse des studios Pixar.\nPays d'origin : États-Unis\nDuree : 116 分钟\nSociétés de production : Pixar Animation Studios\nGenre :动画\nCars 2 · Michel Fortin · Flash McQueen"}, {'header': 'Cars - Wikipedia, la enciclopedia libre', 'link': 'https://es.wikipedia.org/wiki/Cars', 'text ': 'Cars es una película de animación por computadora de 2006, producida por Pixar Animation Studios y lanzada por Walt Disney Studios Motion Pictures。\nAño : 2006\nGénero : Animación; 冒险; 喜剧;信息...\n历史:John Lasseter Joe Ranft Jorgen Klubi...\nProductora : Walt Disney Pictures; 皮克斯动画...'}, {'header': '', 'link': 'https://fr.wikipedia.org/wiki/Flash_McQueen', 'text': ''}, {'header': ' ','链接':'https://www.allocine.fr/film/fichefilm-55774/secrets-tournage/','文本':''},{'标题':'','链接':' https://fr.wikipedia.org/wiki/Martin_(Cars)', '文本': ''},
建议:
使用计时器来控制您的 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())
推荐阅读
- python - 在 django sql 查询中使用 python 变量
- json - okhttp 返回空响应
- excel - 改变单元格颜色的函数
- django - Forbidden 403 您无权访问此资源。(mod_wsgi、wamp、apache2.4、django)在 Windows 上
- python - 计算文件中重复条目的数量
- haskell - FP 中的 Lambda 演算与类别理论
- javascript - 如何根据jquery中的两个下拉列表更改标签值
- jupyter-notebook - IPython: ipywidgets bug - Code working on Goolge Colab, but not on Jupyter Notebook (tested on 2 different PCs)?
- r - NA 删除计算
- php - 将整列设置为零,然后更新特定行