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我们下载的代码有些地方处理的也不是很到位,大家重点学习思路,有啥建议可以在评论的 ...
随机推荐
- CPU上下文切换以及相关指标的理解
前言 上下文切换这个词一直不理解,看了无数遍就忘了无数遍,知道看到<操作系统导论>这本书,终于有了略微的理解.这也证明了我的方向是没错的,一直认为做运维还是得理解底层的知识,不理解很多 ...
- HTML特殊符号整理
往网页中输入特殊字符,需在html代码中加入以&开头的字母组合或以&#开头的数字.下面就是以字母或数字表示的特殊符号大全. ...
- ELK-日志管理平台
elk日志收集工具 1.日志在工作当中的重要性 1 分析日志的意义: 2 1.分析日志监控系统运行的状态 3 2.分析日志来定位程序的bug 4 3.分析日志监控网站访问流量 ...
- 项目工程化之git提交规范以及 CHANGELOG生成
事先声明,本文是参考了其他大神的博客之后自己尝试的记录,具体可以参考如下 链接 先说说git 提交规范把,这里基本都是这个工具 cz-customizable 1,安装 npm install cz- ...
- Mysql索引的基本知识和用处
2020-05-29 15:38:27 一.索引的优点 1.能大大减少服务器需要扫描的数据量. 2.帮助服务器避免排序和临时表. 3.将随机io变成顺序io. 二.索引的用处 能够快速匹配where条 ...
- Linux 比较常用的命令
#磁盘空间 df -h 显示已经挂载的分区列表 du -sh [file] 估算当前使用磁盘空间 du -sk * | sort -rn 以容量大小递减排序 文件搜索 find find [file_ ...
- 跟着阿里学JavaDay04——Java基础语法(二)
一.Java运算符 运算符的简介 所有的程序开发,都是对数字的进行处理.而对数字的处理,一定会存在所谓的操作模式,而这些操作模式就被称为运算符. 算术运算符 对于算术运算符,我们主要掌握++,--的运 ...
- Maven+JSP+SSM+Mysql实现的音乐网站
项目简介 项目来源于:https://gitee.com/coder_ze/iMusic 本系统基于Maven+JSP+SSM+Mysql实现的音乐网站.主要实现的功能有音乐播放.下载.上传等几个模块 ...
- Java实现 蓝桥杯 算法训练 Bit Compressor(暴力)
试题 算法训练 Bit Compressor 问题描述 数据压缩的目的是为了减少存储和交换数据时出现的冗余.这增加了有效数据的比重并提高了传输速率.有一种压缩二进制串的方法是这样的: 将连续的n个1替 ...
- Java实现 LeetCode 113 路径总和 II
113. 路径总和 II 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = ...