我正在编写一个Python脚本,使用selenium chromedriver从指定数量的结果页面中抓取所有谷歌搜索结果(链接、标题、文本)。
我的代码似乎只是从第一页之后的所有页面中抓取第一个结果。我认为这与我的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)
2条答案
按热度按时间vnzz0bqm1#
您有一个缩进问题:
您应该将
return pageInfo
置于for循环之外,否则将在第一次循环执行后返回结果就像这样:
我运行了你的代码并得到了结果:
[{'标题':'汽车(电影)-维基百科','链接':'文本':"汽车:Quatre Roues,ou Les Bagnoles au Québec(汽车),是Pixar工作室合成图像中动画实体的第七个长期产品。\n时间:116分钟\n生产公司:皮克斯动画工作室\n类型:动画\n汽车总动员2·米歇尔·福廷· lightning 麦昆"},{'header ':汽车-维基百科,自由的百科全书,链接:"文本":'汽车是一个película de animación por computadora de 2006,生产por皮克斯动画工作室和lanzada por沃尔特迪斯尼工作室电影.\nAño:2006年\n热内罗:动画;阿文图拉斯;喜剧;婴儿...\n历史:约翰·拉塞特·乔·兰夫特·约根·克鲁比...\n制作人:华特迪士尼电影公司皮克斯动画...'},{'标题':""、"链接":'文本':''},{'表头':""、"链接":'https://www.allocine.fr/film/fichefilm-55774/secrets-tournage/','文本':''},{'表头':""、"链接":'文本':''},
建议:
使用计时器来控制你的for循环,否则你可能会因为可疑活动而被Google禁止
步骤:1. -导入睡眠时间:
from time import sleep
2. -在最后一个循环中添加计时器:dbf7pr2w2#
Google搜索可以使用
BeautifulSoup
网页抓取库进行解析,而不需要selenium
,因为数据不是通过JavaScript动态加载的,并且与selenium
相比执行速度快得多,因为不需要渲染页面和使用浏览器。为了从所有页面获取信息,您可以使用
while
无限循环进行分页。尽量避免使用for i in range()
分页,因为这是一种硬编码的分页方式,因此不可靠。如果页码发生变化(从5到20),分页将中断。由于while循环是无限的,因此需要设置退出它的条件,可以设置两个条件:
当试图请求一个站点时,它可能会认为这是一个bot,这样就不会发生这种情况,您需要发送包含
user-agent
的headers
请求,然后站点会假设您是用户并显示信息。下一步可能是旋转
user-agent
,例如,在PC、移动设备和平板电脑之间切换,以及在Chrome、Firefox、Safari、Edge等浏览器之间切换。最可靠的方法是使用旋转代理、用户代理和验证码解算器。在联机IDE中检查完整代码。
输出示例:
你也可以使用SerpApi的Google Search Engine Results API,这是一个免费的付费API,不同的是它会绕过Google的屏蔽(包括CAPTCHA),不需要创建解析器和维护它。
代码示例:
输出: