前几天老妈叫我帮她选个好点的百度圣卡号码,突然想起了最近学的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. 水痘痊愈就能终生免疫?其实病毒仍潜伏在神经,随时以更可怕的形式爆发......
  2. 使用PHP将HTTP标头设置为UTF-8
  3. HDU-1541 Stars 树状数组
  4. VS之设置文件编码格式
  5. 【机器学习】机器学习模型解释神器:Shapash
  6. 解决JDBC连接mysql时server time zone问题及com.mysql.jdbc.Driver is deprecated
  7. [Javascript] Avoid Creating floats if they are not needed
  8. 巴塞尔问题欧拉解法逐步推导与分析
  9. keep-alive + vuex + mint + Infinite scroll 保存分页列表数据
  10. windows使用git clone速度慢,改善方法
  11. fft qt 代码_FFT代码详解
  12. 趣学Python-教孩子学编程--第三章
  13. 开源纯净版u盘安装工具rufus
  14. matlab局部放大找交点,11.matlab找两条离散曲线的交点
  15. 数据结构之冒泡排序的两个优化细节
  16. Data too long for column解决方法
  17. Linux 升级glibc-2.18
  18. C语言编程题:分数的加减乘除
  19. 《Python神经网络编程》自己动手编写一个神经网络
  20. day09【字节流、字符流】

热门文章

  1. 【SpringCloud深入浅出系列】SpringCloud组件之集成Zuul实现过滤器
  2. 【Python学习笔记】6:用Gauss-Legendre求积公式近似求积分值
  3. 推荐几本这个系列封面的编程书,涉及Python、计算机图形学、Linux
  4. Windows内核原理与实现之 NDIS(网络驱动程序接口规范)
  5. 【深度学习】精度超越 ConvNeXt 的新 CNN!HorNet:通过递归门控卷积实现高效高阶的空间信息交互...
  6. HTML+CSS期末大作业:电影网站设计——猫眼电影(9页)
  7. android 24节气及节日,iOS -- 获取24节气和节日
  8. python绘制旭日图
  9. 【回炉重造】带你搞懂什么是机器学习?
  10. SparkRDD函数详解