网页手机号抓取程序(爬取公司内部邮箱的*敏*感*词*,获取所有用户的手机号码!)
优采云 发布时间: 2021-09-17 07:04网页手机号抓取程序(爬取公司内部邮箱的*敏*感*词*,获取所有用户的手机号码!)
前段时间,我收到一位业务人员的爬虫请求,要求我对公司内部邮箱的地址簿进行爬虫,获取所有用户的手机号码,并建立相应的业务推广白名单
1、需求解释
首先,我们公司的邮箱是outlook的邮箱。只有登录邮箱才能看到整个公司的*敏*感*词*,因为员工数量很多(将近一百万名员工)。首先,让我们看一下具体的电子邮件联系人列表:
子公司的名称列在目录中。点击子公司后,会列出子公司的人员列表,点击人员时会显示具体的手机号及相关信息
2、建造爬行动物前的准备
首先,这个需求需要不断的点击相应的项目来获取相应用户的手机号。但是,此人的页面上有很多人,并且没有相应的分页标志。只有一个滚动条可以上下拉动。有很多内容,至少有上万条,所以你需要不断地点击这个人的信息
我以前想过用普通的爬行工具爬行,但是工作人员没有发现明显的规律性。它们不能通过简单的遍历直接获得相应的数据。另外,数据加载也是通过相应的JavaScript脚本和Ajax来实现的,所以我暂时没有更好的解决方案(PS:天哪,如果你有更好的解决方案,请给我一些建议。)
通过查阅相应的爬虫工具库,我们最终找到了一个用于自动测试的python库(selenium库)。该库的一个优点是,它可以像人类一样连续单击鼠标以获取相应的内容。通过模拟人类相应的操作,我们可以直接获得相应的内容。具体使用请百度(因为模拟浏览器不断点击,所有用户都需要下载相应的浏览器驱动程序)
3、crawler的实现
不用多说,直接上代码是最真实的
# -*- coding: utf-8 -*-
"""
Created on Tue Jan 30 21:18:12 2018
"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import WebDriverException
import time
browser = webdriver.Chrome()
wait = WebDriverWait(browser,20)
def login_outlook():
# 模仿浏览器进行登录操作
#需要爬去邮箱的地址
browser.get('--------------------------')
username = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR,'#username')))
passwd = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR,'#password')))
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#lgnDiv > div.signInEnter > div > span')))
#邮箱的用户名
username.send_keys('username')
#邮箱登录密码
passwd.send_keys('password')
submit.click()
def main():
# 登录
login_outlook()
time.sleep(5)
# 点击人员选项
submit_renyuan = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR,'#_ariaId_19')))
submit_renyuan.click()
# 点击所有用户
submit_allyonghu = wait.until(
EC.element_to_be_clickable((By.XPATH,'//*[@id="_ariaId_452"]/div[1]/div[2]/div/div[2]/span')))
submit_allyonghu.click()
#遍历所有的用户
result =[]
# select_header ='''body > div._n_X4 > div > div._n_p.csimg.image-headerbgmain-png > div:nth-child(3) > div:nth-child(2) > div._ph_S > div:nth-child(3) > div:nth-child(1) > div._ph_j1 > div:nth-child(1) > div > div > div._ph_V1.customScrollBar.scrollContainer > div > div > div:nth-child('''
# select_tail =''') > span > div > span._pe_b._pe_s > span'''
Xpath_head = '''/html/body/div[2]/div/div[3]/div[3]/div[2]/div[2]/div[3]/div[1]/div[2]/div[1]/div/div/div[1]/div/div/div['''
Xpath_tail = ''']/span/div/span[3]/span'''
wait1 = WebDriverWait(browser,2)
#这里的10000是人为设定的,因为不知道这个页面上*敏*感*词*体有多少用户
for j in range(1,10000):
print(j)
for i in range(1,71):
print(i)
Xpath = Xpath_head + str(i) + Xpath_tail
print(Xpath)
try:
submit_ren = wait1.until(
EC.element_to_be_clickable((By.XPATH,Xpath)))
submit_ren.click()
except(NoSuchElementException,TimeoutException,WebDriverException):
print("连接超时")
continue
time.sleep(0.18)
# result.append(wait.until(
# EC.element_to_be_clickable((By.CSS_SELECTOR,'body > div._n_X4 > div > div._n_p.csimg.image-headerbgmain-png > div:nth-child(3) > div:nth-child(2) > div._ph_S > div:nth-child(3) > div:nth-child(4) > div:nth-child(2) > div > div:nth-child(3) > div._rpc_s > div:nth-child(1) > div > div > div:nth-child(1) > div > div > div'))))
#获取到相应的手机号码文本
rr=browser.find_element_by_xpath("/html/body/div[2]/div/div[3]/div[3]/div[2]/div[2]/div[3]/div[4]/div[2]/div/div[3]/div[4]/div[1]/div/div/div[1]/div/div/div")
saveFile = open('telno.txt','a')
saveFile.write(str(rr.text.replace("\n","|")))
saveFile.write("\n")
saveFile.close()
time.sleep(1)
if __name__ == '__main__':
main()
4、结果分析和改进领域
通过整个爬行过程,发现爬行器存在以下缺点:
(1).虽然可以检索到对应用户的手机号码,但是号码不一定完整,一个人设置10000,这是非常不合理的,因为我们不知道有多少用户,所以我们设置了一个很大的号码,但是这个方法是非常不合适的
(2).在爬行过程中,发现模拟的点击没有一一点击,存在跳跃现象,这也是爬行不完全的原因之一,原因是我们不了解页面加载方式和具体的数据加载方式,从而找到相应的规律(向伟大的上帝寻求指引)
(3)爬网的成功与服务器的响应时间也有关系,造成这种现象的原因有两个:一是用户没有对应的手机号码(这种现象确实存在,但是号码很小)另一方面,服务器的响应时间相对较慢,在服务器返回对应用户的手机号码之前,程序开始点击下一个用户
(4)注意,最好让程序休眠一段时间(即代码中的time.sleep())模拟点击时,一方面是等待服务器的相应响应,另一方面也是模拟人,因为如果点击太快,会被识别为攻击,你的IP地址会被短时间封锁
最后,由于爬虫可以爬行到用户的手机号,有很多问题需要解决,而且最后一个爬虫的手机号不是最完整的,所以爬虫程序还有很大的改进空间。(我以后会继续改进)