准备:

1、intellij idea
2、python
3、selenium
4、phantomJs

1、分析Qzone Html页面

打开手机版qzone https://mobile.qzone.qq.com

动态爬虫之手机版QQ空间登录

按照上面流程复制账号、密码和登录按钮的的XPath粘贴到记事本中

2、超链

1、构建浏览器并且设置请求头
2、开始请求
3、模仿用户输入
4、输入验证码
5、自动登录
6、完整代码

3、编写爬虫代码

首先创建一个浏览器对象和设置请求头

# 导入驱动包
from selenium import webdriver
from selenium.webdriver import DesiredCapabilities
class qzone_dlewares(object):# 浏览器请求头headers = {'Accept': '*/*','Accept-Language': 'en-US,en;q=0.8','Cache-Control': 'max-age=0','User-Agent': 'Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255','Connection': 'keep-alive', }#初始化浏览器def __init__(self,userName='' ,password = '', *args, **kwargs):self.userName = userNameself.password = passworddesired_capabilities = DesiredCapabilities.PHANTOMJS.copy()for key, value in self.headers.items():desired_capabilities['phantomjs.page.customHeaders.{}'.format(key)] = valueself.driver = webdriver.PhantomJS(desired_capabilities=desired_capabilities)# 设置屏幕大小self.driver.set_window_size(414, 736)

开始请求 截图

def startQzoneRequest(self):#开始请求qzoneself.driver.get('https://mobile.qzone.qq.com')#截图保存到当前项目下self.driver.save_screenshot('screenshot.png')

截图成功会在 project 下面生成screenshot.png

模仿用户输入 登录关键性代码

import time
from selenium.webdriver import ActionChainsdef loginQzone(self):u = self.driver.find_element_by_xpath('//*[@id="u"]')p = self.driver.find_element_by_xpath('//*[@id="p"]')go = self.driver.find_element_by_xpath('//*[@id="go"]')# 移动到账号框模仿键盘输入账号action = ActionChains(self.driver)action.move_to_element(u)action.click(u)# 模仿键盘输入账号action.send_keys(self.userName)# 移动到密码输入框action.move_to_element(p)action.click(p)# 模仿键盘输入密码action.send_keys(self.password)# 点击登录action.move_by_offset(go.location['x'], go.location['y'])action.click(go)# 执行登录action.perform()# 休息1秒保证能执行time.sleep(1)# 截图保存到当前项目下self.driver.save_screenshot('screenshotLoginQzone.png')

登录代码就写完了现在开始写个测试代码


if __name__ == '__main__':# 事先输入账号和密码userName = input("账号:")password = input("密码:")oldTime = time.time()browser = qzone_dlewares(userName=userName, password=password)initTime = time.time()# 打开浏览器并且截图browser.startQzoneRequest()requestTime = time.time()# 模仿用户登录browser.loginQzone()currentTime = time.time()print('开始时间 %f' % oldTime)print('结束时间 %f' % currentTime)print('初始化时间 %f' % (initTime - oldTime))print('加载页面时间 %f'%(requestTime - initTime))print('模仿操作时间 %f' %(currentTime - requestTime))print('总运行时间 %f' % (currentTime - oldTime))

运行测试结果

运行几遍后发现每次都要登录一遍,然后腾讯验证码也出来了。。。
先把验证码这块给处理了

按照开始寻找图片的方法把验证码图片、验证码输入框、按钮找出来

from selenium.webdriver import ActionChains
def check_code(self):que_code = self.driver.find_element_by_xpath('//*[@id="cap_que_img"]')que_input = self.driver.find_element_by_xpath('//*[@id="cap_input"]')que_but = self.driver.find_element_by_xpath('//*[@id="verify_btn"]')#保存验证码self.save_verify_code(que_code)#输入验证码input_verify_code = input("验证码:")#模仿用户输入action = ActionChains(self.driver)action.move_to_element(que_input)action.click()action.send_keys(input())action.move_to_element(que_but)action.click()#执行action.perform()

保存验证码

import urllib
def save_verify_code(self,element):url = element.get_attribute('src')fileName = element.get_attribute('id') + '.jpg'urllib.request.urlretrieve(url, fileName)

运行测试,发现以下错误

Traceback (most recent call last):File “C:/Users/user/IdeaProjects/untitled/untitled/qzone.py”, line 108, in browser.check_code2()File “C:/Users/user/IdeaProjects/untitled/untitled/qzone.py”, line 67, in check_code2que_code = self.driver.find_element_by_xpath(‘//[@id=”cap_que_img”]’)File “D:\python\lib\site-packages\selenium\webdriver\remote\webdriver.py”, line 313, in find_element_by_xpathreturn self.find_element(by=By.XPATH, value=xpath)File “D:\python\lib\site-packages\selenium\webdriver\remote\webdriver.py”, line 791, in find_element’value’: value})[‘value’]File “D:\python\lib\site-packages\selenium\webdriver\remote\webdriver.py”, line 256, in executeself.error_handler.check_response(response)File “D:\python\lib\site-packages\selenium\webdriver\remote\errorhandler.py”, line 194, in check_responseraise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: {“errorMessage”:”Unable to find element with xpath ‘//[@id=\”cap_que_img\”]’”,”request”:{“headers”:{“Accept”:”application/json”,”Accept-Encoding”:”identity”,”Connection”:”close”,”Content-Length”:”108”,”Content-Type”:”application/json;charset=UTF-8”,”Host”:”127.0.0.1:53613”,”User-Agent”:”Python http auth”},”httpVersion”:”1.1”,”method”:”POST”,”post”:”{\”using\”: \”xpath\”, \”value\”: \”//*[@id=\\”cap_que_img\\”]\”, \”sessionId\”: \”737e6b90-6929-11e7-8958-3b746283f061\”}”,”url”:”/element”,”urlParsed”:{“anchor”:””,”query”:””,”file”:”element”,”directory”:”/“,”path”:”/element”,”relative”:”/element”,”port”:””,”host”:””,”password”:””,”user”:””,”userInfo”:””,”authority”:””,”protocol”:””,”source”:”/element”,”queryKey”:{},”chunks”:[“element”]},”urlOriginal”:”/session/737e6b90-6929-11e7-8958-3b746283f061/element”}}
Screenshot: available via screen

说没有找到这个节点,后来分析源码发现他是包在 iframe 中的 既然包在里面了那我们切换窗口好了

# 校验码
from selenium.common.exceptions import NoSuchElementException
def check_code(self):# 先切换到默认的窗口self.driver.switch_to.default_content()iframe = Nonetry:# 验证码iframe = self.driver.find_element_by_xpath('//*[@id="new_vcode"]/iframe[2]')except NoSuchElementException:print('无需输入验证码')else:self.driver.switch_to.frame(iframe)self.verify_code()

手动输入验证码,暂时还不能自动输入验证码 并且也不能验证验证码是否错误或者切换

# 验证码
def verify_code(self):que_code = self.driver.find_element_by_xpath('//*[@id="cap_que_img"]')que_input = self.driver.find_element_by_xpath('//*[@id="cap_input"]')que_but = self.driver.find_element_by_xpath('//*[@id="verify_btn"]')# 保存验证码self.save_verify_code(que_code)verify_path = que_code.get_attribute('id') + '.jpg'# 输入验证码if (self.isWindows()):os.startfile(verify_path)else:os.subprocess.call(["xdg-open", verify_path])input_verify_code = input("验证码:")# 模仿用户输入action = ActionChains(self.driver)action.move_to_element(que_input)action.click()action.send_keys(input_verify_code)action.move_to_element(que_but)action.click()# 执行action.perform()

完美运行登录成功

每次运行都需要手动登录太麻烦了 qzone 保存cookies 好像可以不需要手动登录了

# 保存登录 cookiesdef save_cookies(self):with open(self.hashCode(), 'wb') as f:obj = self.driver.get_cookies()pickle.dump(obj, f)f.close()# 读取并设置 cookiesdef load_cookies(self):fileName = self.hashCode()# 判断文件是否存在if self.file_exists(fileName):f = open(fileName, 'rb')obj = pickle.load(file=f)f.close()# 循环设置 cookietry:for cookie in obj:self.driver.add_cookie(cookie)except Exception as e:print(e)# hasCodedef hashCode(self):sha = sha1()sha.update(b'qzone_cookies')return sha.hexdigest()# 判断文件是否存在def file_exists(self, filename):try:with open(filename) as f:return Trueexcept IOError:return False

测试代码

if __name__ == '__main__':# 事先输入账号和密码userName = input("账号:")password = input("密码:")oldTime = time.time()browser = qzone_dlewares(userName=userName, password=password)# 加载cookiesbrowser.load_cookies()initTime = time.time()# 打开浏览器并且截图browser.startQzoneRequest()requestTime = time.time()# 判断是否登录if (not browser.isLogin()):# 模仿用户登录browser.loginQzone()# 检查codebrowser.check_code()currentTime = time.time()# 解析动态browser.paresHtml()# 运行完成后再截图一次browser.driver.save_screenshot('screenshotLoginQzoneSuccess.png')# 保存cookiesbrowser.save_cookies()print('开始时间 %f' % oldTime)print('结束时间 %f' % currentTime)print('初始化时间 %f' % (initTime - oldTime))print('加载页面时间 %f' % (requestTime - initTime))print('模仿操作时间 %f' % (currentTime - requestTime))print('总运行时间 %f' % (currentTime - oldTime))

QZONE 登录自动登录完整代码

import json
import os
import pickle
import platform
import time
import urllib
from _sha1 import sha1
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import DesiredCapabilities, ActionChains
class qzone_dlewares(object):# 浏览器请求头headers = {'Accept': '*/*','Accept-Language': 'en-US,en;q=0.8','Cache-Control': 'max-age=0','User-Agent': 'Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255','Connection': 'keep-alive', }# 初始化浏览器def __init__(self, userName='', password='', *args, **kwargs):self.userName = userNameself.password = passworddesired_capabilities = DesiredCapabilities.PHANTOMJS.copy()for key, value in self.headers.items():desired_capabilities['phantomjs.page.customHeaders.{}'.format(key)] = value# 禁止加载图片desired_capabilities["phantomjs.page.settings.loadImages"] = Falseself.driver = webdriver.PhantomJS(desired_capabilities=desired_capabilities)# 设置屏幕大小self.driver.set_window_size(414, 736)# 开始请求并且截图def startQzoneRequest(self):# 开始请求qzoneself.driver.get('https://mobile.qzone.qq.com')# 截图保存到当前项目下self.driver.save_screenshot('screenshot.png')# 判断是否登录了def isLogin(self):try:u = self.driver.find_element_by_xpath('//*[@id="u"]')p = self.driver.find_element_by_xpath('//*[@id="p"]')go = self.driver.find_element_by_xpath('//*[@id="go"]')except NoSuchElementException:return Truereturn Falsedef loginQzone(self):u = self.driver.find_element_by_xpath('//*[@id="u"]')p = self.driver.find_element_by_xpath('//*[@id="p"]')go = self.driver.find_element_by_xpath('//*[@id="go"]')# 清理账号和密码u.clear()p.click()# 移动到账号框模仿键盘输入账号action = ActionChains(self.driver)action.move_to_element(u)action.click(u)# 模仿键盘输入账号action.send_keys(self.userName)# 移动到密码输入框action.move_to_element(p)action.click(p)# 模仿键盘输入密码action.send_keys(self.password)# 点击登录action.move_by_offset(go.location['x'], go.location['y'])action.click(go)# 执行登录action.perform()# 休息1秒保证能执行time.sleep(1)# 截图保存到当前项目下self.driver.save_screenshot('screenshotLoginQzone.png')def save_verify_code(self, element):url = element.get_attribute('src')fileName = element.get_attribute('id') + '.jpg'urllib.request.urlretrieve(url, fileName)# 校验码def check_code(self):# 先切换到默认的窗口self.driver.switch_to.default_content()iframe = Nonetry:# 验证码iframe = self.driver.find_element_by_xpath('//*[@id="new_vcode"]/iframe[2]')except NoSuchElementException:print('无需输入验证码')else:self.driver.switch_to.frame(iframe)self.verify_code()# 验证码def verify_code(self):que_code = self.driver.find_element_by_xpath('//*[@id="cap_que_img"]')que_input = self.driver.find_element_by_xpath('//*[@id="cap_input"]')que_but = self.driver.find_element_by_xpath('//*[@id="verify_btn"]')# 保存验证码self.save_verify_code(que_code)verify_path = que_code.get_attribute('id') + '.jpg'# 输入验证码if (self.isWindows()):os.startfile(verify_path)else:os.subprocess.call(["xdg-open", verify_path])input_verify_code = input("验证码:")# 模仿用户输入action = ActionChains(self.driver)action.move_to_element(que_input)action.click()action.send_keys(input_verify_code)action.move_to_element(que_but)action.click()# 执行action.perform()# 解析动态def paresHtml(self):pass# 是 windows 系统def isWindows(self):sysstr = platform.system()if (sysstr == "Windows"):return Truereturn False# 保存登录 cookiesdef save_cookies(self):with open(self.hashCode(), 'wb') as f:obj = self.driver.get_cookies()pickle.dump(obj, f)f.close()# 读取并设置 cookiesdef load_cookies(self):fileName = self.hashCode()# 判断文件是否存在if self.file_exists(fileName):f = open(fileName, 'rb')obj = pickle.load(file=f)f.close()# 循环设置 cookietry:for cookie in obj:self.driver.add_cookie(cookie)except Exception as e:print(e)# hasCodedef hashCode(self):sha = sha1()sha.update(b'qzone_cookies')return sha.hexdigest()# 判断文件是否存在def file_exists(self, filename):try:with open(filename) as f:return Trueexcept IOError:return False# 退出浏览器def __del__(self):self.driver.quit()
if __name__ == '__main__':# 事先输入账号和密码userName = input("账号:")# password = input("密码:")# oldTime = time.time()browser = qzone_dlewares(userName=userName, password=password)# 加载cookiesbrowser.load_cookies()initTime = time.time()# 打开浏览器并且截图browser.startQzoneRequest()requestTime = time.time()# 判断是否登录if (not browser.isLogin()):# 模仿用户登录browser.loginQzone()# 检查codebrowser.check_code()currentTime = time.time()# 解析动态browser.paresHtml()# 运行完成后再截图一次browser.driver.save_screenshot('screenshotLoginQzoneSuccess.png')# 保存cookiesbrowser.save_cookies()print('开始时间 %f' % oldTime)print('结束时间 %f' % currentTime)print('初始化时间 %f' % (initTime - oldTime))print('加载页面时间 %f' % (requestTime - initTime))print('模仿操作时间 %f' % (currentTime - requestTime))print('总运行时间 %f' % (currentTime - oldTime))

总结

1、QQ空间登录其实可用使用js来模仿用户操作直接输入代码量也很少
2、然后这边也有一个写入cookies 的bug因为作用域不对会报错

我只是一只小菜鸟,如果你看到代码有错误的地方请提出来。对qq好友获取感兴趣的可以看看:qq好友列表获取

动态爬虫之手机版QQ空间登录相关推荐

  1. ios 仿电脑qq登录界面_iOS开发UI篇—模仿ipad版QQ空间登录界面

    iOS开发UI篇-模仿ipad版QQ空间登录界面 一.实现和步骤 1.一般ipad项目在命名的时候可以加一个HD,标明为高清版 2.设置项目的文件结构,分为home和login两个部分 3.登陆界面的 ...

  2. 高仿精仿手机版QQ空间应用源码

    说明:本次QQ空间更新了以前非常基础的代码 更新内容 一 更新了登陆界面 二  增加了输入时密码时和登陆成功后播放音频的效果 三 增加了导航条渐隐的效果(和真实QQ空间的导航条一样,首先透明,当tab ...

  3. iOS开发UI篇—模仿ipad版QQ空间登录界面

    一.实现和步骤 1.一般ipad项目在命名的时候可以加一个HD,标明为高清版 2.设置项目的文件结构,分为home和login两个部分 3.登陆界面的设置 (1)设置第一个控制器和自定义的控制器类(登 ...

  4. ios 仿电脑qq登录界面_iOS开发UI篇—模仿ipad版QQ空间登录界面-阿里云开发者社区...

    一.实现和步骤 1.一般ipad项目在命名的时候可以加一个HD,标明为高清版 2.设置项目的文件结构,分为home和login两个部分 3.登陆界面的设置 (1)设置第一个控制器和自定义的控制器类(登 ...

  5. Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据流程分析【转】

    Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析 QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:http ...

  6. 电脑版和手机版QQ都要手机版QQ扫描二维码登录?

    是的,电脑版和手机版 QQ 都需要使用手机版 QQ 扫描二维码登录.这是因为扫描二维码登录是 QQ 的安全认证方式之一.

  7. selenium进行QQ空间登录

    一.selenium简要说明 selenium是基于浏览器自动化的一个模块,它能便捷的获取网站中动态加载的数据,和实现模拟登录.爬虫等操作 二.实现流程 2.1 selenium前置操作 1. 安装s ...

  8. python爬取网页版QQ空间,生成词云图、柱状图、折线图(附源码)

    python爬取网页版QQ空间,生成词云图.柱状图.折线图 最近python课程学完了,琢磨着用python点什么东西,经过一番搜索,盯上了QQ空间,拿走不谢,欢迎点赞收藏,记得github给个sta ...

  9. 仿QQ空间登录,解决键盘挡住输入框的问题

    我们在开发Android应用中,登录和注册界面是少不了的,往往在做登录注册的时候如果给界面加一个LOGO,就有可能把用户名和密码框放在手机屏幕的中间或底部,这样当软键盘弹出的时候,就有可能挡住输入框( ...

  10. python模拟qq空间登录_模拟登录系列 | QQ空间模拟登录

    原文链接模拟登录系列 | QQ空间模拟登录​mp.weixin.qq.com 本系列所有代码均在这CharlesPikachu/DecryptLogin​github.com 原理简介 这里,我们简单 ...

最新文章

  1. python 重定向 ctf_3.CTF——python利用工具
  2. html表单与python交互,HTML表单不能与python一起使用
  3. Java并发编程-线程的状态
  4. dnf时装预览怎么打开_DNF最疯狂的年代,纯色天空整套白给,“神话”宠物不卖只送...
  5. 算法第五章上机实践报告
  6. 将byte数组转换成十进制字符串输出_outputStream与InputStream使用只能传输字节byte...
  7. python 安装win32com_python调用win32com.client时提示:No module named win32com.client
  8. Flash动画制作实例教程
  9. 关灯游戏 Lights out (二)(首行枚举+位运算,搜索全部解)
  10. ✿2020医疗行业CTF✿多余的音符
  11. java jbutton方法_java-如何设置JButton的大小?
  12. 怎么利用企业微信营销 企业微信如何营销 企业微信如何维护好友 企业微信如何开通
  13. 你可能修了一个假的“不净观”
  14. 科技云报道:“Sky Computing”会是云计算未来的新方向吗?
  15. Leech for mac(轻量级mac下载工具)
  16. 神经网络训练样本的标签,训练图像识别神经网络
  17. Unreal Engine蓝图编程学习(四)
  18. java多线程之Single Threaded Execution模式
  19. 研发管理01:项目管理(PM) 与 Scrum Master (SM)
  20. 罗克韦尔自动化发布2019年企业责任报告,并启动新的企业责任与可持续发展在线内容中心

热门文章

  1. 古今地名对照总表!(按笔划数排序,强烈推荐的资料)
  2. Android App设计规范
  3. 萤石云谷歌禁用flash_mac chrome屏蔽flash插件怎么办 mac chrome flash启用方法
  4. java get与post区别_POST和GET区别
  5. Pygame教程系列二:MoviePy视频播放篇
  6. 【信号与系统】复习总结笔记
  7. 408 操作系统 知识点总结
  8. docker 批量关闭处于exited状态的container容器--shell工具
  9. 微信小程序使用weui设计界面
  10. volatile详解