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

终于还是忍不住对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. VS2010 CUDA 5.5 Win7 64位配置以及项目创建配置
  2. CountDownLatch 的 .await() 的线程阻塞 和countDown() 计时唤醒
  3. float 属性详解
  4. castle windsor学习-----XML Inline Parameters 内联参数
  5. racle的STRUCT和VARRAY的读写方法
  6. epoll背后的原理
  7. Nginx URL重写(rewrite)配置及信息详解
  8. 【动态规划】公共子串
  9. 【渝粤教育】国家开放大学2018年春季 0699-21T阅读与写作 参考试题
  10. 学习笔记_jquery(js)遍历页面标签
  11. 了解使用JavaScript进行面向对象编程的基础(并增强您的编码…
  12. 将 EndNote 文献信息导出成 BibTeX 格式(可根据label排序)以及出现三个问号
  13. .Net下RabbitMQ的使用(4) -- 订阅和发布
  14. visio2010画图
  15. 程序员租房福利! 最新 2018年上海公积金提取 租房提取
  16. SN74LVC1G08DBVR
  17. Service Mesh的未来将与Knative和Apahce Whisk等技术和谐共存——采访RedHat的Istio产品经理...
  18. c语言错误c2198,这段哪里错了。。。
  19. Grafana变量介绍
  20. PhoneGap简介

热门文章

  1. 学习k-近邻算法简单易懂
  2. 打开Visual Studio Community 2017 报出“许可证已过期”
  3. mongorepository查询条件_springboot jpa + mongodb实现多条件查询数据
  4. 如何有效开展小组教学_如何有效开展小组合作学习活动
  5. dpkg: 处理软件包 xxxxxxxx (–configure)时出错:
  6. 【阅读笔记】低照度图像增强-《Fast efficient algorithm for enhancement of low lighting video》
  7. 美颜滤镜SDK有什么效果?美颜SDK可以自主开发吗?
  8. 道一云与畅捷通T+对接集成获取报销信息列表=>凭证创建
  9. lol全队消息怎么发_lol怎么发给所有人 LOL里面怎么给所有人发送消息
  10. 2021-03-26