【工作记录】爬虫

因为工作需要,有时候需要自己看邮箱里得内容。
代码如下:可以先拿去跑一跑,注意密码是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条
****谢谢您的使用****
--------------------------------------------------------
posted @ 2016-08-09 12:17  Tesi1a  阅读(124)  评论(0编辑  收藏  举报