您的位置:首页 > 其它

【工作记录】爬虫

2016-08-09 12:16 162 查看
因为工作需要,有时候需要自己看邮箱里得内容。

代码如下:可以先拿去跑一跑,注意密码是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条
****谢谢您的使用****
--------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: