发表于 2015-9-28 19:18

申请ID:刘福帅【申请通过】

1、申请ID:刘福帅
2、个人邮箱:1051295114@qq.com
3、原创技术文章: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").text1、初始化Beautiful Soupsoup = BeautifulSoup(html) # html为html源代码字符串,type(html) == str到这里,先不急着写下去。先观察一下待抓取页面的源代码,定位到两本特价书处http://lfs1234-lfs1234.stor.sinaapp.com/uploads/2015/04/kindle.jpg可以发现,这两本特价书的书名、图片、链接、价格都包含在了几个HTML结构里面。所以,就要用到Beautiful Soup结构化数据的方法: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
# <aid="link1">Elsie</a>
soup.find_all('a')
# [<aid="link1">Elsie</a>,
#<aid="link2">Lacie</a>,
#<aid="link3">Tillie</a>]
soup.find(id="link3")
# <aid="link3">Tillie</a>
2、获取书名、图片、链接、价格table = soup.body.find_all("table")
name = table.find_all("tr")

result["name"].append(name.find_all("td").b.string)
result["name"].append(name.find_all("td").b.string)

desc = table.find_all("tr")

book_1 = desc.find_all("td")
result["cover"].append(book_1.a.img["src"])
result["link"].append("http://www.amazon.cn" + book_1.a["href"])
result["desc"].append(book_1.contents)
result["price"].append(book_1.find_all("p").b.span.string)

book_2 = desc.find_all("td")
result["cover"].append(book_2.a.img["src"])
result["link"].append("http://www.amazon.cn" + book_2.a["href"])
result["desc"].append(book_2.contents)
result["price"].append(book_2.find_all("p").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。由于第一种会话方式需要邮件接收者必须在这个服务器上存在,而且很有可能被当做垃圾邮件拒收,所以这里我们选择第二种会话方式。请看代码mail_config = {
    "from": "YOUR USER NAME@163.com",
    "to": "YOUR USER NAME@sina.com",
    "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())
在本地编译器上调试通过,会看到自己的送信邮箱的已发邮件列表里面有一封发送成功的邮件,而收信邮箱已经收到了今天的特价书信息,真是皆大欢喜,怕手称快。http://lfs1234-lfs1234.stor.sinaapp.com/uploads/2015/04/Kindle%E7%89%B9%E4%BB%B7%E4%B9%A6.jpg欣喜之余,可回过头来想一下,这样的一个脚本是必须要有运行环境的,爬取特价书是需要联网的。本来是要解决每天打开浏览器的麻烦,现在似乎更加繁琐了,还要打开电脑,运行脚本。有这个的时间早背十几个单词了,还不如直接自己看呢!理想的情况是,每天早晨醒来,特价书信息已经躺在邮箱里面,只需我睁开眼睛瞄一下就可以知道今天有哪些好书了。有没有解决的办法呢?答案是,有!请看下一篇   将python脚本部署到SAE并定时执行Cron作业这个是博客后台登录截图

Hmily 发表于 2015-10-10 18:35

ID:刘福帅
邮箱:1051295114@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

刘福帅 发表于 2015-10-12 10:07

Hmily 发表于 2015-10-10 18:35
ID:刘福帅
邮箱:


新人刘福帅前来报到

刘福帅 发表于 2015-10-12 10:10

新人刘福帅前来报道
页: [1]
查看完整版本: 申请ID:刘福帅【申请通过】