Python 通过电子邮件发送结果的抓取工具
Python crawler which than sends out results via email
感谢您的帮助。
所以我试着做一个小爬虫来检查 reddit 的 gif 页面,然后写下所有的 gif + 标题,把它们放在一个列表中,然后通过电子邮件发送这个列表 (给我的同事).
到目前为止一切顺利,运行完美,但它发送的列表看起来像这样
例如:
'1. Old man dancing at electronic music festival: http://i.imgur.com/2EtphXY.gifv', '2. Generation text..: http://i.imgur.com/fH6eV2B.gifv', '3. Porcupine climbs up for warmth:
等...
我想要什么? 我希望标题 + 链接在电子邮件中按单行打印 + 我想在其中添加文本。
像这样
Hello friends welcome to daily gifs
- title1: link1
- title2: link2
- title3: link3
到目前为止,这是我的代码:
import requests
from bs4 import BeautifulSoup
import urllib2
import smtplib
import time
import random
import datetime
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
url = 'https://www.reddit.com/r/gifs/?count=26&before=t3_3u4mnz'
response = opener.open(url)
page = response.read()
soup = BeautifulSoup(page, "lxml")
list = []
variable = 1
for link in soup.findAll('a', {'class': 'title may-blank '}):
href = link.get('href')
name = link.string
#print str(variable) + ". " + name + " : " + href
list.append(str(str(variable) + ". " + name + ": " + href))
variable += 1
GMAIL_USERNAME = "blabla@blabla.com"
GMAIL_PASSWORD = "xxxxxxxx"
email_subject = "Lunchtime gifs of the day: " + str(time.strftime("%d/%m/%Y"))
recipient = "workfriends@blabla.com"
body_of_email = str(list)[1:-1]
session = smtplib.SMTP('smtp.gmail.com', 587)
session.ehlo()
session.starttls()
session.login(GMAIL_USERNAME, GMAIL_PASSWORD)
headers = "\r\n".join(["from: " + GMAIL_USERNAME,
"subject: " + email_subject,
"to: " + recipient,
"mime-version: 1.0",
"content-type: text/html"])
content = headers + "\r\n\r\n" + body_of_email
session.sendmail(GMAIL_USERNAME, recipient, content)
print "Email send!"
电子邮件的内容类型是使用 Content-Type
header 确定的。您已指定电子邮件的内容类型为 text/html
,阅读此电子邮件的客户会将这些位解释为 HTML。
所以,让您发送的比特看起来像 HTML。我会使用 <br />
或 <ol />
<li />
标签。或者,将电子邮件作为 text/plain
发送,您的 \n
字符将按照您的预期进行解释。
就我个人而言,对于这样的电子邮件,我更喜欢它们采用 text/plain
格式。
尝试在你的 for 循环中使用这一行。
list.append(str(str(variable) + ". " + name + ": " + href+"\n"))
这应该可以解决问题。
尝试 yagmail:
import yagmail
yag = yagmail.SMTP('gmail_username', 'gmail_password')
yag.send('to@email.com', 'subjectline', contents='content')
注意内容会被放入HTML。所以你也可以从字面上只放像这样的东西:
contents = ['<h1>title1</h1><a href="link1">link1</a>',
'<h1>title2</h1><a href="link2">link2</a>'
等等
使用 pip install yagmail
获取您的 yagmail 副本。
完全披露:我是 yagmail 的开发者。
感谢您的帮助。 所以我试着做一个小爬虫来检查 reddit 的 gif 页面,然后写下所有的 gif + 标题,把它们放在一个列表中,然后通过电子邮件发送这个列表 (给我的同事).
到目前为止一切顺利,运行完美,但它发送的列表看起来像这样 例如:
'1. Old man dancing at electronic music festival: http://i.imgur.com/2EtphXY.gifv', '2. Generation text..: http://i.imgur.com/fH6eV2B.gifv', '3. Porcupine climbs up for warmth:
等...
我想要什么? 我希望标题 + 链接在电子邮件中按单行打印 + 我想在其中添加文本。 像这样
Hello friends welcome to daily gifs
- title1: link1
- title2: link2
- title3: link3
到目前为止,这是我的代码:
import requests
from bs4 import BeautifulSoup
import urllib2
import smtplib
import time
import random
import datetime
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
url = 'https://www.reddit.com/r/gifs/?count=26&before=t3_3u4mnz'
response = opener.open(url)
page = response.read()
soup = BeautifulSoup(page, "lxml")
list = []
variable = 1
for link in soup.findAll('a', {'class': 'title may-blank '}):
href = link.get('href')
name = link.string
#print str(variable) + ". " + name + " : " + href
list.append(str(str(variable) + ". " + name + ": " + href))
variable += 1
GMAIL_USERNAME = "blabla@blabla.com"
GMAIL_PASSWORD = "xxxxxxxx"
email_subject = "Lunchtime gifs of the day: " + str(time.strftime("%d/%m/%Y"))
recipient = "workfriends@blabla.com"
body_of_email = str(list)[1:-1]
session = smtplib.SMTP('smtp.gmail.com', 587)
session.ehlo()
session.starttls()
session.login(GMAIL_USERNAME, GMAIL_PASSWORD)
headers = "\r\n".join(["from: " + GMAIL_USERNAME,
"subject: " + email_subject,
"to: " + recipient,
"mime-version: 1.0",
"content-type: text/html"])
content = headers + "\r\n\r\n" + body_of_email
session.sendmail(GMAIL_USERNAME, recipient, content)
print "Email send!"
电子邮件的内容类型是使用 Content-Type
header 确定的。您已指定电子邮件的内容类型为 text/html
,阅读此电子邮件的客户会将这些位解释为 HTML。
所以,让您发送的比特看起来像 HTML。我会使用 <br />
或 <ol />
<li />
标签。或者,将电子邮件作为 text/plain
发送,您的 \n
字符将按照您的预期进行解释。
就我个人而言,对于这样的电子邮件,我更喜欢它们采用 text/plain
格式。
尝试在你的 for 循环中使用这一行。
list.append(str(str(variable) + ". " + name + ": " + href+"\n"))
这应该可以解决问题。
尝试 yagmail:
import yagmail
yag = yagmail.SMTP('gmail_username', 'gmail_password')
yag.send('to@email.com', 'subjectline', contents='content')
注意内容会被放入HTML。所以你也可以从字面上只放像这样的东西:
contents = ['<h1>title1</h1><a href="link1">link1</a>',
'<h1>title2</h1><a href="link2">link2</a>'
等等
使用 pip install yagmail
获取您的 yagmail 副本。
完全披露:我是 yagmail 的开发者。