”明月如霜,好风如水,清景无限 “

终于还是忍不住对qq空间动手了啊,可惜技术不行,还没玩一天,就被qq空间电脑版给封ip了。最后连表白墙的空间都进不去了:

  • 下面就介绍几个selenium的问题。最直观的理解是:你的程序操纵着浏览器,自动化的进行你想进行的动作,可以是鼠标,键盘的事件。这样的好处就是网站分不清你是爬虫,因为本质上可以理解成一个按程序操作浏览器的人。

  • 首先是qq空间的登录,因为有自动登录,也不用输密码。我就直接登录了。(如果你想了了解账号密码登录,文远就不提供了(对,我是懒逼,而且有滑块验证,还真不好弄))

from selenium import webdriver
import time
# wd = webdriver.Chrome(executable_path=r'C:\Users\文远\Desktop\git_test\ipynb_爬虫\异步系列\chromedriver.exe')
wd = webdriver.Chrome()
# wd.implicitly_waitmport(10)
wd.implicitly_wait(5)
wd.get('https://i.qq.com/')
# wd.get('https://i.qq.com/?s_url=http%3A%2F%2Fuser.qzone.qq.com%2F512985297%2Finfocenter')
wd.switch_to.frame("login_frame")
wd.find_element_by_class_name("img_out_focus").click()
# wd.find_element_by_id("img_out_512985297").click()
wd.switch_to.window(wd.window_handles[0])
# page_html=wd.page_source
# print(page_html)
time.sleep(1)

其实就是这个界面:(因此只需要点击头像)

好了,咋们是先折腾一下好友的空间,爬照片?说说?咱们先访问一下前200位的空间(咋们还是先找一下空间不让我访问的好友有哪些)

print(wd.current_url)
print(len(wd.window_handles))
wd.find_element_by_id("aMyFriends").click()
time.sleep(1)
small_frame=wd.find_element_by_class_name("app_canvas_frame")
wd.switch_to.frame(small_frame)
time.sleep(1)
# current_num=wd.find_element_by_css_selector('#mecarewho_pager > a.num.current').get_attribute('textContent')
# print(current_num)
all_num = wd.find_element_by_css_selector('#mecarewho_pager > a:nth-last-child(2)').text
print("all_num",all_num)
current_num=str(0)
while current_num != all_num:current_num=wd.find_element_by_css_selector('#mecarewho_pager > a.num.current').get_attribute('textContent')print("current_num",current_num)wd.switch_to.default_content()small_frame=wd.find_element_by_class_name("app_canvas_frame")wd.switch_to.frame(small_frame)time.sleep(1)pic_list = wd.find_elements_by_css_selector('ol.rank-list>li')print("len(pic_list)",len(pic_list))for i in pic_list:name=i.find_element_by_css_selector(' div.info > p > a').get_attribute('title')print(name)el=i.find_element_by_css_selector(' div.info > p > a')wd.execute_script("arguments[0].click();", el)time.sleep(1)wd.switch_to.window(wd.window_handles[-1])wd.refresh()time.sleep(1)page_html=wd.page_sourceex='主人设置了权限,您可通过以下方式访问|对不起,您没有权限访问对方的空间'if len(re.findall(ex,page_html,re.S))!=0:with open(path+'unallow.txt','a+',encoding='utf-8') as f:f.write(name+'\n')wd.close()wd.switch_to.window(wd.window_handles[0])time.sleep(1)small_frame=wd.find_element_by_class_name("app_canvas_frame")wd.switch_to.frame(small_frame)element1 = wd.find_element_by_css_selector('#mecarewho_pager > a.qz-button.btn-pager-next > i')# element1 = driver.find_element_by_css_selector('.ush button')wd.execute_script("arguments[0].click();", element1)time.sleep(1)
  • 代码的原理就是控制浏览器打开空间,关闭。反复横跳,而且文远加的time.sleep(1)很多,可惜还是因为短时间访问次数过高,被封IP了。

  • 具体流程就是:打开某好友空间(点击名字元素),获取名字,判断是否对我设置权限,关闭别人的空间,下一个好友……下一页。(疯狂重复)

遇到的问题的总结:

  • 无法定位元素,就比如登录时,find_element_by_class_name搞半天找不到元素。
    原因:没有注意到html在iframe中。
small_frame=wd.find_element_by_class_name("app_canvas_frame")
wd.switch_to.frame(small_frame)
# wd.switch_to.default_content()  #返回主frame
  • 窗口切换,浏览器驱动不能切换到想要的窗口
    确定:看一下当前网址就知道用wd.current_url方法
for i in wd.window_handles:wd.switch_to.window(i)print(wd.current_url)if **** in wd.current_url:break
  • 跳出了不明弹窗,打断了浏览器控制
    方法:本来自然情况下应该是点击我知道了,这个button,可惜这个不是html里的,因此也找不到这个button对应的元素。文远灵机一动,想到了刷新一下网页。
wd.refresh()

  • 循环里点击某元素报错
    原因:应该是元素定位相互覆盖。
wd.find_element_by_css_selector(' div.info > p > a').click()

代码改为

el=wd.find_element_by_css_selector(' div.info > p > a')
wd.execute_script("arguments[0].click();", el)

总页数的获取失败

原因:随着页数变换,按钮对应元素位置有变化,要找到,最大页数的特性,应该是倒数第二个元素。a:nth-last-child(2)

all_num = wd.find_element_by_css_selector('#mecarewho_pager > a:nth-last-child(2)').text
  • 代码对的,却报错了
    八成是没加上time.sleep(1),代码运行较快,如果没有响应,由于串行,面向过程。数据缺失报错。大部分情况下隐式等待有用:wd.implicitly_wait(5),但是隐式等待很死板有时处理不了。如下视频解释:
https://www.bilibili.com/video/BV1Z4411o7TA?p=34

最后,举栗子,爬一个好友的说说图片:

import time
start=time.time()
from selenium import webdriver
import requests
import os
path = r'C:\Users\文远\Desktop\git_test\ipynb_爬虫\自动化系列\qqzone\queen\\'
if not  os .path.exists(path):os.mkdir(path)
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
wd = webdriver.Chrome()
# wd.implicitly_waitmport(10)
wd.implicitly_wait(5)
wd.get('https://i.qq.com/?s_url=http%3A%2F%2Fuser.qzone.qq.com%2F512985297%2Finfocenter')
wd.switch_to.frame("login_frame")
wd.find_element_by_id("img_out_512985297").click()
wd.switch_to.window(wd.window_handles[0])
time.sleep(1)
wd.find_element_by_id("aMyFriends").click()
time.sleep(1)
wd.switch_to.default_content()
small_frame=wd.find_element_by_class_name("app_canvas_frame")
wd.switch_to.frame(small_frame)
time.sleep(1)
# cc=wd.find_element_by_css_selector('div[class="qz-pager"]>a:nth-of-type(4)')
# print(cc.get_attribute('outerHTML'))
wd.find_element_by_css_selector('div[class="qz-pager"]>a:nth-of-type(4)').click()
time.sleep(1)
wd.find_element_by_css_selector('ol[class="rank-list"]>li:nth-of-type(5) div[class="avatar"]').click()flag_wd=wd.current_window_handle
for i in wd.window_handles:wd.switch_to.window(i)print(wd.current_url)if '1247077532' in wd.current_url:break
# wd.find_element_by_css_selector('li[class="menu_item_311"] a').click()  ###中间弹出一步,我知道了???
time.sleep(1)
wd.refresh()
time.sleep(1)
wd.find_element_by_css_selector("#menuContainer > div > ul > li.menu_item_311 > a").click()
# wd.find_element_by_css_selector('ul.head-nav-menu>li.menu_item_311>a').click()
time.sleep(1)
small_frame=wd.find_element_by_class_name("app_canvas_frame")
wd.switch_to.frame(small_frame)
time.sleep(1)
href = wd.find_elements_by_xpath('//div[@class="img-attachments-inner clearfix"]/a')
print("*"*100)
print(len(href))
print("*"*100)for i,url in enumerate(href):new_url = url.get_attribute("href")# print(new_url)pic = requests.get(url=new_url,headers=headers).contentfile_name = path+'%s.jpg'%i# print(file_name)with open(file_name,'wb') as f:f.write(pic)
print("all_time is ",time.time()-start)

selenium真的很慢:

  • 25张图片,用时37s(其中的time.sleep(1)睡眠大概有15s),唉,着实垃圾。可惜反扒技术太强,文远落泪。

好了,喜欢文章的话,记得点赞并把公众号设置为星标哦。

END

作者:不爱跑马的影迷不是好程序猿

   喜欢的话请关注点赞												

对qq空间动手--selenium实践相关推荐

  1. python爬取好友qq空间_python + selenium +chrome爬取qq空间好友说说并存入mongodb数据库...

    title: python + selenium +chrome爬取qq空间好友说说并存入mongodb数据库 准备阶段 在正式开始在前需要先准备好做爬虫的工具,本例使用chrome无头浏览器进行爬取 ...

  2. Selenium基础知识 自动登录QQ空间

    Selenium基础知识 自动登录QQ空间 from selenium import webdriver import timedef auto_login():driver = webdriver. ...

  3. Python使用Pyautogui和Selenium操作QQ空间进行纯自动点赞

    有的时候在看QQ空间的时候,总想着把别人的赞全部点一遍,这样子自己看得舒坦,别人也会觉得你会关注着他,但是我们该怎样做一个点赞程序呢,这是一个很重要的问题. 文章目录 制作准备 selenium的安装 ...

  4. python+selenium自动登录qq空间并下载相册

    基于selenium的自动登录qq空间并遍历所有相册及相片的功能.只能访问自己或好友(有访问权限)的相册,好友有密码的相册不可能...这里只是介绍流程,所以只是实现了遍历,并未实现图片文件的下载保存. ...

  5. python模拟qq空间登录_python selenium模拟登录163邮箱和QQ空间

    最近在看python网络爬虫,于是我想自己写一个邮箱和QQ空间的自动登录的小程序, 下面以登录163邮箱和QQ空间和为例: 了解到在Web应用中经常会遇到frame/iframe 表单嵌套页面的应用, ...

  6. selenium模拟登录豆瓣和qq空间

    selenium模拟登录豆瓣和qq空间 今天又重新学习了下selenium,模拟登录豆瓣,发现设置等待时间真的是很重要的一步,不然一直报错:selenium.common.exceptions.NoS ...

  7. 基于selenium的QQ空间自动点赞功能(2020年7月版)

    准备工作 简介: selenium是一个基于java开发的自动化浏览器处理器,它更像是浏览器驱动的代理. 配置: 它本身没有配置浏览器,因此需要配合本机上面安装的浏览器驱动一同使用.例如:Firefo ...

  8. Selenium学习——QQ空间点赞好友说说

    项目要求,给自己空间所有好友发的说说点赞&给单个好友所有说说点赞 遇到的问题: 问题一:只能获取头几条说说,其他获取不到原因:"feed_page_container"这个 ...

  9. 利用selenium库实现QQ空间点赞

    废话不多说,直接上干活 from selenium import webdriver import time from selenium.webdriver.common.action_chains ...

最新文章

  1. my-innodb-heavy-4G.cnf配置文件注解
  2. 台大李宏毅教授的神经网络教程
  3. 报表查询——自动刷新数据,双击明细打开关联作业
  4. 牛客题霸 转圈打印矩阵 C++题解/答案
  5. Python工作笔记005---旧式字符串格式化_%5.3f的含义
  6. SVN报错 could not connect to server
  7. Docker教程小白实操入门(7)--基于Commit定制镜像
  8. java数组函数_Java数组
  9. secureCRT快捷粘贴操作
  10. python迭代对象是什么意思_python的迭代对象
  11. (转载)计算机视觉当中的专业英语
  12. 有哪些有意思的,很 cool 的开源 C++ 项目 ?
  13. Linux网络配置后无法正常上网
  14. y空间下载_阿里云网盘来啦!大咖手把手教你如何搭建免费quot;5G极速下载”私人网盘...
  15. 直播预告 | 12位一作华人学者开启 ICLR 2022
  16. 关于城市旅游的HTML网页设计 HTML+CSS上海博物馆网站 dreamweaver作业静态HTML网页设计 html网页制作期末大作业
  17. 计量经济学学习笔记:简单线性模型
  18. 机器人瓦力材质库下载_机器人总动员/瓦力[BD中英双字1024/1280高清版]
  19. 引导图滤波(Guided Image Filtering)原理以及OpenCV实现
  20. 数学与生活 (远山启 著)

热门文章

  1. ajax 服务路由,Angular自定义服务路由
  2. 当彗星划过天空,那好像梦幻一般的景色,真是无与伦比,美到极致,只能让人一味眺望着那无法言喻的美。
  3. 清理异常值(MAD:绝对中位差)
  4. 基金亏损84万,小灰反手把银行客户经理投诉了
  5. 2018 NOIP 提高组 复赛 day1
  6. 活体检测的几种手段分析
  7. 水星路由服务器无信号,水星路由器MW326R没有WiFi信号了怎么回事?【图解】
  8. python练习题——文件的打开、读取、复写
  9. 目标检测+图像分割项目
  10. 使用uniapp做微信小程序,在小程序编辑器运行时编译报错:appid不合法,导致启用不了。