zoukankan      html  css  js  c++  java
  • 利用百度搜索结果爬取邮箱

    帮同学做一个关于爬取教授邮箱的任务,在百度搜索中输入教授的名字+长江学者+邮箱,爬取并筛选每个教授的邮箱,最后把邮箱信息写入到Excel表中:--爬取结果争取率大概在50%-60%

    大致思路如下:

    先利用百度搜索关键词(不断转换关键词,效果会不一样)

    利用BeautifulSoup解析到百度搜索的html内容,找到主要的部分

    写正则表达式,注意要过滤掉qq邮箱、163、126、vip邮箱(学者教授根本不会使用这些邮箱,他们几乎都是使用学校edu.cn、企业邮箱、gmail之类的),这样可以提高精准率

    由于正则表达式没有写好,无意把中文匹配出来了,再进一步用正则表达式把中文去除掉

    发现爬取出来的结果,里面很多的新闻投稿邮箱、编辑部的邮箱,设置了过滤列表进行过滤

    爬取多个邮箱,counter统计出现频数最高的,作为最终的结果,如果匹配结果只有一个,则就选它为最终的结果

    最后把结果信息写回到Excel表格中

    由于需要大量的检索百度搜索结果,耗时比较长

    爬虫代码如下:

      1 #coding:utf-8
      2 import time
      3 import requests
      4 import urllib.parse
      5 from bs4  import BeautifulSoup as BS
      6 import re
      7 from openpyxl import load_workbook
      8 from openpyxl import Workbook
      9 from collections import Counter
     10 
     11 start_time=time.time()
     12 # 加载Excel工作表以及获取表名
     13 wb1 = load_workbook(r"C:UserswujianDesktop长江学者名单1998-2015.xlsx")
     14 sheet1 = wb1.get_sheet_by_name("汇总")
     15 # 把所有的教授名字单独取出来
     16 professors=[]
     17 for x in sheet1['D']:
     18     if x.value!='教授姓名':
     19         professors.append(str(x.value).strip())
     20 
     21 # for x in professors:
     22 #     print(x)
     23 length=len(professors)
     24 
     25 root_url='https://www.baidu.com/s?wd='
     26 headers={
     27     'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
     28                  ' Chrome/48.0.2564.48 Safari/537.36',
     29     'Referer': 'https://www.baidu.com:443'
     30 }
     31 nums=['1','2','3','4','5','6','7','8','9']
     32 filterlist=['service','webmaster','news','new','fjptwhw','support',
     33             'cnsaiwai','PKU_NanoST','mysf','zjseu','chinayznew','kf',
     34             'admin','sp','wlwnews','anhuixinwen','xiaoyuan','xinwen',
     35             'fuwu','contrib','xmt','sinamedia','rm','m8000','hnqnw',
     36             'info','zghtbs','web','jjrbtg','zgkyb','shihappy','pic',
     37             'cnxwzx','gaoling_news','emuchnet','changjiang','leifu',
     38             'admission','office','administrator','aco','andong','baike',
     39             'bgs','bravetim','buaazhangjun','cbtql','cksp','cs','fuhuimin',
     40             'fxxsqy','jdb','jiangyue2012','jinxin','job','jsu','jubao','kefu',
     41             'kepu','kjdbcb','kjxb0731-160','master','maths','nchkdxb','newmedia',
     42             'rcb','rencaiban','rczp','renshichu','rsc','shengxch','sjing','sla_office',
     43             'swxrs','tougao','wanhoo','wbb037','Webmaster','wlwh','xcb','xiaohuzz','xwzx',
     44             'yjrddh','youthhb','yx1005','zgzxyx','zhouh','zzbgbb','zyang','zuaa','360baike']
     45 
     46 #邮箱正则表达式匹配
     47 pattern=re.compile(r"w+([.+-]w+)*@(?!163)(?!126)(?!qq)(?!vip)w+([.-]w+)*.w+([.-]w+)*",re.M|re.I)
     48 #匹配中文汉字
     49 regexp = re.compile(r'[^x00-x7f]')
     50 def baidu_search(word):
     51     '''
     52     根据关键字获取查询网页
     53     '''
     54     emails=[]
     55     res_dict={}
     56     keyword1=word+" 长江学者 邮箱"
     57     keyword2=word+" 长江学者 email"
     58     keyword3=word+" 长江学者 Email"
     59     keyword4=word+" 长江学者 E-mail"
     60     keywords=[keyword1,keyword2,keyword3,keyword4]#调整搜索的关键字
     61 
     62     # print(word)
     63     for i in range(len(keywords)):
     64         url=root_url+urllib.parse.quote(keywords[i].encode('utf-8'))#url拼接
     65         # print(url)
     66         r=requests.get(url,headers=headers)
     67         soup=BS(r.text,'html.parser')
     68         cont=soup.find_all('div', class_="result c-container ")
     69         # print(type(cont))#class 'bs4.element.ResultSet'>
     70 
     71         for k in range(len(cont)):
     72             # print("第%d个"%k)
     73             string=str(cont[k]).strip()
     74             # print(string)
     75             try:
     76                 matchObj=pattern.search(string).group()
     77                 # print('	-------->',matchObj)
     78                 if matchObj and matchObj.strip().split('@')[0] not in filterlist:
     79                     #由于之前的邮箱正则表达式没有写好,匹配出来还有中文汉字,
     80                     #在此处去除掉中文汉字
     81                     try:
     82                         index=regexp.search(matchObj).span()[0]
     83                         matchObj=matchObj[:index]
     84                     except Exception as e:
     85                         emails.append(matchObj)
     86                     # print("emails--->",emails)
     87                     # print(len(emails))
     88             except Exception as e:
     89                 # print(e)
     90                 pass
     91             if len(emails)>7:
     92                 # print("break.....")
     93                 break
     94 
     95         if len(emails):
     96             res_dict[word]=emails
     97             # print("res_dict",res_dict)
     98             break
     99 
    100     if len(res_dict)==0:#最终没有匹配到邮箱信息
    101         res_dict[word]='Null'
    102     return res_dict
    103 
    104 if __name__ == "__main__":
    105     resultSet={}#最终结果,存放学者名字、及其邮箱信息
    106     for i in range(length):
    107         res_dict=baidu_search(professors[i])
    108         print(res_dict)
    109         emails=res_dict[professors[i]]
    110         if len(emails)>1:
    111             res_email=Counter(emails).most_common(1)[0][0]#按照每个邮箱出现的频率,进行排序,频率最大的那个邮箱就是我们所要查找的邮箱
    112             resultSet[professors[i]]=res_email
    113         else:
    114             resultSet[professors[i]]=emails[0]
    115 
    116     # for key in resultSet.keys():
    117     #     print(key,resultSet[x])
    118 
    119     sheet1['F1'].value='邮箱'
    120     # 将每一行的数据写入
    121     for i in range(length):
    122         professor=str(sheet1['D'+str(i+2)].value).strip()
    123         sheet1['F'+str(i+2)].value=resultSet[professor]
    124 
    125     # 将最终的结果保存在excel中
    126     wb1.save(r"C:UserswujianDesktop长江学者名单1998-2015.xlsx")
    127     end_time=time.time()
    128     print("程序共耗时:%d秒"%(end_time-start_time))
  • 相关阅读:
    js处理数学经典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?
    js的水仙花数的输出
    js中关于一个数组中最大、最小值以及它们的下标的输出的一种解决办法
    通过HMI显示西门子SINAMICS V90伺服驱动器报警代码和报警信息
    outlook Archive 归档减小服务器文件夹大小
    西门子触摸屏TP,KTP的报警历史记录数量
    解决HP ZBOOK 蓝屏, 释放静电的方法
    LOGO! 8.2 与 WinCC之间以太网通信的地址对应关系
    Windows10 文件索引功能,替代everything
    行星减速机的精度和强度
  • 原文地址:https://www.cnblogs.com/jean925/p/8097832.html
Copyright © 2011-2022 走看看