51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2230|回复: 1
打印 上一主题 下一主题

[转贴] 写爬虫,到底是选scrapy还是selenium呢

[复制链接]
  • TA的每日心情
    无聊
    3 天前
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-9-24 09:35:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    背景故事
      那会儿,作者正在...冥想,微信突然弹出前领导的消息,顿时心里有点小激动,以为是要拉兄弟一把,升职加薪!!!
      结果一看,嗯,原来是个活儿,发来一个视频,类似爬虫的桌面应用,从某音爬取数据,并找到对应评论的某人私信!
      可以是说是批量给视频评论的人私信推销产品,如果他们找过来,然后完成交易,达成转化!问我实现的成本有多大?
      说干就干
      第一点,对于爬虫这类事情,作者是即开心又紧张,心理总有些小兴奋。
      骗人的!!!
      其实脑海里面立即给出多个解决方案:使用什么技术呢?怎样才能更出色的做好呢?
      方案:
      python熟知的scrapy爬虫框架,使用起来真的很棒、很不错!!!
      但是作者是个测试工程师,不是爬虫工程师,爬虫只是偶尔的兴趣爱好!!!
      重点是作者仅仅粗略自学过一段scrapy框架,现在要用起来还得从零开始。
      那么通过F12浏览器调试工具,可以使用接口来爬取数据吗?结果大失所望!!!
      因为直接requests.get(url)请求会提示错误,并没有数据返回。
      仔细一看发现请求参数中有个加密参数,所以每次浏览器请求都会不一样,如果不知道规则,也就无法通过这种方式爬数据。
      既然作者是枚测试人员,那么UI自动化测试中的selenium工具,是不是可以用呢?
      是的,办法总比困难多。
      使用selenium来爬取某音的视频数据
      前提条件:使用者必须有python基础及xpath语法且有自动化思想。
    1. # 准备python+selenium环境;下载对应chrome浏览器的版本驱动;先准备一个demo测试一下,是否能正常使用!
    2.   from selenium import webdriver
    3.   driver=webdriver.Chrome(executable_path="../chromedriver.exe")
    4.   driver.implicitly_wait(30)
    5.   driver.maximize_window()
    6.   driver.get("http://www.baidu.com")
    7.   # do somethings
    8.   driver.quit()
    复制代码
    如果是目标明确,直接在浏览器中打开官网,搜索关键字得到url<如下代码演示>

    1. '''
    2.   Created on 2021年7月22日
    3.   @author: qguan
    4.   '''
    5.   import re
    6.   from time import sleep
    7.   from selenium import webdriver
    8.   # 初始化驱动对象
    9.   driver=webdriver.Chrome(executable_path="../chromedriver.exe")
    10.   driver.implicitly_wait(30)
    11.   driver.maximize_window()
    12.   # 打开目标网址
    13.   url="https://www.xxxxyin.com/search/%E4%B8%8A%E6%B5%B7%E6%95%B4%E5%9E%8B"
    14.   driver.get(url)
    15.   # 可能是反扒的原因,有拼图验证
    16.   sleep(5) # 这里手动,用于测试
    17.   # 可以使用图像处理,处理滑块验证
    18.   # 最后当然是使用无头模式
    19.   # 获取当前句柄,后面页面切换使用
    20.   # handler=driver.current_window_handle
    21.   # 获取当前结果页的所有元素集
    22.   video_pic=driver.find_elements_by_xpath("//div[@style='display: block;']/ul/li/div/a[1]")
    23.   # 计数器
    24.   i=1
    25.   for video in video_pic:
    26.       # 遍历点击元素
    27.       video.click()
    28.       # 获取浏览器所有句柄
    29.       handlers=driver.window_handles
    30.       # 切换最新的那一个
    31.       driver.switch_to_window(handlers[-1])
    32.      
    33.       # 获取跳转页面元素:标题、点赞、评论、发布时间、用户名
    34.       titles=driver.find_elements_by_xpath("//div/div[2]/div[1]/div[1]/div[1]/div[2]/h1/span[2]/span/span/span/span")
    35.       if len(titles)>0:
    36.           title=""
    37.           for tit in titles:
    38.               title+=tit.text
    39.       else:
    40.           title="没有获取到完整的title"
    41.      
    42.       praise=driver.find_element_by_xpath("//div/div[2]/div[1]/div[1]/div[1]/div[2]/div/div[1]/div[1]/span").text
    43.       comment=driver.find_element_by_xpath("//div/div[2]/div[1]/div[1]/div[1]/div[2]/div/div[1]/div[2]/span").text
    44.       open_time=driver.find_element_by_xpath("//div/div[2]/div[1]/div[1]/div[1]/div[2]/div/div[2]/span").text
    45.      
    46.       # 视频作者名称
    47.       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")
    48.      
    49.       # 点击用户名跳转用户详情页
    50.       username.click()
    51.      
    52.       # 获取当前页的url地址后,就关闭当前页面
    53.       c_url=driver.current_url
    54.       driver.close() # 为什么关闭不了
    55.      
    56.       param_url=c_url.split("?")[1] # 拆分url地址?拼接的参数
    57.       # 正则匹配,提取用户视频id、用户id
    58.       author_id=re.findall("(\d{11})",param_url)[0]
    59.       group_id=re.findall(r"(\d{19})",param_url)[0]
    60.      
    61.       # 控制台输出结果
    62.       print("第{}条,视频title:{},作品id:{},用户id:{},评论数:{},点赞数:{},发布时间:{}".format(i,title,group_id,author_id,comment,praise,open_time))
    63.      
    64.       # 切换第一页
    65.       driver.switch_to_window(handlers[0])
    66.      
    67.       i+=1 # 计数器加1
    68.        
    69.   # 退出driver驱动
    70.   driver.quit()
    复制代码

    将结果输出在控制台,爬取关键信息如下:

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏1
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-24 20:37 , Processed in 0.067534 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表