利用百度搜索結果爬取郵箱


幫同學做一個關於爬取教授郵箱的任務,在百度搜索中輸入教授的名字+長江學者+郵箱,爬取並篩選每個教授的郵箱,最后把郵箱信息寫入到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:\Users\wujian\Desktop\長江學者名單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"\b\w+([.+-]\w+)*@(?!163)(?!126)(?!qq)(?!vip)\w+([.-]\w+)*\.\w+([.-]\w+)*\b",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('\t-------->',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:\Users\wujian\Desktop\長江學者名單1998-2015.xlsx")
127     end_time=time.time()
128     print("程序共耗時:%d秒"%(end_time-start_time))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM