该文章仅用于技术讨论,若有侵权,联系作者删除。

目标是输入一个IP地址后,获取查IP网(http://chaipip.com/ip.php)的查询结果。正常使用我们发现——流程是输入IP地址——进行滑动验证码验证后查询——跳转一个新的窗口——获取新窗口的查询结果。

我们先来看一下最后的流程和结果。

selenium模拟流程

查询结果

接下来,我们就一步一步讨论如何解决。

一、输入IP地址

第一步时清除输入框中的IP地址,然后输入要查询的地址。并点击验证码按钮,出现滑动式验证码以便进行下一步操作。

#输入数据
def input_message():browser.get(url) ip_put = wait.until(EC.presence_of_element_located((By.ID, 'ip')))ip_put.clear()ip_put.send_keys(ip)click_btn=wait.until(EC.presence_of_element_located((By.ID,'embed-captcha'))) #随机延时点击time.sleep(random.random()*3)click_btn.click()

二、进行滑动验证码验证

此处的思路是将滑动验证码的完整图片、有缺口的图片和缺口图片截取出来,通过比对后发现需要移动的距离后,用selenium模拟用户拖动。

#设置元素的可见性用于截图
def show_element(element):browser.execute_script("arguments[0].style = arguments[1]", element, "display: block;")
def hide_element(element):browser.execute_script("arguments[0].style = arguments[1]", element, "display: none;")#截图
def save_pic(obj, name):try:pic_url = browser.save_screenshot('.\\ipaddress.png')#开始获取元素位置信息left = obj.location['x']top = obj.location['y']right = left + obj.size['width']bottom = top + obj.size['height']im = Image.open('.\\ipaddress.png')im = im.crop((left, top, right, bottom))file_name = 'ipaddress_' + name + '.png'im.save(file_name)except BaseException as msg:print("截图失败:%s" % msg)def cut():c_background = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'canvas.geetest_canvas_bg.geetest_absolute')))c_slice = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'canvas.geetest_canvas_slice.geetest_absolute')))c_full_bg = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'canvas.geetest_canvas_fullbg.geetest_fade.geetest_absolute')))hide_element(c_slice)save_pic(c_background, 'back')show_element(c_slice)save_pic(c_slice, 'slice')show_element(c_full_bg)save_pic(c_full_bg, 'full')#判断元素是否相同
def is_pixel_equal(bg_image, fullbg_image, x, y):#bg_image是缺口的图片#fullbg_image是完整图片bg_pixel = bg_image.load()[x, y]fullbg_pixel = fullbg_image.load()[x, y]threshold = 60if (abs(bg_pixel[0] - fullbg_pixel[0] < threshold) and abs(bg_pixel[1] - fullbg_pixel[1] < threshold) and abs(bg_pixel[2] - fullbg_pixel[2] < threshold)):return Trueelse:return False#计算滑块移动的距离
def get_distance(bg_image, fullbg_image):distance = 57for i in range(distance, fullbg_image.size[0]):for j in range(fullbg_image.size[1]):if not is_pixel_equal(fullbg_image, bg_image, i, j):return i#构造滑动轨迹
def get_trace(distance):#distance是缺口离滑块的距离trace = []faster_distance = distance*(4/5)start, v0, t = 0, 0, 0.3while start < distance:if start < faster_distance:a = 1.5else:a = -3move = v0 * t + 1 / 2 * a * t * tv = v0 + a * tv0 = vstart += movetrace.append(round(move))return trace#模拟拖动
def move_to_gap(trace):slider=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'div.geetest_slider_button')))# 使用click_and_hold()方法悬停在滑块上,perform()方法用于执行ActionChains(browser).click_and_hold(slider).perform()for x in trace:# 使用move_by_offset()方法拖动滑块,perform()方法用于执行ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform()time.sleep(0.5)ActionChains(browser).release().perform()def slide():distance=get_distance(Image.open('.\\ipaddress_back.png'),Image.open('.\\ipaddress_full.png'))trace = get_trace(distance-5)move_to_gap(trace)time.sleep(1)

三、查询

此处就直接获取查询按钮的id,然后用click方法进行模拟点击操作。

#登录
def login():login_btn=wait.until(EC.presence_of_element_located((By.ID,'embed-submit')))#passwd.send_keys(Keys.ENTER)login_btn.click()

四、跳转至新的窗口,并获取查询结果

首先要做的是窗口跳转了,要将selenium操作的页面定位到新窗口。此处用到的是句柄,每个窗口都要自己的句柄,通过获取所有句柄后,判断并转入新窗口进行操作。其次就是获取IP地址的查询结果,由于详细信息需要点击查看周围的按钮,所以我们先模拟点击后,再获取相应的值。

#获取登录后的信息
def get_id_messgae():n = browser.window_handles # 获取当前页句柄browser.switch_to.window (n[1]) # 切换到新的网页窗口details_btn=wait.until(EC.presence_of_element_located((By.ID,'btn1')))details_btn.click()time.sleep(1)message = browser.find_element_by_id("Fu3lC").textmessage = message.split('\n')message_latitude = message[4]message_longitude = message[5]message_content = message[6]message_details = browser.find_element_by_id("location_description").text#print(message)print(message_latitude)print(message_longitude)print(message_content)print(message_details)

到此处,整个功能就已经完成了。但是由于该网址对于同一个用户ID每天只能查20个IP地址,所以想通过这个办法进行大规模数据查询是不可能的。由于使用selenium网页的加载速度本来就慢,再使用代理IP的话只会更慢。这也是一个弊端,目前笔者还没有很好的解决办法。

Python爬虫实例:爬取“查IPIP”查询结果,查询IP地址归属地相关推荐

  1. AJAX教程美食滤镜,Python爬虫实例——爬取美团美食数据

    1.分析美团美食网页的url参数构成 1)搜索要点 美团美食,地址:北京,搜索关键词:火锅 2)爬取的url https://bj.meituan.com/s/%E7%81%AB%E9%94%85/ ...

  2. Python爬虫实例-爬取豆瓣电影Top250

    这是本人Python爬虫实例的第二个实例,不过想来好像没有很大的难度所以适合当做新手入门的第一个爬虫.放在这里供大家参考. 本次实例爬取的网站为豆瓣电影Top250,使用到的第三方库有urllib,B ...

  3. Python 爬虫实例+爬取豆瓣小组 + wordcloud 制作词云图

    目标 利用PYTHON爬取如下图中所有回答的内容,并且制作词云图. 用到的库 import requests # import jsonfrom PIL import Image from pyque ...

  4. (转)python爬虫实例——爬取智联招聘信息

    受友人所托,写了一个爬取智联招聘信息的爬虫,与大家分享. 本文将介绍如何实现该爬虫. 目录 网页分析 实现代码分析 结果 总结 github代码地址 网页分析 以https://xiaoyuan.zh ...

  5. python爬虫实例——爬取智联招聘信息

    受友人所托,写了一个爬取智联招聘信息的爬虫,与大家分享. 本文将介绍如何实现该爬虫. 目录 网页分析 实现代码分析 结果 总结 github代码地址 网页分析 以https://xiaoyuan.zh ...

  6. python爬虫实例--爬取电脑壁纸

    目录 前言 一.用到的工具 二.爬取步骤与过程 1.用到的库 2.解析代码 三.最后上全部的代码啦 最后感悟 前言 听说好的编程习惯是从写文章敲代码开始的,下面给大家介绍一个简单的python爬取图片 ...

  7. 爬虫python 新闻,Python爬虫实例--爬取人民网新闻

    其实我只是因为在那边评论区想评论,然后发现位置不够,所以才打算写这个博客的,然后具体的可以看我转载的文章,很详细,我这边只说一下关于txt转换为JSON格式的问题 第一次写,格式可能很乱,见谅一下 话 ...

  8. python爬虫实例--爬取拉勾网

    代码实例 # -*-.coding: utf-8 -*- # __author__ = 'xiaobai' # Email: 517840374@qq.com import time import r ...

  9. 【Python】爬虫实例——爬取新闻并实现语音播报

    [Python]爬虫实例--爬取新闻并实现语音播报 本文涉及: 1.爬虫请求链接 2.文字转语音(TTS语音合成技术) 安装: pip install pyttsx3 pip install requ ...

  10. python爬取b站视频封面_学习笔记(4)[Python爬虫]:爬取B站搜索界面的所有视频的封面...

    学习笔记(4)[Python爬虫]:爬取B站搜索界面的所有视频的封面 import os import requests import re import json from bs4 import B ...

最新文章

  1. SDUT_2119 数据结构实验之链表四:有序链表的归并
  2. 析构函数与构造函数的调用
  3. Cocos2d-x 3.2 EventDispatcher事件分发机制
  4. 【WXS】简要介绍说明
  5. Java中,为什么子类的构造方法中必须调父类的构造方法?
  6. 为什么实施的项目会失败??
  7. 神马是敏捷?(3)——敏捷在中国的水土不服
  8. java se用哪个eclipse_javaSE----eclipse的安装与使用
  9. Jmeter测试计划无法保存或者另存为
  10. VC6.0和VC2005项目配置详解
  11. Mobile开发之meta篇
  12. 【微软商店(Microsoft Store)重置后打不开,商店下载不了应用的解决方法】
  13. 独家百度刷权重全套代码工具教程
  14. 快递分拣程序 python_顺丰快递分拣程序
  15. Windows服务器无法配置IP
  16. 跳槽面试时不能说的六大离职理由
  17. 影视短视频剪辑的完整操作流程(普通人也能学会)
  18. 微策略2017年秋招线下笔试+技术面+在线测评+主管面总结
  19. RecyclerView详解一,使用及缓存机制
  20. 【python数据分析实战】城市餐饮店铺选址问题(1)—— 对不同菜系进行比较,并筛选出可开店铺的餐饮类型

热门文章

  1. PDF Expert for mac(最好用的pdf编辑工具)
  2. 整理一些除了Google Adsense以外比较适合英文站的国外广告联盟
  3. Python 自动化测试 必会模块 Unittest
  4. 基于Python网易云音乐歌词爬取
  5. 学习周记 CSS合集
  6. idea报错cannot access com.*.*
  7. mysqld: [ERROR] Found option without preceding group in config file my.ini at line 1
  8. 微信测试公众号推送信息给女朋友(node版本)
  9. 票务网 php,电影票务网站的设计与制作
  10. 有限状态机代码生成器 FsmCrater