笔记,邮件(2)

关于邮件的第二个例子,包含简单爬虫、文件写入等多方面的综合,写的不简练,后续改进。其中不少print是自己的调试和思路。

 

# coding=utf8
import urllib
import urllib.request as request
from bs4 import BeautifulSoup
import re
import smtplib
from email.mime.text import MIMEText
import string
import csv

# 发送邮件
def sendMail(body, locate):
    # 然后将第二天的任务添加到盒子中
    user = '***@126.com'
    pwd = 'xxx'
    to = '###@qq.com'
    msg = MIMEText('早上好!\r\n' + body)
    msg['Subject'] = locate + '地区天气预报'
    msg['From'] = user
    msg['To'] = to
    s = smtplib.SMTP()  # SMTP开通说明,详见http://www.cnblogs.com/testyao/p/6044410.html
    s.connect('smtp.126.com')  # 使用connect方法链接到126邮箱,一般端口是25,省略不写
    s.login(user, pwd)
    s.set_debuglevel(1)
    s.sendmail(user, to, msg.as_string())
    s.quit()


response = request.urlopen('http://www.weather.com.cn/weather/101020100.shtml')
html = response.read()
data = html.decode("utf-8")
soup = BeautifulSoup(data, "html.parser")
site = soup.find_all("a", href="http://sh.weather.com.cn") #匹配地址
day1 = soup.find_all("ul", {"class": "t clearfix"})
wea = soup.find_all("p", {"class": "wea"}) #匹配天气情况
tem = soup.find_all("p", {"class": "tem"}) #匹配温度
win = soup.find_all("p", {"class": "win"}) #匹配风速
days = soup.find_all("h1") #匹配日期

for locate1 in site:
   # print(locate1.get_text())
    locate = locate1.get_text()

# plan 0  思路是先在网上爬取,以规范格式(csv)存储到本地目录,然后整体读取,再以邮件形式发送,很麻烦。关键是字典的规范使用无法掌握,所以程序有点臃肿
csvFile = open(r"weather.csv", 'w+')  #如果csv数据带有空格,读取容易出错,格式不统一
writer = csv.writer(csvFile)
subkeys = ['日期', '天气', '气温', '风速']
writer.writerow(subkeys)
weather = {}

i = 0
for tt in days[0:7]:  #七天的天气,索取日期
    weather['日期'] = days[i].get_text().replace("\n", " ")  # 获取纯字符,并去掉换行符
 #   print(weather)
    for wea0 in wea:
      #  print(wea0[i].get_text().replace("\n", " "))
        weather['天气'] = wea[i].get_text().replace("\n", " ")
        for tem0 in tem:
            weather['气温'] = tem[i].get_text().replace("\n", " ")
            for win0 in win:
                weather['风速'] = ''.join(win[i].get_text().replace("\n", " ").split(' ')) #去掉文字中间空格
               # print(weather)

    i += 1
    aa = dict([(key, weather[key]) for key in subkeys])  # 按照固定顺序输出
    writer.writerow(aa[key] for key in subkeys)  # 挑选对应名单的行

csvFile.close()
f = open(r"weather.csv", "r")
lines = f.readlines()
f.close()
print(lines)
    #  for key, value in weather.items():
  #      print(key, value)
#print(weather_new)
#print(type(weather))
#str_weather = str(weather_new)  # dict 转为 str
#print(str_weather)
#print(type(str_weather))
sendMail("".join(lines), locate)


# plan 1 随便写的,比较简单,但是发送内容比较乱、不美观。调试,邮箱都发爆了...
weather1 = []
for tem in day1:
    weather1.append(tem.get_text().replace("\n", " "))  # 将换行转为空格
    weather1.append("\r\n")
#print(weather1)
#print(type(weather1))
str_weather1 = "".join(weather1)  # list 转为 str
#print(str_weather1)
#print(type(str_weather1))
sendMail(str_weather1, locate)

结果(两个版本比较):

 

plan 0

plan 1

 

posted @ 2016-11-21 14:56  CC_python  阅读(95)  评论(0)    收藏  举报