python爬虫-获取个人网易邮箱所有邮件列表信息

python爬⾍-获取个⼈⽹易邮箱所有邮件列表信息
最近开始了python爬⾍的学习,这⾥带来利⽤python实现⽹易163邮箱个⼈收件箱列表信息的爬取的⼩项⽬,刚开始学习,写的不好的地⽅,望⼤神指正,诚恳学习。
主要内容
1. 模拟163邮箱登录
2. 获取登录后的收件箱页⾯
3. 分析页⾯得到所有邮件的列表的信息
主要思路
经过对163邮箱的登陆过程的分析,其登陆过程需要:
1. ⼿动登录获得登录过程的信息
2. 分析登陆过程所需的参数
3. 向登录界⾯发送登录请求,POST ⼀系列参数,获得响应,及登录的cookie
4. 提取登录所需要的sid码
5. 利⽤sid码和cookie重新请求,获得响应,重定向⽹页,获取页⾯信息
6. 利⽤正则表达式提取相关信息
接下来为⼤家介绍详细的过程。
前期准备
然后选择⽹络选项,这是时空的,然后输⼊账号密码登录,登陆后会发现⽹络选项中出现下图所⽰acceptlanguage
拉到最上边我们会发现⼀条post的⽇志,这就是登录时提交的参数信息。点击进⼊这条⽇志,就会显
⽰消息头,请求⽹址,参数等。点击参数选项会看到⼀个表单数据,这个⾥边就记录了你提交的 ⽤户名,密码,以及产⽣错误跳转的url。
这时细⼼的你可以看到地址栏的URL已经变了,⽽且在URL中有⼀串名为sid的参数
mail.163/js6/main.jsp?sid=XCwPLNlNiskqLJBOvaNNyAURxrosaJnJ&df=mail163_lette
这个sid码就是我们登录的关键,下⾯我来说明怎么得到这个sid码。
获取sid码
刚才我们选中了那个post⽇志,选择消息头,我们可以看到这次⽇志请求⽹址
这⾥请求的⽹址和我们⽬前所在的⽹址并不⼀样,这说明我们登陆时经过了这么⼀个中转的⽹址,想看到这个⽹址下是什么,很简单,点开
上⾯的响应选项你就可以看到这个⽹址下是什么内容。
通过这个响应我们可以发现,我们提交的参数中并没有这个sid码,但是在响应中出现了这个sid码,因此这个sid码使我们登陆所需要的。
但是这个sid码只在本次登录有效,并不能⼀劳永逸,所以我们每次登录都需要通过这个中转界⾯来获取这个sid码。这是我们就需要来获取
这个页⾯的源码并提取这个sid码。下⾯附上我的代码。
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import cookielib
#163邮箱类
class MAIL:
#初始化
def__init__(self):
#获取登录请求的⽹址,也就是上边提到的请求⽹址
self.loginUrl = "mail.163/entry/cgi/ntesdoor?df=mail163_letter&from=web&funcid=loginone&iframe=1&language=-1&passtype=1&product=m #设置代理,以防⽌本地IP被封
self.proxyUrl = "202.106.16.36:3128"
#初始化sid码
self.sid = ""
#第⼀次登陆所需要的请求头request headers,这个在消息头⾥的请求头有
self.loginHeaders = {
'Host':"mail.163",
'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",
'Accept':"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
'Accept-Language':"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
'Accept-Encoding':"gzip, deflate, br",
'Referer':"mail.163/",
'Connection':"keep-alive",
}
#设置⽤户名和密码,输⼊⾃⼰的账号密码
self.username = '*******'
self.pwd = '*******'
#post所包含的参数也就是参数⾥的表单数据
self.post = {
'savelogin':"0",
'url2':"mail.163/errorpage/error163.htm",
'username':self.username,
'password':self.pwd
}
#对post编码转换
self.postData = urllib.urlencode(self.post)
#设置代理
self.proxy = urllib2.ProxyHandler({'http':self.proxyUrl})
#设置cookie对象,会在登录后获取登录⽹页的cookie
#设置cookie处理器
#设置登录时⽤到的opener,相当于我们直接打开⽹页⽤的urlopen
self.opener = urllib2.build_kieHandler,self.proxy,urllib2.HTTPHandler)
#模拟登陆并获取sid码
def loginPage(self):
#发出⼀个请求
request = urllib2.Request(self.loginUrl,self.postData,self.loginHeaders)
#得到响应
response = self.opener.open(request)
#需要将响应中的内容⽤read读取出来获得⽹页代码,⽹页编码为utf-8
content = ad().decode('utf-8')
#打印获得的⽹页代码
print content
#⽣成邮箱爬⾍对象
mail = MAIL()
#调⽤loginPage⽅法来获取⽹页内容
mail.loginPage()
登陆成功的话可以看到输出的结果为
<html><head><script type="text/javascript">top.location.href = "mail.163/js6/main.jsp?sid=DCTmVAgAnZBmwWWqcjAAXXreaiJVaZYk&df=mail16这⾥做⼀点说明:
上⾯需要填⼊⾃⼰的账号密码,代理设置中很多代理不能⽤,这个亲测可⽤
这样我们就得到了中转界⾯的页⾯代码,⾥边就有我们需要的sid码。如何提取这个sid码呢?我们就需要⽤正则表达式来匹配他。相应的提
取代码如下,把其加⼊到loginPage中即可
#构建抓取sid码的正则表达式
sidpattern = repile('sid=(.*?)&',re.S)
#获取并储存sid码,打印出来
result = re.search(sidpattern,content)
self.sid = up(1)
print self.sid
PS:正则表达式中 .*? 是⼀个很好⽤的组合,re.S是点任意匹配模式。
这样我们就成功抓取到了sid码,并且得到了登录时所需要的cookie。下⼀步要⽤抓取到的sid码来登录邮箱
登录邮箱
获取到了sid码之后我们就能登录邮箱了。
进⼊收件箱,点开响应选项,到所有的post的⽇志,我们会发现有⼀个⽇志中的响应会是我们的邮件信息,这个就是我们需要的登陆的参
数和信息:
点开消息头这个请求的⽹址就是我们收件箱的地址,并且这个请求⽹址中有我们刚提取出来的sid码,所以我们只需要重定向到这个⽹址就
能获得我们收件箱的页⾯信息了。这⾥我们只需要重置请求头,利⽤上边已获得的cookie和sid码重新请求就⾏了,下⾯附上代码:
#通过sid码获得邮箱收件箱信息
def messageList(self):
#重定向的⽹址,⽤获取到的sid码替换
listUrl = 'mail.163/js6/s?sid=%s&func=mbox:listMessages&TopTabReaderShow=1&TopTabLofterShow=1&welcome_welcomemodule_mailr #新的请求头
Headers = {
'Host':"mail.163",
'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",
'Accept':"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
'Accept-Language':"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
'Accept-Encoding':"gzip, deflate, br",
'Referer':"mail.163/js6/main.jsp?sid=%s&df=mail163_letter"%self.sid,
'Connection':"keep-alive"
}
#发出请求并获得响应
request = urllib2.Request(listUrl,headers = Headers)
print listUrl
response = self.opener.open(request)
#提取响应的页⾯内容
content = ad().decode('utf-8')
return content
当然我们也可以打印出相应的内容以⽅便我们做后续的处理
print content
这样我们就得到了收件箱页⾯的邮件列表信息,下边来解析这页代码。
提取邮件列表基本信息
输出刚才的内容我们会得到像下⾯这样的结果
...
<object>
<string name="id">48:1tbiMA34VVWBT7UDcQAAsM</string>
<int name="fid">1</int>
<int name="size">10183</int>
<string name="from">"⽹易邮件中⼼" <mail@serviceease></string>
<string name="to">"xxxxxxxxxxx" <xxxxxxxxx@163></string>
<string name="subject">丙申猴年,你的⼤圣,可会归来?</string>
<date name="sentDate">2016-01-2312:30:37</date>
<date name="receivedDate">2016-01-2312: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@serviceease></string></object>
<object>
...
这些代码段就是我们收件箱的基本信息,每个 object 标签中都包含了⼀个邮件的发件⽅、收件⽅、邮件主题、收发时间等信息。我们要做
的就是利⽤正则表达式把这些信息提取出来(当然也可以⽤beautifulsoup来提取),并输出。每个标签中的内容都⼀样,故正则表达式及
代码如下:
#获取邮件信息
def getmail(self):
#先获得收件箱列表页⾯内容
messages = ssageList()
#信息提取的正则表达式
pattern = repile('<string name="from">"(.*?)".*?name="to">(.*?)<.*?name="subject">(.*?)<.*?name="sentDate">(.*?)<.*?name="receivedDate">(.*?
#re模块中的findall会出所有匹配的字符串,返回⼀个列表
mails = re.findall(pattern,messages)
#遍历列表输出中相应项的内容,每个(.*?)对应了相应的项
for mail in mails:
print'-'*50
print'发件⼈',mail[0],'主题',mail[2],'发送时间',mail[3]
print'收件⼈',mail[1],u'接收时间',mail[4]
这样就可以输出收件箱所有邮件列表的基本信息。
下⾯附上完整代码:
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import cookielib
#163邮箱类
class MAIL:
#初始化
def__init__(self):
#获取登录请求的⽹址
self.loginUrl = "mail.163/entry/cgi/ntesdoor?df=mail163_letter&from=web&funcid=loginone&iframe=1&language=-1&passtype=1&product=m #设置代理,以防⽌本地IP被封
self.proxyUrl = "202.106.16.36:3128"
#初始化sid码
self.sid = ""
#第⼀次登陆所需要的请求头request headers
self.loginHeaders = {

本文发布于:2024-09-21 22:20:34,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/371657.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:登录   信息   邮件   列表   请求   参数   登陆   获得
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议