前几天老妈叫我帮她选个好点的百度圣卡号码,突然想起了最近学的python爬虫正好练练手。最开始用urllib爬,post提交参数想直接取到返回的号码数据,可无奈,不知道是自己能力还不够还是电信反爬虫机制做的好。post数据后返回的提示总是

"message":"请求参数为空或者请求参数不符合JSON格式或者没有公共请求参数或者页面请求参数没有接口名称字段或者页面请求参数没有业务参数请求节点或者页面请求接口没有配置"

尝试了一天之后索性放弃。然后便想起了Selenium来模拟点击获取号码。

下面是实现方法(功能比较简单,很多细节也还没完善好)

准备阶段工具:

1.Python

2.Selenium

3.Chrome浏览器

实现思路:

1.寻找页面省份地区等元素并点击

2.找到返回到html页面的手机号码并读取

3.用正则筛选出靓号并保存

步骤一:获取页面元素

百度圣卡申请URL地址:

https://lmk.189.cn:9093/baiducard/baiducard_detail.html?ct=0&shopid=lmk.cps.jtyzk1wxgzh&cmpid=jt-yzk1-wxgzh&type=1&channel=wxgzh

F12查看页面元素可以看到省份选择框在ID为"dk_container_baiducardDetail_provinceSelec"的Div下并且省份名字与代码在li里,以"福建省"为例可以看到福建省的代码为60015

同样的我们可以其他所需元素位置。

需找到页面元素汇总如下:

省份选择框ID:   dk_container_baiducardDetail_provinceSelect

省份代码(以福建省为例):  60015

地区选择框ID:  dk_container_baiducardDetail_citySelect

地区代码(以厦门市为例):  8350200

号码显示按钮ID:  baiducardDetail_showSelectNum

号码显示详情窗口Class:  baiducardDetail_phoneNum

换一批号码按钮Class:  baiducardDetail_changeBtn

号码搜索框Class:  baiducardDetail_search_input

步骤二:Python+Selenium自动化操作

1.省份地区配置:

#数据配置------------------------------------------
prnum='600105'  #省份代码(可以去网站html中ID为'dk_container_baiducardDetail_provinceSelect'的Div下的li里获得)
cinum='8350200'  #地区代码(选择好省份后可以去网站html中ID为'dk_container_baiducardDetail_citySelect'的Div下的li里获得)
province='[data-dk-dropdown-value="'+prnum+'"'
city='[data-dk-dropdown-value="'+cinum+'"'

2.打开url自动选择省份以及地区并显示号码:

driver = webdriver.Chrome() #打开Chrome
driver.get("https://lmk.189.cn:9093/baiducard/baiducard_detail.html?ct=0&shopid=lmk.cps.jtyzk1wxgzh&cmpid=jt-yzk1-wxgzh&type=1&channel=wxgzh")
simulator()#调用区域选择函数#区域选择函数------------------------------------
def simulator():driver.find_element_by_id("dk_container_baiducardDetail_provinceSelect").click() #找到省份选择框time.sleep(1)driver.find_element_by_css_selector(province).click()#选择省份time.sleep(1)driver.find_element_by_id("dk_container_baiducardDetail_citySelect").click()#找到地区选择框并点击time.sleep(1)driver.find_element_by_css_selector(city).click()#选择地区time.sleep(1)driver.find_element_by_id("baiducardDetail_showSelectNum").click()#找到显示号码窗口并点击time.sleep(1)

3.爬取号码+正则筛选靓号并保存

findnumber()#调用寻找号码函数
#寻找号码函数----------------------
def findnumber():for c in range(0,99):#改变搜索数字范围(0-99)search=driver.find_element_by_class_name("baiducardDetail_search_input")#寻找输入框search.send_keys(c)#向输入框里输入需要搜索的数字count = 0while (count < 200):#搜索号码页数,默认200,可更改locator=(By.XPATH,'//*[@class="baiducardDetail_phoneNum"]/ul[@class="clerafix"]/li[1]')WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))#等待号码显示if(EC.presence_of_element_located(locator)==False):#如果等待时间已过则退出循环breaknumbertext=driver.find_element_by_class_name("baiducardDetail_phoneNum").text#读取号码number=list(set(numbertext.split('\n', 10 )))b=len(number)print(number)print(count)a=0while(a<b):regoodnumback=regoodnum(number[a])#调用靓号匹配正则函数返回靓号if(regoodnumback !="bad"):print(regoodnumback)save_to_file('goodnum.txt', regoodnumback+"\n")#调用保存靓号到文件函数a=a+1driver.find_element_by_class_name("baiducardDetail_changeBtn").click()#加载下一页(一页十个)count = count + 1search.clear()#清空输入框内容
#靓号正则匹配函数--------------------------------------
def regoodnum(number):if(re.findall(r"(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){5}\d",number)):goodnum=number+"--6位顺增"elif(re.findall(r"(?:9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){5}\d",number)):goodnum=number+"--6位顺降"elif(re.findall(r"(?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){3,}|(?:9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){3,})\d",number)):goodnum=number+"--4-9位连续的数字"elif(re.findall(r"([\d])\1{3,}",number)):goodnum=number+"--4位以上的重复数字"elif(re.findall(r"(19|20)[\d]{2}(1[0-2]|0?[1-9])(31|2[0-9]|1[0-9]|0?[0-9])",number)):goodnum=number+"--日期类型的数字"elif(re.findall(r"([\d])\1{1,}([\d])\2{2,}",number)):goodnum=number+"--33111类型的"     elif(re.findall(r"(([\d]){1,}([\d]){1,})\1{1,} ",number)):goodnum=number+"--5331533类型的"elif(re.findall(r"([\d])\1{1,}([\d])\2{1,}",number)):goodnum=number+"--22334,123355类型的"elif(re.findall(r"(\d)\1(\d)\2$",number)):goodnum=number+"--末位匹配aabb,允许aaaa"elif(re.findall(r"(\d)(\d)\1\2$",number)):goodnum=number+"--末位匹配abab,允许aaaa"elif(re.findall(r"(\d)\1\1\d$",number)):goodnum=number+"--末位匹配aaab,允许aaaa"elif(re.findall(r"^(<a>\\d)(\\d)(\\d)\\1\\2\\3$",number)):goodnum=number+"--重复号码"elif(re.findall(r"^(\\d)(\\d)(\\d)\\3\\2\\1$",number)):goodnum=number+"--镜子号码"elif(re.findall(r"^\\d*(\\d)\\1(\\d)\\2\\d*$",number)):goodnum=number+"--AABB"elif(re.findall(r"^\\d*(\\d)\\1\\1(\\d)\\2\\2\\d*$",number)):goodnum=number+"--AAABBB"elif(re.findall(r"^(\\d)(\\d)\\1\\2\\1\\2\\1\\2$",number)):goodnum=number+"--ABABAB"elif(re.findall(r"^(\\d)(\\d)(\\d)\\1\\2\\3$",number)):goodnum=number+"--ABCABC"elif(re.findall(r"^(\\d)(\\d)\\2\\1\\2\\2$",number)):goodnum=number+"--ABBABB"elif(re.findall(r"^(\\d)\\1(\\d)\\1\\1\\2$",number)):goodnum=number+"--AABAAB"elif(re.findall(r"(?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)){2,}|(?:0(?=9)|9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){2,})\\d",number)):goodnum=number+"--4位以上 位递增或者递减"else:goodnum="bad"return goodnum
#保存靓号到文件函数------------------------------------
def save_to_file(file_name, contents):fh = open(file_name, 'a')fh.write(contents)fh.close()

附上完整代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support import expected_conditions as EC
import time
import re#数据配置------------------------------------------
prnum='600105'  #省份代码(可以去网站html中ID为'dk_container_baiducardDetail_provinceSelect'的Div下的li里获得)
cinum='8350200'  #地区代码(选择好省份后可以去网站html中ID为'dk_container_baiducardDetail_citySelect'的Div下的li里获得)
province='[data-dk-dropdown-value="'+prnum+'"'
city='[data-dk-dropdown-value="'+cinum+'"'#靓号正则匹配函数--------------------------------------
def regoodnum(number):if(re.findall(r"(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){5}\d",number)):goodnum=number+"--6位顺增"elif(re.findall(r"(?:9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){5}\d",number)):goodnum=number+"--6位顺降"elif(re.findall(r"(?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){3,}|(?:9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){3,})\d",number)):goodnum=number+"--4-9位连续的数字"elif(re.findall(r"([\d])\1{3,}",number)):goodnum=number+"--4位以上的重复数字"elif(re.findall(r"(19|20)[\d]{2}(1[0-2]|0?[1-9])(31|2[0-9]|1[0-9]|0?[0-9])",number)):goodnum=number+"--日期类型的数字"elif(re.findall(r"([\d])\1{1,}([\d])\2{2,}",number)):goodnum=number+"--33111类型的"     elif(re.findall(r"(([\d]){1,}([\d]){1,})\1{1,} ",number)):goodnum=number+"--5331533类型的"elif(re.findall(r"([\d])\1{1,}([\d])\2{1,}",number)):goodnum=number+"--22334,123355类型的"elif(re.findall(r"(\d)\1(\d)\2$",number)):goodnum=number+"--末位匹配aabb,允许aaaa"elif(re.findall(r"(\d)(\d)\1\2$",number)):goodnum=number+"--末位匹配abab,允许aaaa"elif(re.findall(r"(\d)\1\1\d$",number)):goodnum=number+"--末位匹配aaab,允许aaaa"elif(re.findall(r"^(<a>\\d)(\\d)(\\d)\\1\\2\\3$",number)):goodnum=number+"--重复号码"elif(re.findall(r"^(\\d)(\\d)(\\d)\\3\\2\\1$",number)):goodnum=number+"--镜子号码"elif(re.findall(r"^\\d*(\\d)\\1(\\d)\\2\\d*$",number)):goodnum=number+"--AABB"elif(re.findall(r"^\\d*(\\d)\\1\\1(\\d)\\2\\2\\d*$",number)):goodnum=number+"--AAABBB"elif(re.findall(r"^(\\d)(\\d)\\1\\2\\1\\2\\1\\2$",number)):goodnum=number+"--ABABAB"elif(re.findall(r"^(\\d)(\\d)(\\d)\\1\\2\\3$",number)):goodnum=number+"--ABCABC"elif(re.findall(r"^(\\d)(\\d)\\2\\1\\2\\2$",number)):goodnum=number+"--ABBABB"elif(re.findall(r"^(\\d)\\1(\\d)\\1\\1\\2$",number)):goodnum=number+"--AABAAB"elif(re.findall(r"(?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)){2,}|(?:0(?=9)|9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){2,})\\d",number)):goodnum=number+"--4位以上 位递增或者递减"else:goodnum="bad"return goodnum#保存靓号到文件函数------------------------------------
def save_to_file(file_name, contents):fh = open(file_name, 'a')fh.write(contents)fh.close()#区域选择函数------------------------------------
def simulator():time.sleep(5)driver.find_element_by_id("dk_container_baiducardDetail_provinceSelect").click() #找到省份选择框time.sleep(2)driver.find_element_by_css_selector(province).click()#选择省份time.sleep(2)driver.find_element_by_id("dk_container_baiducardDetail_citySelect").click()#找到地区选择框并点击time.sleep(2)driver.find_element_by_css_selector(city).click()#选择地区time.sleep(2)driver.find_element_by_id("baiducardDetail_showSelectNum").click()#找到显示号码窗口并点击time.sleep(2)#寻找号码函数----------------------
def findnumber():for c in range(0,99):#改变搜索数字范围(0-99)search=driver.find_element_by_class_name("baiducardDetail_search_input")#寻找输入框search.send_keys(c)#向输入框里输入需要搜索的数字count = 0while (count < 200):#搜索号码页数,默认200,可更改locator=(By.XPATH,'//*[@class="baiducardDetail_phoneNum"]/ul[@class="clerafix"]/li[1]')WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator))#等待号码显示if(EC.presence_of_element_located(locator)==False):#如果等待时间已过则退出循环breaknumbertext=driver.find_element_by_class_name("baiducardDetail_phoneNum").text#读取号码number=list(set(numbertext.split('\n', 10 )))b=len(number)print(number)print(count)a=0while(a<b):regoodnumback=regoodnum(number[a])#调用靓号匹配正则函数返回靓号if(regoodnumback !="bad"):print(regoodnumback)save_to_file('goodnum.txt', regoodnumback+"\n")#调用保存靓号到文件函数a=a+1driver.find_element_by_class_name("baiducardDetail_changeBtn").click()#加载下一页(一页十个)count = count + 1search.clear()#清空输入框内容#主程序----------------------------------
driver = webdriver.Chrome() #打开Chrome
driver.get("https://lmk.189.cn:9093/baiducard/baiducard_detail.html?ct=0&shopid=lmk.cps.jtyzk1wxgzh&cmpid=jt-yzk1-wxgzh&type=1&channel=wxgzh")
simulator()#调用区域选择函数
findnumber()#调用寻找号码函数
driver.quit()
print("搜索结束")

【Python爬虫】Python+Selenium爬取百度圣卡/网易白金卡手机靓号相关推荐

  1. python爬虫——使用selenium爬取微博数据(一)

    python爬虫--使用selenium爬取微博数据(二) 写在前面 之前因为在组里做和nlp相关的项目,需要自己构建数据集,采用selenium爬取了几十万条微博数据,学习了很多,想在这里分享一下如 ...

  2. Python爬虫实战之爬取百度贴吧帖子

    Python爬虫实战之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的 ...

  3. python抓取文献关键信息,python爬虫——使用selenium爬取知网文献相关信息

    python爬虫--使用selenium爬取知网文献相关信息 写在前面: 本文章限于交流讨论,请不要使用文章的代码去攻击别人的服务器 如侵权联系作者删除 文中的错误已经修改过来了,谢谢各位爬友指出错误 ...

  4. python爬虫——用selenium爬取淘宝商品信息

    python爬虫--用selenium爬取淘宝商品信息 1.附上效果图 2.淘宝网址https://www.taobao.com/ 3.先写好头部 browser = webdriver.Chrome ...

  5. 使用python中的Selenium爬取百度文库word文章

    参考文章:Python3网络爬虫(九):使用Selenium爬取百度文库word文章,链接为: https://blog.csdn.net/c406495762/article/details/723 ...

  6. python爬虫:Selenium爬取B站视频标题、播放量、发布时间

    上次尝试了利用Ajax机制爬取B站视频播放量等数据(链接在下方),但是发现响应的JSON数据中没有发布时间的数据,这次决定用Selenium试一下. python爬虫:Ajax爬取B站视频标题.播放量 ...

  7. 百度贴吧界面html程序代码,python爬虫例题:爬取百度贴吧评论区图片和视频

    百度贴吧是全球最大的中文交流平台,你是否跟我一样,有时候看到评论区的图片想下载呢?或者看到一段视频想进行下载呢? 今天,本期Python教程带大家通过搜索关键字来获取评论区的图片和视频. [二.项目目 ...

  8. Python爬虫实战之爬取百度音乐歌曲

    Python爬虫爬取百度音乐歌曲 整体思路如下: 1.搜索:通过搜索界面输入歌手名字找到歌手的歌曲信息.千千音乐:网址 2.找到歌曲信息:通过遍历歌曲列表信息界面获取每个歌曲的ID,以及歌曲的总数 3 ...

  9. Python爬虫使用selenium爬取qq群的成员信息(全自动实现自动登陆)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...

最新文章

  1. SQL IN 一定走索引吗?
  2. 3.6 Git 分支 - 分支的衍合
  3. WEB服务器、应用程序服务器、HTTP服务器的区别
  4. C++ static 用法
  5. asp.net 与 java 2017_[ASP.net教程]C#与JAVA学习感悟
  6. [浏览器]Apple之Safari 5.0.4
  7. c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数
  8. Java编程思想学习(一)----对象导论中多态的理解
  9. (个人备忘)多人开发 no file directory.....的问题
  10. [转] Python标准库的threading.Thread类
  11. Kafka笔记1(初步认识)
  12. 加载字典文件,扫描网站潜在目录
  13. java 典型程序,13道Java典型的Java小程序
  14. IEEE 1588 报文封装
  15. stm32f407+rtthread 使用 ec20 ppp拨号
  16. linux drupal 7,在CentOS 7下试验Drupal 7
  17. 基于LASSO的波士顿房价分析
  18. Python基础知识:切片
  19. 逆水寒服务器维护能进游戏吗,逆水寒7月12日几点可以进游戏 逆水寒更新维护公告...
  20. Angular4中使用PrimeNG calendar

热门文章

  1. ubuntu运行Openvino出现 ModuleNotFoundError: No module named ‘openvino.model_zoo.model_api‘解决
  2. 浅谈导航数据中POI搜索技术原理
  3. CAD图形设置:层高与填充设置教程
  4. 基于微信小程序的食堂窗口自助点餐系统
  5. C语言——PAT 乙级(1002.读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。)
  6. python中exec是什么意思_Python中的exec()
  7. RBP中新增自由格式报表资源之自由格式风格
  8. 安卓获取不到imsi_Android10.0 SDK29版本拿不到手机的IMSI解决办法
  9. 浏览器使用华视电子设备读取身份证信息
  10. CCF201712-4 行车路线(最短路)