写爬虫,到底是选scrapy还是selenium呢

发表于:2021-9-06 09:41  作者:职说测试   来源:掘金

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: scrapy selenium

  背景故事
  那会儿,作者正在...冥想,微信突然弹出前领导的消息,顿时心里有点小激动,以为是要拉兄弟一把,升职加薪!!!
  结果一看,嗯,原来是个活儿,发来一个视频,类似爬虫的桌面应用,从某音爬取数据,并找到对应评论的某人私信!
  可以是说是批量给视频评论的人私信推销产品,如果他们找过来,然后完成交易,达成转化!问我实现的成本有多大?
  说干就干
  第一点,对于爬虫这类事情,作者是即开心又紧张,心理总有些小兴奋。
  骗人的!!!
  其实脑海里面立即给出多个解决方案:使用什么技术呢?怎样才能更出色的做好呢?
  方案:
  python熟知的scrapy爬虫框架,使用起来真的很棒、很不错!!!
  但是作者是个测试工程师,不是爬虫工程师,爬虫只是偶尔的兴趣爱好!!!
  重点是作者仅仅粗略自学过一段scrapy框架,现在要用起来还得从零开始。
  那么通过F12浏览器调试工具,可以使用接口来爬取数据吗?结果大失所望!!!
  因为直接requests.get(url)请求会提示错误,并没有数据返回。
  仔细一看发现请求参数中有个加密参数,所以每次浏览器请求都会不一样,如果不知道规则,也就无法通过这种方式爬数据。
  既然作者是枚测试人员,那么UI自动化测试中的selenium工具,是不是可以用呢?
  是的,办法总比困难多。
  使用selenium来爬取某音的视频数据
  前提条件:使用者必须有python基础及xpath语法且有自动化思想。
  # 准备python+selenium环境;下载对应chrome浏览器的版本驱动;先准备一个demo测试一下,是否能正常使用!
  from selenium import webdriver
  driver=webdriver.Chrome(executable_path="../chromedriver.exe")
  driver.implicitly_wait(30)
  driver.maximize_window()
  driver.get("http://www.baidu.com")
  # do somethings
  driver.quit()
  如果是目标明确,直接在浏览器中打开官网,搜索关键字得到url<如下代码演示>
  '''
  Created on 2021年7月22日
  @author: qguan
  '''
  import re
  from time import sleep
  from selenium import webdriver
  # 初始化驱动对象 
  driver=webdriver.Chrome(executable_path="../chromedriver.exe")
  driver.implicitly_wait(30)
  driver.maximize_window()
  # 打开目标网址 
  url="https://www.xxxxyin.com/search/%E4%B8%8A%E6%B5%B7%E6%95%B4%E5%9E%8B"
  driver.get(url)
  # 可能是反扒的原因,有拼图验证
  sleep(5) # 这里手动,用于测试
  # 可以使用图像处理,处理滑块验证 
  # 最后当然是使用无头模式
  # 获取当前句柄,后面页面切换使用
  # handler=driver.current_window_handle
  # 获取当前结果页的所有元素集
  video_pic=driver.find_elements_by_xpath("//div[@style='display: block;']/ul/li/div/a[1]")
  # 计数器
  i=1
  for video in video_pic:
      # 遍历点击元素
      video.click()
      # 获取浏览器所有句柄
      handlers=driver.window_handles
      # 切换最新的那一个
      driver.switch_to_window(handlers[-1])
      
      # 获取跳转页面元素:标题、点赞、评论、发布时间、用户名
      titles=driver.find_elements_by_xpath("//div/div[2]/div[1]/div[1]/div[1]/div[2]/h1/span[2]/span/span/span/span")
      if len(titles)>0:
          title=""
          for tit in titles:
              title+=tit.text
      else:
          title="没有获取到完整的title"
      
      praise=driver.find_element_by_xpath("//div/div[2]/div[1]/div[1]/div[1]/div[2]/div/div[1]/div[1]/span").text
      comment=driver.find_element_by_xpath("//div/div[2]/div[1]/div[1]/div[1]/div[2]/div/div[1]/div[2]/span").text
      open_time=driver.find_element_by_xpath("//div/div[2]/div[1]/div[1]/div[1]/div[2]/div/div[2]/span").text
      
      # 视频作者名称
      username=driver.find_element_by_xpath("//div/div[2]/div[1]/div[2]/div/div[1]/div[2]/a/div/span/span/span/span/span")
      
      # 点击用户名跳转用户详情页
      username.click()
      
      # 获取当前页的url地址后,就关闭当前页面
      c_url=driver.current_url
      driver.close() # 为什么关闭不了
      
      param_url=c_url.split("?")[1] # 拆分url地址?拼接的参数
      # 正则匹配,提取用户视频id、用户id
      author_id=re.findall("(\d{11})",param_url)[0]
      group_id=re.findall(r"(\d{19})",param_url)[0]
      
      # 控制台输出结果
      print("第{}条,视频title:{},作品id:{},用户id:{},评论数:{},点赞数:{},发布时间:{}".format(i,title,group_id,author_id,comment,praise,open_time))
      
      # 切换第一页
      driver.switch_to_window(handlers[0])
      
      i+=1 # 计数器加1
       
  # 退出driver驱动
  driver.quit()
  将结果输出在控制台,爬取关键信息如下:
  总结
  从工具易用性来讲爬虫,selenium不如scrapy,主要体现在scrapy方便数据库操作,功能更直接。
  selenium需要熟知元素定位方案,还需要解决更多ui层的问题;连数据库建表都需要亲力亲为;可能还需要搭配其他框架来解决某些问题。
  从学习成本角度来说,只要能快速解决问题的工具就是好工具,欢迎读者更多交流。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理

评 论

论坛新帖



建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海信义律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2021, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道