数据挖掘小技巧之python邮箱爬虫
这里带来利用python实现网易163邮箱个人收件箱列表信息的爬取的小项目,熟悉数据抓取及爬虫登录的过程。
主要内容
1. 模拟163邮箱登录
2. 获取登录后的收件箱页面
3. 分析页面得到所有邮件的列表的信息
主要思路
经过对163邮箱的登陆过程的分析,其登陆过程需要:
1. 手动登录获得登录过程的信息
2. 分析登陆过程所需的参数
3. 向登录界面发送登录请求,POST 一系列参数,获得响应,及登录的cookie
4. 提取登录所需要的sid码
5. 利用sid码和cookie重新请求,获得响应,重定向网页,获取页面信息
6. 利用正则表达式提取相关信息
接下来为大家介绍详细的过程。
前期准备
首先我们打开网易邮箱的登录界面http://mail.163.com/,我用的是Firefox浏览器,右键查看元素或者f12打开设置里的启用持续日志这样我们就可以在登录后查看登陆过程提交的请求等参数,否则页面跳转就抓取不到这个信息。
然后选择网络选项,这是时空的,然后输入账号密码登录,登陆后会发现网络选项中出现下图所示
拉到最上边我们会发现一条post的日志,这就是登录时提交的参数信息。点击进入这条日志,就会显示消息头,请求网址,参数等。点击参数选项会看到一个表单数据,这个里边就记录了你提交的 用户名,密码,以及产生错误跳转的url。
这时细心的你可以看到地址栏的URL已经变了,而且在URL中有一串名为sid的参数
mail.163.com/js6/main.jsp?sid=XCwPLNlNiskqLJBOvaNNyAURxrosaJnJ&df=mail163_lette
这个sid码就是我们登录的关键,下面我来说明怎么得到这个sid码。
获取sid码
刚才我们选中了那个post日志,选择消息头,我们可以看到这次日志请求网址
这里请求的网址和我们目前所在的网址并不一样,这说明我们登陆时经过了这么一个中转的网址,想看到这个网址下是什么,很简单,点开上面的响应选项你就可以看到这个网址下是什么内容。
通过这个响应我们可以发现,我们提交的参数中并没有这个sid码,但是在响应中出现了这个sid码,因此这个sid码使我们登陆所需要的。但是这个sid码只在本次登录有效,并不能一劳永逸,所以我们每次登录都需要通过这个中转界面来获取这个sid码。这是我们就需要来获取这个页面的源码并提取这个sid码。
#构建抓取sid码的正则表达式
sidpattern = re.compile('sid=(.*?)&',re.S)#获取并储存sid码,打印出来
result = re.search(sidpattern,content)self.sid = result.group(1)print self.sid
PS:正则表达式中 .*? 是一个很好用的组合,re.S是点任意匹配模式。
这样我们就成功抓取到了sid码,并且得到了登录时所需要的cookie。下一步要用抓取到的sid码来登录邮箱
登录邮箱
获取到了sid码之后我们就能登录邮箱了。
进入收件箱,点开响应选项,找到所有的post的日志,我们会发现有一个日志中的响应会是我们的邮件信息,这个就是我们需要的登陆的参数和信息:
点开消息头这个请求的网址就是我们收件箱的地址,并且这个请求网址中有我们刚提
取出来的sid码,所以我们只需要重定向到这个网址就能获得我们收件箱的页面信息
了。这里我们只需要重置请求头,利用上边已获得的cookie和sid码重新请求就行了.
提取邮件列表基本信息
根据以上登录的过程之后得到的内容我们会得到像下面这样的结果
...
<object>
<string name="id">48:1tbiMA34VVWBT7UDcQAAsM</string>
<int name="fid">1</int>
<int name="size">10183</int>
<string name="from">"网易邮件中心" <mail@service.netease.com></string>
<string name="to">"xxxxxxxxxxx.com" <xxxxxxxxx@163.com></string>
<string name="subject">丙申猴年,你的大圣,可会归来?</string>
<date name="sentDate">2016-01-23 12:30:37</date>
<date name="receivedDate">2016-01-23 12:30:37</date>
<int name="priority">3</int>
<int name="backgroundColor">0</int>
<string name="antiVirusStatus">unscaned</string>
<int name="label0">0</int>
<object name="flags">
<boolean name="read">true</boolean></object>
<object name="ctrls">
<string name="RulesType">ntessys</string></object>
<string name="hmid"><2134498648.1996962.1453523436698.JavaMail.mail@service.netease.com&
gt;</string></object>
<object>
...
这些代码段就是我们收件箱的基本信息,每个 object 标签中都包含了一个邮件的发件方、收件方、邮件主题、收发时间等信息。我们要做的就是利用正则表达式把这些信息提取出来(当然也可以用beautifulsoup来提取),并输出。每个标签中的内容都一样.
这样就可以输出收件箱所有邮件列表的基本信息。
下文附上源码
本文由DeepDataX团队的数据挖掘高手
万能xiaolong原创,转载请注明
DeepDataX
专注大数据、金融的前沿介绍,相关编程技术学习
(长按识别二维码关注)
查看评论 回复