1、申请ID:刘福帅
2、个人邮箱:1051295114@qq.com
3、原创技术文章:[size=1.6]python 用BeautifulSoup爬取kindle今日特价书
原文在我的个人技术博客:http://www.liufushuai.com/?p=163
以下为原文
序言 原谅我才疏学浅,发现Beautiful Soup这个库的时候确实被惊艳到了。Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree)。 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作。 install什么的,看这里 -> http://www.crummy.com/software/BeautifulSoup/ 应用 既然这么好用,当然就要做点东西来玩了。做点什么好呢?之前一直每天登陆亚马逊网站查看今天的Kindle特价书,甚是麻烦。何不写一个脚本,每天定点登陆特价书页面,然后把爬取到的内容邮件发给我呢?恩,此想法甚好,马上开工。 0、获取Kindle特价书页面 def get_page():
return requests.get("http://t.cn/Rvm4xgc").text 1、初始化Beautiful Soup soup = BeautifulSoup(html) # html为html源代码字符串,type(html) == str 到这里,先不急着写下去。先观察一下待抓取页面的源代码,定位到两本特价书处 可以发现,这两本特价书的书名、图片、链接、价格都包含在了几个HTML结构里面。所以,就要用到Beautiful Soup结构化数据的方法: [Python] 纯文本查看 复制代码 soup.title
# <title>The Dormouse's story</title>
soup.title.name
# u'title'
soup.title.string
# u'The Dormouse's story'
soup.title.parent.name
# u'head'
soup.p
# <p><b>The Dormouse's story</b></p>
soup.p['class']
# u'title'
soup.a
# <a id="link1">Elsie</a>
soup.find_all('a')
# [<a id="link1">Elsie</a>,
# <a id="link2">Lacie</a>,
# <a id="link3">Tillie</a>]
soup.find(id="link3")
# <a id="link3">Tillie</a>
2、获取书名、图片、链接、价格 [Python] 纯文本查看 复制代码 table = soup.body.find_all("table")[6]
name = table.find_all("tr")[1]
result["name"].append(name.find_all("td")[0].b.string)
result["name"].append(name.find_all("td")[2].b.string)
desc = table.find_all("tr")[2]
book_1 = desc.find_all("td")[0]
result["cover"].append(book_1.a.img["src"])
result["link"].append("[url=http://www.amazon.cn]http://www.amazon.cn[/url]" + book_1.a["href"])
result["desc"].append(book_1.contents[1])
result["price"].append(book_1.find_all("p")[1].b.span.string)
book_2 = desc.find_all("td")[2]
result["cover"].append(book_2.a.img["src"])
result["link"].append("[url=http://www.amazon.cn]http://www.amazon.cn[/url]" + book_2.a["href"])
result["desc"].append(book_2.contents[1])
result["price"].append(book_2.find_all("p")[1].b.span.string) 代码很简单,对照文档很容易理解就不做解释了。OK,到这里特价书信息就抓取完毕,接下来就是收获的季节了,发送到自己的邮箱,这样就可以很方便的随时查看特价书信息了。发送邮件用到了 smtplib 这个模块,请看介绍。 3、发送邮件 python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
smtp协议的基本命令包括:
HELO 向服务器标识用户身份
MAIL 初始化邮件传输 mail from:
RCPT 标识单个的邮件接收人;常在MAIL命令后面,可有多个rcpt to:
DATA 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化数据传输,以.结束
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应OK
QUIT 结束会话
RSET 重置会话,当前传输被取消
MAIL FROM 指定发送者地址
RCPT TO 指明的接收者地址
一般smtp会话有两种方式,一种是邮件直接投递,就是说,比如你要发邮件給zzz@163.com,那就直接连接163.com的邮件服务器,把信投給zzz@163.com; 另一种是验证过后的发信,它的过程是,比如你要发邮件給zzz@163.com,你不是直接投到163.com,而是通过自己在sina.com的另一个邮箱来发。这样就要先连接sina.com的smtp服务器,然后认证,之后在把要发到163.com的信件投到sina.com上,sina.com会帮你把信投递到163.com。 由于第一种会话方式需要邮件接收者必须在这个服务器上存在,而且很有可能被当做垃圾邮件拒收,所以这里我们选择第二种会话方式。请看代码 [Python] 纯文本查看 复制代码 mail_config = {
"from": "YOUR USER [url=mailto:NAME@163.com]NAME@163.com[/url]",
"to": "YOUR USER [url=mailto:NAME@sina.com]NAME@sina.com[/url]",
"server": "smtp.163.com",
"username": "YOUR USER NAME",
"pwd": "YOUR PASS WORD"
}
def send_mail(sbj, content, from_whom=mail_config['from'], to_whom=mail_config['to'], server=mail_config['server'],
username=mail_config['username'], pwd=mail_config['pwd']):
msg = MIMEText(content, "html", "utf-8")
msg['Subject'] = Header(sbj, "utf-8")
msg['From'] = from_whom
msg['To'] = to_whom
s = smtplib.SMTP(server)
s.ehlo()
s.starttls()
s.login(username, pwd)
s.sendmail(from_whom, to_whom, msg.as_string())
在本地编译器上调试通过,会看到自己的送信邮箱的已发邮件列表里面有一封发送成功的邮件,而收信邮箱已经收到了今天的特价书信息,真是皆大欢喜,怕手称快。 欣喜之余,可回过头来想一下,这样的一个脚本是必须要有运行环境的,爬取特价书是需要联网的。本来是要解决每天打开浏览器的麻烦,现在似乎更加繁琐了,还要打开电脑,运行脚本。有这个的时间早背十几个单词了,还不如直接自己看呢!理想的情况是,每天早晨醒来,特价书信息已经躺在邮箱里面,只需我睁开眼睛瞄一下就可以知道今天有哪些好书了。有没有解决的办法呢?答案是,有!请看下一篇 将python脚本部署到SAE并定时执行Cron作业
这个是博客后台登录截图
|