帮同学做一个关于爬取教授邮箱的任务,在百度搜索中输入教授的名字+长江学者+邮箱,爬取并筛选每个教授的邮箱,最后把邮箱信息写入到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))

转载于:https://www.cnblogs.com/jean925/p/8097832.html

利用百度搜索结果爬取邮箱相关推荐

  1. Python网络爬虫与信息提取(14)—— 百度搜索关键字爬取并整理摘要、标题、关键字等

    前言 百度搜索的内容一般包含标题.摘要.网址.时间信息,本次主要实现根据搜索整理30页左右百度的搜索条例成csv文档. 原理 百度爬虫比较简单,模拟浏览器访问就可以爬取到所要的数据,访问某个关键字第几 ...

  2. python百度搜索url爬取 图片

    这里以百度搜索为案例,搜索并下载图片 import requests # python HTTP客户端库,编写爬虫和测试服务器响应数据会用到的类库 import re # 导入正则表达式模块 impo ...

  3. 利用搜索关键字爬取今日头条新闻评论信息案例

    利用搜索关键字爬取今日头条新闻评论信息案例 爬虫4步骤: 1.分析网页 2.对网页发送请求,获取响应 3.提取解析数据 4.保存数据 本案例所用到的模块 import requests import ...

  4. 利用Python进行百度文库内容爬取(二)——自动点击预览全文并爬取

    本文是衔接上一篇:<利用Python进行百度文库内容爬取(一)>. 上回说到我们在对百度文库进行爬虫时,需要模拟手机端来进行登录,这样固然可以对文章进行爬取,但是很多时候并不是非常智能的翻 ...

  5. python爬去百度文库_利用Python语言轻松爬取数据[精品文档]

    利用 Python 语言轻松爬取数据 对于小白来说,爬虫可能是一件非常复杂. 技术门槛很高的事情. 比如有人认为学爬虫必须精通 Python ,然后哼哧哼哧系统学习 Python 的每个知识点,很久之 ...

  6. python爬取百度文库_利用Python语言轻松爬取数据

    利用 Python 语言轻松爬取数据 对于小白来说,爬虫可能是一件非常复杂. 技术门槛很高的事情. 比如有人认为学爬虫必须精通 Python ,然后哼哧哼哧系统学习 Python 的每个知识点,很久之 ...

  7. 爬虫实战(二)—利用requests、selenium爬取王者官网、王者营地APP数据及pymongo详解

    概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider ,包括了项目的所有代码. 本文 ...

  8. 利用c#从网上爬取成语的解释

    利用c#从网上爬取成语的解释 一年前写的代码,今天整理文件夹时偶然发现,代码写的很糟糕,原本打算删掉的,但又想到当时两眼昏沉地熬夜编代码,心中生出了一丝不舍,今天把它放到这里,就当是留个纪念吧! 代码 ...

  9. 利用python爬虫大量爬取网页图片

    最近要进行一类图片的识别,因此需要大量图片,所以我用了python爬虫实现 一.爬取某一图片网站 主要参考:https://www.cnblogs.com/franklv/p/6829387.html ...

  10. Python爬虫利用18行代码爬取虎牙上百张小姐姐图片

    Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...

最新文章

  1. 【FFmpeg】AVPacket的使用详解
  2. js请求结果拦截机器_分享:一步一个脚印,vue入门之axios的应用及拦截封装
  3. Android Unable to resolve target 'android-8'
  4. webpack打包后的文件夹是空的_vue+webpack 打包文件 404 页面空白的解决方法
  5. 【MySQL】MySQL 使用where条件的三种方式
  6. C语言之内存管理初探:栈和堆、malloc、calloc、realloc、free
  7. [数据结构与算法] (顺序)线性表简单demo程序
  8. [笔记].Nios II 软核性能基准
  9. elasticsearch 请求全部数据
  10. 写入接口c语言_嵌入式LCD的接口类型详解
  11. Linux内核为什么会发生soft lockup?
  12. testcookie-nginx-module
  13. 各向异性(anisotropic)浅提
  14. 传输层端口、TCP和UDP的概念
  15. 组策略 gpedit.msc 及修复“无法为文件 appv.admx (*.admx)找到适当的资源文件(错误=2)”报错
  16. 简述汇编语言中的标号有什么规定_汇编语言期末复习题
  17. 多个经纬度地点数据,如何同时在地图上标注出来(路径显示)
  18. 实用新型专利和发明专利的区别
  19. Tableau数据可视化
  20. UG数控编程的后处理两种方法,建议收藏

热门文章

  1. ZK框架笔记3、窗体组件
  2. 获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
  3. 打破校史,发学校首篇Science的博士小姐姐,近日再发Nature!破解百年谜题
  4. 【论文分享】ACL 2020 社交网络谣言判别中可解释性相关研究
  5. 知识图谱构建-关系抽取和属性抽取
  6. 【NeurIPS 2019】17篇论文,详解图的机器学习趋势
  7. 【python】Tkinter可视化窗口(一)
  8. 面试出现频率超高的一道算法题
  9. 大数据分析,带你认识一个你从未见过的周杰伦
  10. 每日算法系列【LeetCode 658】找到 K 个最接近的元素