Python爬虫-爬取公司邮箱内的职工手机号码

优采云 发布时间: 2020-05-31 08:00

  

  前段时间接到一个业务人员的一个爬虫需求,爬取公司内部邮箱的*敏*感*词*,获取所有用户的手机号码,为业务的推广构建相应的白名单。

  首先我们公司的邮箱是outlook的邮箱,只有登陆了邮箱就能够看见全公司的*敏*感*词*,因为人数比较多(近百万的职工),首先看一下具体的邮箱联系人员列表:

  

  

  目录中列举的是子公司的名称,点击子公司后,后列举子公司的人员名单,再点击人员的时侯就会下来具体的手机号码及相关信息。

  首先这个需求是须要不断的点击相应的条目就会下来相应的用户的手机号码的,但是这个人员的页面人数好多,也没有相应的分页标志邮箱爬虫软件,只是有一个滚动条可以上下的带动,里面的内容好多,至少是几万吧,所以就须要不断的点击人员信息。

  之前也曾想过用普通的爬虫工具进行爬取,但是人员的那种也没有找到显著的规律性,不能直接通过简单的遍历才能够直接的获取相应的数据,另外数据的加载也是通过相应JavaScript脚本和ajax实现的,所以这个方式 我暂时没有想到比较好的解决办法(ps:大神假如有更好的解决办法请赐教。)

  通过查阅相应的爬虫工具库,终于找到了一个自动化测试的python库(selenium库),这个库有一个用处就是可以模拟人类一样不断的点击滑鼠,获取相应的内容,通过模拟人类的相应操作才能够直接的获取相应的内容,至于具体的用法请自行百度(因为这个一个模拟浏览器在不断的点击,所有还须要下载相应的浏览器驱动)。

  不多说,直接上代码是最实在的!!!

  # -*- 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()

  通过整个的爬取过程,发现这个爬虫程序有如下的不足:

  (1)、虽然还能抓取到相应用户的手机号码,但是号码不一定全,其中有一个人为设定的10000,这个是非常不合理的地方,因为不知道具体有多少用户,所以就设定一个比较大的数字,但是这些做法非常不妥当;

  (2)、在抓取的时侯发觉,模拟点击这员的时侯并不是挨个进行点击的,有跳动的现象,所以这也是爬取不全的缘由之一,之所以出现此类情况,还是由于对页面的加载方法和具体的数据加载方法不了解,为找到相应的规律(求高手赐教);

  (3)爬取的成功与否还与服务器响应时间有很大的关系,检查保存的文件发觉有空行,这样的现象有两个缘由,一个是这个用户就没有相应的手机号码(这种现象确实存在,但是数目非常少),另一方面缘由就是服务器的响应时间比较慢,服务器还未返回对应用户的手机号,程序就开始点击下一个用户了;

  (4)注意在每次模拟点击的时侯最好使程序沉睡一会(即代码中的 time.sleep( )),这样做一方面是为了等待服务器的相应,另一方也是为了模拟人类,因为点击很快的话,会被辨识的功击,会短时间的封锁你的ip地址的。

  最后一点,随着这个爬虫还能爬取到用户的手机号码邮箱爬虫软件,但是存在众多的问题须要解决,最后爬取的手机号码也不是最全的,所以这个爬虫程序还是有很大的提高空间的。(这个前面我就会不断的改进的)。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线