2019-01-31 Python学习之BFS与DFS实现爬取邮箱
今天学习了python网络爬虫的简单知识
首先是一个爬取百度的按行读取和一次性爬取
逐行爬取
for line in urllib.request.urlopen("http://www.baidu.com"):
    print(line.decode("utf-8"))
全部爬取
mystr = urllib.request.urlopen("http://www.baidu.com").read()
print(mystr.decode("utf-8"))
分别用栈和队列实现了DFS和BFS的邮箱爬取
用队列deque实现BFS
import re
import urllib
import urllib.request
from collections import deque
def getallemail(data):  #邮箱的正则表达式获取所有的邮箱
    try:
        mailregex = re.compile(r"([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})", re.IGNORECASE)
        mylist = mailregex.findall(data)
        return mylist
    except:
        return []
def getdata(url):   #用utf-8编码读取url返回网页源代码
    try:
        data = urllib.request.urlopen(url).read().decode("utf-8")
        return data
    except:
        return ""
def geteveryurl(data):  #获得网页所有的url
    alllist = []
    mylist1 = getallhttp(data)
    mylist2 = []
    if len(mylist1)>0:
        mylist2 = getabsurl(mylist1[0],data)    #mylist[0]作用是提取元素
    alllist.extend(mylist1)
    alllist.extend(mylist2)
    return alllist
def gethostname(httpstr):
    try:
        mailregex = re.compile(r"(http://\S*?)/",re.IGNORECASE) #预编译提取主机名的regex
        mylist = mailregex.findall(httpstr)
        if len(mylist)==0:
            return None
        else:
            return mylist[0]
    except:
        return None
def getabsurl(url,data):
    try:
        regex = re.compile("href=\"(.*?)\"",re.IGNORECASE) #预编译提取href正则表达式
        httplist = regex.findall(data)
        newhttplist = httplist.copy()  #进行一次深拷贝,以进行后面的删除行为
        for data in newhttplist:
            if data.find("http://")!=-1:  #如果其中包含http
                httplist.remove(data) #在原list中remove此data
            if data.find("javascript")!=-1:
                httplist.remove(data) #同理
        hostname = gethostname(url)
        if hostname!=None:
            for i in range(len(httplist)):
                httplist[i] = hostname + httplist[i]
        return httplist
    except:
        return []
def getallhttp(data):#找到所有的http
    try:
        mailregex = re.compile(r"(http://\S*?)[\"|>|)]",re.IGNORECASE)
        mylist = mailregex.findall(data)
        return mylist
    except:
        return[]
def BFS(urlstr):
    urlqueue = deque([]) #新建一个队列
    urlqueue.append(urlstr) #队列中加入最初的url
    while len(urlqueue)!=0: #判断队列是否为空
        url = urlqueue.popleft()  #队列弹出的数据(url)
        print(url)  #打印url连接
        pagedata = getdata(url)  #获取网页源代码
        emaillist = getallemail(pagedata)  #提取邮箱到列表
        if len(emaillist)!=0:       #若邮箱列表不为空
            for email in emaillist:
                print(email)        #打印所有的邮箱
        newurllist = geteveryurl(pagedata) #抓取该网页的所有的url
        if len(newurllist)!=0:      #若列表不为空
            for urlstr in newurllist:
                if urlstr not in urlqueue:
                    urlqueue.append(urlstr)     #若url不在该队列中,则将该url加入队列中
BFS(input("请输入你想爬取的最初页面"))
用栈stack实现DFS
import re
import urllib
import urllib.request
def getallemail(data):  #邮箱的正则表达式获取所有的邮箱
    try:
        mailregex = re.compile(r"([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})", re.IGNORECASE)
        mylist = mailregex.findall(data)
        return mylist
    except:
        return []
def getdata(url):   #用utf-8编码读取url返回网页源代码
    try:
        data = urllib.request.urlopen(url).read().decode("utf-8")
        return data
    except:
        return ""
def geteveryurl(data):  #获得网页所有的url
    alllist = []
    mylist1 = getallhttp(data)
    mylist2 = []
    if len(mylist1)>0:
        mylist2 = getabsurl(mylist1[0],data)    #mylist[0]作用是提取元素
    alllist.extend(mylist1)
    alllist.extend(mylist2)
    return alllist
def gethostname(httpstr):
    try:
        mailregex = re.compile(r"(http://\S*?)/",re.IGNORECASE) #预编译提取主机名的regex
        mylist = mailregex.findall(httpstr)
        if len(mylist)==0:
            return None
        else:
            return mylist[0]
    except:
        return None
def getabsurl(url,data):
    try:
        regex = re.compile("href=\"(.*?)\"",re.IGNORECASE) #预编译提取href正则表达式
        httplist = regex.findall(data)
        newhttplist = httplist.copy()  #进行一次深拷贝,以进行后面的删除行为
        for data in newhttplist:
            if data.find("http://")!=-1:  #如果其中包含http
                httplist.remove(data) #在原list中remove此data
            if data.find("javascript")!=-1:
                httplist.remove(data) #同理
        hostname = gethostname(url)
        if hostname!=None:
            for i in range(len(httplist)):
                httplist[i] = hostname + httplist[i]
        return httplist
    except:
        return []
def getallhttp(data):#找到所有的http
    try:
        mailregex = re.compile(r"(http://\S*?)[\"|>|)]",re.IGNORECASE)
        mylist = mailregex.findall(data)
        return mylist
    except:
        return[]
def DFS(urlstr):
    visitlist = [] #代表已经访问过的url,防止深度遍历出现死循环
    urlstack=[]         #栈
    urlstack.append(urlstr)
    while len(urlstack)!=0:
        url = urlstack.pop()
        print(url)  #打印url链接
        if url not in visitlist:
            pagedata = getdata(url)
            emaillist = getallemail(pagedata)
            if len(emaillist)!=0:
                for email in emaillist:
                    print(email)
            newurllist = geteveryurl(pagedata)
            if len(newurllist)!=0:
                for urlstr in newurllist :
                    if urlstr not in urlstack:
                        urlstack.append(urlstr)
            visitlist.append(url)
DFS(input("请输入你想爬取的最初页面"))
#提取数据容易出现广度遍历
#深度遍历容易出现死循环
- 其中需要注意的是,DFS容易出现死循环现象,故使用visitlist来避免,数据提取适合使用广度遍历实现,因为深度遍历是一撸到底,适合挖掘网站的层数。
代码来自尹成python教学
2019-01-31 Python学习之BFS与DFS实现爬取邮箱的更多相关文章
- 算法学习之BFS、DFS入门
		算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ... 
- Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(人人网)(下)
		Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(下) 自动使用cookie的方法,告别手动拷贝cookie http模块包含一些关于cookie的模块,通过他们我们可以自动的使用co ... 
- [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息
		[Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息 2018-07-21 23:53:02 larger5 阅读数 4123更多 分类专栏: 网络爬虫 版权声明: ... 
- Python使用urllib,urllib3,requests库+beautifulsoup爬取网页
		Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ... 
- Python网页解析库:用requests-html爬取网页
		Python网页解析库:用requests-html爬取网页 1. 开始 Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等.在网上玩爬虫的文章通常都是 ... 
- python爬虫学习(三):使用re库爬取"淘宝商品",并把结果写进txt文件
		第二个例子是使用requests库+re库爬取淘宝搜索商品页面的商品信息 (1)分析网页源码 打开淘宝,输入关键字“python”,然后搜索,显示如下搜索结果 从url连接中可以得到搜索商品的关键字是 ... 
- 爬虫(二)Python网络爬虫相关基础概念、爬取get请求的页面数据
		什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程. 哪些语言可以实现爬虫 1.php:可以实现爬虫.php被号称是全世界最优美的语言(当然是其自己号称的,就是王婆 ... 
- python scrapy简单爬虫记录(实现简单爬取知乎)
		之前写了个scrapy的学习记录,只是简单的介绍了下scrapy的一些内容,并没有实际的例子,现在开始记录例子 使用的环境是python2.7, scrapy1.2.0 首先创建项目 在要建立项目的目 ... 
- Python爬虫入门教程: 27270图片爬取
		今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位,大家重点学习思路,有啥建议可以在评论的 ... 
随机推荐
- poj3177 无向连通图加多少条边变成边双连通图
			Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15752 Accepted: 6609 ... 
- 基于java的雷电游戏
			基于java的雷电游戏基本功能包括:敌方飞机随机飞行.我方飞机手动控制飞行,射击比拼,游戏闯关等.本系统结构如下: (1)雷电游戏状态调整功能: 在游戏启动时,游戏会自动进行初始化的验证. 若初始化成 ... 
- APM 上报信息分析与应用
			在入正题之前我们再回顾下它的架构图: 本文章主要分析AMP各索引的作用,与及结合1.7环境上已接入的服务数据对比后,对索引中的主要字段进行解析.文章分为四个小章节. 1.索引类型 apm索引分为四种类 ... 
- windows 10 2016 企业版 长期服务 激活方式
			试了很多,失败. 使用这个ok———————————————————————————————— 使用方式: 2.1.下载AAct.exe https://www.baidu.com/link?url ... 
- 实验五:shell脚本编程
			项目 内容 这个作业属于哪个课程 班级课程的主页链接 这个作业的要求在哪里 作业要求链接地址 学号-姓名 17043133-木腾飞 作业学习目标 1.了解shell 脚本的概念及应用2.掌握shell ... 
- 理解session及微信小程序使用session
			session介绍 由于Http是无状态的协议,所以服务端需要记录用户的状态时,就需要某种机制来识别具体的用户,实现这个机制的方式就是session. 典型的场景比如购物车,当你点击下单按钮时,由于H ... 
- Object类及其equals()方法
			== : 1.基本数据类型:根据基本数据类型的值判断是否相等,相等返回true,反之返回false 注意:两端数据类型可以不同, 在不同的情况下,也可以返回true 2.引用数据类型:Object ... 
- Java多线程通关——基础知识挑战
			等掌握了基础知识之后,才有资格说基础知识没用这样的话.否则就老老实实的开始吧. 对象的监视器 每一个Java对象都有一个监视器.并且规定,每个对象的监视器每次只能被一个线程拥有,只有拥有它的线 ... 
- Rocket - util - Broadcaster
			https://mp.weixin.qq.com/s/ohBVNAXZUA538qSxfBGMKA 简单介绍Broadcaster的实现.  1. Broadcaster 广播即是 ... 
- Java 第十一届 蓝桥杯 省模拟赛 字母重新排列
			字母重新排列 题目 问题描述 将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQIAO.AAILNOQ等,注意这7个字母都要被用上,单词不一定有具体的英文意义. 请问,总共能排列如多少个 ... 
