使用 selenium爬虫知乎回答 并保存为csv文件

发表于:2021-4-25 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:屠龙少女玖    来源:CSDN

  关于selenium
  用途:
  模拟人工打开浏览器并进行一些操作,类似于手机上的连点器和脚本,可以有效的解决弹窗类的反扒机制。
  使用:
  pip 安装 ,下载浏览器驱动 ,给驱动配置环境 ,重启pycharm测试。
  关于panda库
  用途:
  将字典转换成dataframe并更以csv的形式导出。
  使用:
  pip 安装即可。
  代码:
  from selenium import webdriver # 从selenium导入webdriver
  from selenium.webdriver.common.by import By # 内置定位器策略集
  from selenium.webdriver.support.wait import WebDriverWait # 用于实例化一个Driver的显式等待
  from selenium.webdriver.support import expected_conditions as EC
  from selenium.webdriver.common.action_chains import ActionChains
  from pandas.core.frame import DataFrame
  option = webdriver.ChromeOptions()
  option.add_argument("headless")
  driver = webdriver.Chrome() # chrome_options=option 这个参数设置之后可以隐藏浏览器
  driver.get('https://www.zhihu.com/question/284206141') # 修改这里的地址
  def waitFun():
  js = """
  let equalNum = 0;
  window.checkBottom = false;
  window.height = 0;
  window.intervalId = setInterval(()=>{
  let currentHeight = document.body.scrollHeight;
  if(currentHeight === window.height){
  equalNum++;
  if(equalNum === 2){
  clearInterval(window.intervalId);
  window.checkBottom = true;
  }
  }else{
  window.height = currentHeight;
  window.scrollTo(0,window.height);
  window.scrollTo(0,window.height-1000);
  }
  },1500)"""
  # 这个暂停一下是因为要等待页面将下面的内容加载出,这个 1500 可以根据自己的网络快慢进行适当的调节
  # 这里需要往上移动一下,因为不往上移动一下发现不会加载。
  driver.execute_script(js)
  # selenium 可以获取 浏览器中 js 的变量。调用的js return
  def getHeight(nice):
  # 这里获取 js 中的 checkBottom 变量,作为到底部时进行停止。
  js = """
  return window.checkBottom;
  """
  return driver.execute_script(js)
  try:
  # 先触发登陆弹窗。
  WebDriverWait(driver, 40, 1).until(EC.presence_of_all_elements_located(
  (By.CLASS_NAME, 'Modal-backdrop')), waitFun())
  # 点击空白关闭登陆窗口
  ac = driver.find_element_by_xpath('//body/div[4]/div[1]/div[1]/div[1]/div[2]/button[1]/*[1]')
  ActionChains(driver).move_to_element(ac).double_click(ac).perform()
  # 当滚动到底部时
  WebDriverWait(driver, 40, 3).until(getHeight, waitFun())
  # 获取回答
  answerElementArr = driver.find_elements_by_css_selector('.RichContent-inner') # .List-item
  # 获取id
  idElementArr = driver.find_elements_by_css_selector('div.AuthorInfo-head > span.UserLink') # .List-item
  # 获取日期
  dateElementArr = driver.find_elements_by_css_selector('.ContentItem-time') # .List-item
  # 获取标题
  title = driver.find_element_by_class_name('QuestionHeader-title')
  filename = title.text
  # 创建list
  a = []
  b = []
  c = []
  # id写入
  for uid in idElementArr:
  a.append(uid.text)
  # 答案写入
  for answer in answerElementArr:
  b.append(answer.text)
  # date写入
  for date in dateElementArr:
  c.append(date.text)
  # 将列表转换成字典
  d = {"id": a, "answer": b, "date": c}
  # 创建 Dataframe
  dateframe = DataFrame(d)
  # 到出 csv文件
  dateframe.to_csv("./{}.csv".format(title.text),index=False)
  print(len(answerElementArr))
  print(len(idElementArr))
  print(len(dateElementArr))
  print('爬取问题 ' + title.text + str(len(answerElementArr)) + ' 条,存入到csv文件中')
  finally:
  driver.close() # close the driver
  这套代码是在??python 使用 selenium 爬虫知乎?的基础上进行了完善,将自动关闭登陆窗的机制改为xpath定位元素双击,然后自动向下滑动,并将结果以csv的形式写入方便以后进行数据处理。

      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号