1. 程式人生 > >利用百度搜索結果爬取郵箱

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

.... sheet pro 編輯部 pic exception exc gecko 正則表達

幫同學做一個關於爬取教授郵箱的任務,在百度搜索中輸入教授的名字+長江學者+郵箱,爬取並篩選每個教授的郵箱,最後把郵箱信息寫入到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))

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