2023年11月28日发(作者:)
python爬⾍-获取个⼈⽹易邮箱所有邮件列表信息
最近开始了python爬⾍的学习,这⾥带来利⽤python实现⽹易163邮箱个⼈收件箱列表信息的爬取的⼩项⽬,刚开始学习,写的不好的地
⽅,望⼤神指正,诚恳学习。
主要内容
1. 模拟163邮箱登录
2. 获取登录后的收件箱页⾯
3. 分析页⾯得到所有邮件的列表的信息
/js6/?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):
#获取登录请求的⽹址,也就是上边提到的请求⽹址
#设置代理,以防⽌本地IP被封
rl = "202.106.16.36:3128"
#初始化sid码
= ""
#第⼀次登陆所需要的请求头request headers,这个在消息头⾥的请求头有
eaders = {
'Host':"",
'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0",
rl = "/entry/cgi/ntesdoor?df=mail163_letter&from=web&funcid=loginone&iframe=1&language=-1&passtype=1&product=m
'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':"/",
'Connection':"keep-alive",
}
#设置⽤户名和密码,输⼊⾃⼰的账号密码
me = '*******'
= '*******'
#post所包含的参数也就是参数⾥的表单数据
= {
'savelogin':"0",
'url2':"/errorpage/",
'username':me,
'password':
}
#对post编码转换
ta = ode()
#设置代理
= andler({'http':rl})
#设置cookie对象,会在登录后获取登录⽹页的cookie
= kieJar()
#设置cookie处理器
Handler = okieProcessor()
#设置登录时⽤到的opener,相当于我们直接打开⽹页⽤的urlopen
= _opener(Handler,,ndler)
#模拟登陆并获取sid码
def loginPage(self):
#发出⼀个请求
request = t(rl,ta,eaders)
#得到响应
response = (request)
#需要将响应中的内容⽤read读取出来获得⽹页代码,⽹页编码为utf-8
content = ().decode('utf-8')
#打印获得的⽹页代码
print content
#⽣成邮箱爬⾍对象
mail = MAIL()
#调⽤loginPage⽅法来获取⽹页内容
age()
登陆成功的话可以看到输出的结果为
<html><head><script type="text/javascript"> = "/js6/?sid=DCTmVAgAnZBmwWWqcjAAXXreaiJVaZYk&df=mail16
这⾥做⼀点说明:
上⾯需要填⼊⾃⼰的账号密码,代理设置中很多代理不能⽤,这个亲测可⽤
这样我们就得到了中转界⾯的页⾯代码,⾥边就有我们需要的sid码。如何提取这个sid码呢?我们就需要⽤正则表达式来匹配他。相应的提
取代码如下,把其加⼊到loginPage中即可
#构建抓取sid码的正则表达式
sidpattern = e('sid=(.*?)&',re.S)
#获取并储存sid码,打印出来
result = (sidpattern,content)
self.sid = (1)
print self.sid
PS:正则表达式中 .*? 是⼀个很好⽤的组合,re.S是点任意匹配模式。
这样我们就成功抓取到了sid码,并且得到了登录时所需要的cookie。下⼀步要⽤抓取到的sid码来登录邮箱
登录邮箱
获取到了sid码之后我们就能登录邮箱了。
进⼊收件箱,点开响应选项,找到所有的post的⽇志,我们会发现有⼀个⽇志中的响应会是我们的邮件信息,这个就是我们需要的登陆的参
数和信息:
点开消息头这个请求的⽹址就是我们收件箱的地址,并且这个请求⽹址中有我们刚提取出来的sid码,所以我们只需要重定向到这个⽹址就
能获得我们收件箱的页⾯信息了。这⾥我们只需要重置请求头,利⽤上边已获得的cookie和sid码重新请求就⾏了,下⾯附上代码:
#通过sid码获得邮箱收件箱信息
def messageList(self):
#重定向的⽹址,⽤获取到的sid码替换
#新的请求头
Headers = {
'Host':"",
'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':"/js6/?sid=%s&df=mail163_letter"%,
'Connection':"keep-alive"
}
#发出请求并获得响应
request = t(listUrl,headers = Headers)
print listUrl
response = (request)
#提取响应的页⾯内容
content = ().decode('utf-8')
return content
listUrl = '/js6/s?sid=%s&func=mbox:listMessages&TopTabReaderShow=1&TopTabLofterShow=1&welcome_welcomemodule_mailr
当然我们也可以打印出相应的内容以⽅便我们做后续的处理
print content
这样我们就得到了收件箱页⾯的邮件列表信息,下边来解析这页代码。
提取邮件列表基本信息
输出刚才的内容我们会得到像下⾯这样的结果
...
<string name="id">48:1tbiMA34VVWBT7UDcQAAsMstring>
<string name="from">"⽹易邮件中⼼" <mail@>string>
<string name="to">"" <xxxxxxxxx@163.com>string>
<string name="subject">丙申猴年,你的⼤圣,可会归来?string>
<date name="sentDate">2016-01-23 12:30:37date>
<date name="receivedDate">2016-01-23 12:30:37date>
<string name="antiVirusStatus">unscanedstring>
<string name="hmid"><2134498648.1996962.98.@>string>
...
这些代码段就是我们收件箱的基本信息,每个 object 标签中都包含了⼀个邮件的发件⽅、收件⽅、邮件主题、收发时间等信息。我们要做
的就是利⽤正则表达式把这些信息提取出来(当然也可以⽤beautifulsoup来提取),并输出。每个标签中的内容都⼀样,故正则表达式及
代码如下:
#获取邮件信息
def getmail(self):
#先获得收件箱列表页⾯内容
messages = eList()
#信息提取的正则表达式
#re模块中的findall会找出所有匹配的字符串,返回⼀个列表
mails = l(pattern,messages)
#遍历列表输出中相应项的内容,每个(.*?)对应了相应的项
for mail in mails:
print '-'*50
print '发件⼈',mail[0],'主题',mail[2],'发送时间',mail[3]
print '收件⼈',mail[1],u'接收时间',mail[4]
pattern = e('
这样就可以输出收件箱所有邮件列表的基本信息。
下⾯附上完整代码:
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import cookielib
#163邮箱类
class MAIL:
#初始化
def __init__(self):
#获取登录请求的⽹址
#设置代理,以防⽌本地IP被封
rl = "202.106.16.36:3128"
#初始化sid码
= ""
#第⼀次登陆所需要的请求头request headers
eaders = {
rl = "/entry/cgi/ntesdoor?df=mail163_letter&from=web&funcid=loginone&iframe=1&language=-1&passtype=1&product=m
eaders = {
'Host':"",
'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':"/",
'Connection':"keep-alive",
}
#设置⽤户名和密码
me = 'xxxx'
= 'xxxx'
#post所包含的参数
= {
'savelogin':"0",
'url2':"/errorpage/",
'username':me,
'password':
}
#对post编码转换
ta = ode()
#设置代理
= andler({'http':rl})
#设置cookie对象,会在登录后获取登录⽹页的cookie
= kieJar()
#设置cookie处理器
Handler = okieProcessor()
#设置登录时⽤到的opener,相当于我们直接打开⽹页⽤的urlopen
= _opener(Handler,,ndler)
#模拟登陆并获取sid码
def loginPage(self):
try:
#发出⼀个请求
request = t(rl,ta,eaders)
#得到响应
response = (request)
#需要将响应中的内容⽤read读取出来获得⽹页代码,⽹页编码为utf-8
content = ().decode('utf-8')
#打印获得的⽹页代码
print content
#设定提取sid码的正则表达式
sidpattern = e('sid=(.*?)&',re.S)
result = (sidpattern,content)
= (1)
except ror, e:
#通过sid码获得邮箱收件箱信息
def messageList(self):
#重定向的⽹址
#新的请求头
Headers = {
'Host':"",
'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':"/js6/?sid=%s&df=mail163_letter"%,
'Connection':"keep-alive"
}
#发出请求并获得响应
request = t(listUrl,headers = Headers)
listUrl = '/js6/s?sid=%s&func=mbox:listMessages&TopTabReaderShow=1&TopTabLofterShow=1&welcome_welcomemodule_mailr
request = t(listUrl,headers = Headers)
response = (request)
#提取响应的页⾯内容
content = ().decode('utf-8')
return content
#获取邮件信息
def getmail(self):
messages = eList()
mails = l(pattern,messages)
for mail in mails:
print '-'*50
print '发件⼈',mail[0],'主题',mail[2],'发送时间',mail[3]
print '收件⼈',mail[1],u'接收时间',mail[4]
pattern = e('
#创建163邮箱爬⾍类
mail = MAIL()
age()
l()
谢谢观看,看完后也可以去试试,第⼀次写,写的不好的地⽅望指正。
发布评论