【工作记录】爬虫

因为工作需要,有时候需要自己看邮箱里得内容。
代码如下:可以先拿去跑一跑,注意密码是ssl验证码

# -*- coding: utf-8 -*-

import poplib
import email
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
#解析邮件
def guess_charset(msg):
    charset = msg.get_charset()
    if charset is None:
        content_type = msg.get('Content-Type', '').lower()
        pos = content_type.find('charset=')
        if pos >= 0:
            charset = content_type[pos + 8:].strip()
    return charset

def decode_str(s):
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value
#定义输出的格式
def print_info(msg, indent=0):
    if indent == 0:
        for header in ['From', 'To', 'Subject']:
            value = msg.get(header, '')
            if value:
                if header=='Subject':
                    value = decode_str(value)
                else:
                    hdr, addr = parseaddr(value)
                    name = decode_str(hdr)
                    value = u'%s <%s>' % (name, addr)
            print('%s%s: %s' % ('  ' * indent, header, value))
    if (msg.is_multipart()):
        parts = msg.get_payload()
        for n, part in enumerate(parts):
            print('%spart %s' % ('  ' * indent, n))
            print('%s--------------------' % ('  ' * indent))
            print_info(part, indent + 1)
    else:
        content_type = msg.get_content_type()
        if content_type=='text/plain' or content_type=='text/html':
            content = msg.get_payload(decode=True)
            charset = guess_charset(msg)
            if charset:
                content = content.decode(charset)
            print('%sText: %s' % ('  ' * indent, content + '...')) 
        else:
            print('%sAttachment: %s' % ('  ' * indent, content_type))

email = raw_input('Email: ')
password = raw_input('Password: ')
pop3_server = raw_input('POP3 server: ')

server = poplib.POP3_SSL(pop3_server)
server.set_debuglevel(1)
print(server.getwelcome())
# 认证:
server.user(email)
server.pass_(password)
print('Messages: %s. Size: %s' % server.stat())
#新建文件,保存邮件。但是这是没有解析的文件格式
myfile = file("testit.txt", 'w')
resp, mails, octets = server.list()
# 获取最新一封邮件, 注意索引号从1开始:
for i in range(1,len(mails)):
    resp, lines, octets = server.retr(i)
# 解析邮件:
    msg = Parser().parsestr('\r\n'.join(lines))
# 打印邮件内容到控制台:
    print_info(msg)
    #打印到文件夹,但是格式没有解析
    print >> myfile,msg


# 慎重:将直接从服务器删除邮件:
# server.dele(len(mails))
# 关闭连接:
myfile.close()
#关闭文件
server.quit()

email:账号
password:授权码
pop3-server:(如)pop3.qq.com
用Python的poplib模块收取邮件分两步:第一步是用POP3协议把邮件获取到本地,第二步是用email模块把原始邮件解析为Message对象,然后,用适当的形式把邮件内容展示给用户即可。

————————-8/16日补充
java正则抓取网页上的邮箱

    import java.io.BufferedReader;  
    import java.io.File;  
    import java.io.FileWriter;  
    import java.io.InputStreamReader;  
    import java.io.Writer;  
    import java.net.URL;  
    import java.net.URLConnection;  
    import java.sql.Time;  
    import java.util.Scanner;  
    import java.util.regex.Matcher;  
    import java.util.regex.Pattern;  
    public class wangye {  
        public static void main(String[] args) throws Exception {// 本程序内部异常过多为了简便,不一Try,直接抛给虚拟机  
            Long StartTime = System.currentTimeMillis();  
            System.out.println("--请输入正确的网址如http://www.baidu.com--");  
            Scanner input = new Scanner(System.in);// 实例化键盘输入类  

            String webaddress = input.next();// 创建输入对象  
            File file = new File("D:" + File.separator + "test.txt");// 实例化文件类对象  

                                                                    // 并指明输出地址和输出文件名  

            Writer outWriter = new FileWriter(file);// 实例化outWriter类  

            URL url = new URL(webaddress);// 实例化URL类。  

            URLConnection conn = url.openConnection();// 取得链接  

            BufferedReader buff = new BufferedReader(new InputStreamReader(  

                                                    conn.getInputStream()));// 取得网页数据  

            String line = null;  
            int i=0;  
            String regex = "\\w+@\\w+(\\.\\w+)+";// 声明正则,提取网页前提  

            Pattern p = Pattern.compile(regex);// 为patttern实例化  

            outWriter.write("该网页中所包含的的邮箱如下所示:\r\n");  
            while ((line = buff.readLine()) != null) {  

                Matcher m = p.matcher(line);// 进行匹配  

                while (m.find()) {  
                    i++;  
                    outWriter.write(m.group() + ";\r\n");// 将匹配的字符输入到目标文件  
                }  
            }  
            Long StopTime = System.currentTimeMillis();  
            String UseTime=(StopTime-StartTime)+"";  
            outWriter.write("--------------------------------------------------------\r\n");  
            outWriter.write("本次爬取页面地址:"+webaddress+"\r\n");  
            outWriter.write("爬取用时:"+UseTime+"毫秒\r\n");  
            outWriter.write("本次共得到邮箱:"+i+"条\r\n");  
            outWriter.write("****谢谢您的使用****\r\n");  
            outWriter.write("--------------------------------------------------------");  
            outWriter.close();// 关闭文件输出操作  
            System.out.println(" —————————————————————\t");  
            System.out.println("|页面爬取成功,请到D盘根目录下查看test文档|\t");  
            System.out.println("|                                         |");  
            System.out.println("|如需重新爬取,请再次执行程序,谢谢您的使用|\t");  
            System.out.println(" —————————————————————\t");  
        }  
    }  

在新建一个调用的类pawenjian打印输出结果

import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileReader;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
public class pawenjian {  
    public static void main(String[] args)throws Exception {  
        BufferedReader buff=new BufferedReader(new FileReader("D:"+File.separator+"test.txt"));  

        String line=null;  
        String regex="\\w+@\\w+(\\.\\w+)+";  
        Pattern p=Pattern.compile(regex);  
        while ((line=buff.readLine())!= null) {  
            Matcher m=p.matcher(line);  
            while (m.find()) {  
                System.out.println(m.group()+";");  

            }  
        }  
    }  
}  

结果如下:

该网页中所包含的的邮箱如下所示:
--------------------------------------------------------
本次爬取页面地址:http://tieba.baidu.com/p/3908710053
爬取用时:4024毫秒
本次共得到邮箱:0条
****谢谢您的使用****
--------------------------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
python爬虫与项目实战,网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。 随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如: (1)不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。 (2)通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。 (3)万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。 (4)通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。 网络爬虫 为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫(general purpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。 传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值