1. 程式人生 > >python-爬蟲:獲取163郵箱的收件箱資訊列表

python-爬蟲:獲取163郵箱的收件箱資訊列表

在練習python爬蟲的時候看到了原博主的關於爬取163郵箱收件箱資訊列表的文章,就拿來練手了。這裡附上原部落格連結https://blog.csdn.net/u011379247/article/details/51019379

由於原文用的是python2.X,瀏覽器的版本也比較早。而本人用的是python3.6,瀏覽器也是新版本,所以還是有些不一樣的地方值得摸索的。

主要內容:

1. 模擬163郵箱的登陸

2. 獲取登陸後的收件箱頁面

3. 獲取頁面中的郵件資訊

思路:

1. 用瀏覽器登陸郵箱以獲取請求登陸的url以及收件箱網頁的url

2. 向該url傳送登陸請求,獲得response,並利cookie快取登陸的資訊及狀態

3. 提取response中的sid碼,這是下一步請求所需要的

4. 利用sid碼和cookie重新請求,獲得響應,重定向至收件箱網頁,獲取頁面資訊

5. 提取郵件資訊

前期準備:

首先,進入163郵箱登陸頁面:https://mail.163.com/  我用的是chrome,在這個頁面中右鍵-檢查-network,就可以看到如下介面,要注意的是,這裡要勾上preserve log選項,這樣能保證頁面在切換的時候,之前的日誌不會被清除掉。


接下來,輸入使用者名稱和密碼並點選登陸(此時滑鼠的箭頭應該變成了圓點),登陸後就會出現如下介面


單擊ntesdoor日誌,這個這就是登入時提交的引數資訊,右邊會出現請求的詳細資訊


可以看到Request URL,這個URL與現在瀏覽器中的地址不同,因為這是我們請求登陸的頁面,我們要將使用者名稱密碼等引數資訊一起傳送給這個頁面才能登陸得到現在我們瀏覽器中的頁面。

這裡不知道是版本的問題還是什麼,Request URL和原部落格不一樣,後面少了一串引數,這串引數在下面的From Data中可以找到大部分


還有一個引數funcid=loginone需要手動加入,然後按照一定格式和順序新增到Request URL(即https://mail.163.com/entry/cgi/ntesdoor?)後面。補充完整的Request URL即為:

https://mail.163.com/entry/cgi/ntesdoor?style=-1&df=mail163_letter&net=&language=-1&from=web&race=&iframe=1&product=mail163&funcid=loginone&passtype=1&allssl=true&url2=https://mail.163.com/errorpage/error163.htm

後面測試的時候發現其實用原部落格的Request URL也行,其實就是一個申請登陸的URL,都是通用的。

關鍵不同的地方在於sid碼。這個時候我們可以發現瀏覽器的位址列有一串sid:

https://mail.163.com/js6/main.jsp?sid=RCpjHzssdhVZZaJhQVssftGmNRcBfOlZ&df=mail163_letter

這個sid碼是進入收件箱的關鍵,而每次登陸後的sid碼是不同的,因此我們需要得到它。

如何得到sid碼呢?

我們先回到ntesdoor日誌中,進入response選項,裡面是我們瀏覽器現在的URL,其中就有我們需要的sid碼,因此我們需要得到response的內容並將sid碼提取出來。

得到sid碼之後呢,如何進入收件箱呢?

接下來在瀏覽器中點選收件箱,選擇最後一個出現的日誌,右邊會出現Request URL。如下圖

 

這就是收件箱的URL了,事實上,我們只需要前面一部分就夠了,因為後面的sid會被我們提取的sid替換掉,從而進入我們自己的收件箱。

sid就像是一個驗證碼,只有在登入成功的URL中得到sid碼,才能得到相應的收件箱的URL並利用cookie中快取的資訊進入相應的收件箱,這是一一對應的。

點選response可以看到伺服器迴應的就是我們收件箱中的郵件資訊了。


接下來獲取response中的資訊並提取需要的出來即可。

下面附上完整程式碼

# -*- coding:utf-8 -*-
import urllib.request
import re
import http.cookiejar
import urllib.parse

#163郵箱類
class MAIL:

    #初始化
def __init__(self):
        #獲取登入請求的網址,這個是通用的,只是一個請求登陸的URL
self.loginUrl = "https://mail.163.com/entry/cgi/ntesdoor?style=-1&df=mail163_letter&net=&language=-1&from=web&race=&iframe=1&product=mail163&funcid=loginone&passtype=1&allssl=true&url2=https://mail.163.com/errorpage/error163.htm"
#設定代理,以防止本地IP被封
self.proxyUrl = "http://202.106.16.36:3128"
#初始化sidself.sid = ""
#第一次登陸所需要的請求頭request headers,這些資訊可以在ntesdoor日誌request header中找到,copy過來就行
self.loginHeaders = {
            'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,,image/webp,image/apng,*/*;q=0.8",
'Accept-Language': "zh-CN,zh;q=0.9",
'Connection': "keep-alive",
'Host': "mail.163.com",
'Referer': "http://mail.163.com/",
'User-Agent':"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Mobile Safari/537.36"
}
        #設定使用者名稱和密碼,填上自己的即可
self.username = '****'
self.pwd = '****'
#post所包含的引數
self.post = {
            'savelogin':"0",
'url2':"http://mail.163.com/errorpage/error163.htm",
'username':self.username,
'password':self.pwd
        }
        #post編碼轉換
self.postData = urllib.parse.urlencode(self.post).encode('utf8')
        # 使用http.cookiejar.CookieJar()建立CookieJar物件
self.cjar = http.cookiejar.CookieJar()
        # 使用HTTPCookieProcessor建立cookie處理器,並以其為引數構建opener物件
self.cookie = urllib.request.HTTPCookieProcessor(self.cjar)
        self.opener = urllib.request.build_opener(self.cookie)
        # opener安裝為全域性
urllib.request.install_opener(self.opener)


    #模擬登陸並獲取siddef loginPage(self):
        try:
            #發出一個請求
self.request = urllib.request.Request(self.loginUrl,self.postData,self.loginHeaders)
        except urllib.error.HTTPError as e:
            print(e.code)
            print(e.read().decode("utf8"))
        #得到響應
self.response = urllib.request.urlopen(self.request)
        #需要將響應中的內容用read讀取出來獲得網頁程式碼,網頁編碼為utf-8
self.content = self.response.read().decode("utf8")
        #列印獲得的網頁程式碼
print (self.content)
        # 設定提取sid碼的正則表示式
self.sidpattern = re.compile('sid=(.*?)&', re.S)
        self.result = re.search(self.sidpattern, self.content)
        self.sid = self.result.group(1)
        print (self.sid)

    #通過sid碼獲得郵箱收件箱資訊
def messageList(self):
        #重定向至收件箱的網址
listUrl =  'http://mail.163.com/js6/s?sid=%s&func=mbox:listMessages&TopTabReaderShow=1&TopTabLofterShow=1&welcome_welcomemodule_mailrecom_click=1&LeftNavfolder1Click=1&mbox_folder_enter=1'%self.sid
        #新的請求頭
Headers = {
            'Accept': "text/javascript",
'Accept-Language': "zh-CN,zh;q=0.9",
'Connection': "keep-alive",
'Host': "mail.163.com",
'Referer': "https://mail.163.com/js6/main.jsp?sid=%suCFJZNnnRnInrsigqunnSrQXsvMMqctH&df=mail163_letter"%self.sid,
'User-Agent':"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Mobile Safari/537.36"
}
        #發出請求並獲得響應
request = urllib.request.Request(listUrl, headers = Headers)
        response = self.opener.open(request)
        #提取響應的頁面內容,裡面是收件箱的資訊
content = response.read().decode('utf-8')
        print('~~~')
        return content


    #獲取郵件資訊
def getmail(self):
        messages = self.messageList()
        pattern = re.compile('from..(.*?),.*?to..(.*?),.*?subject..(.*?),.*?sentDate..(.*?),\n.*?receivedDate..(.*?),\n',re.S)
        mails = re.findall(pattern, messages)
        for mail in mails:
            print ('-'*50)
            print ('發件人:',mail[0],'主題:',mail[2],'傳送時間:',mail[3])
            print ('收件人:',mail[1],u'接收時間:',mail[4])


#建立163郵箱爬蟲類
mail = MAIL()
mail.loginPage()
mail.getmail()

結果示例如下

<html><head><script type="text/javascript">top.location.href = "https://mail.163.com/js6/main.jsp sid=uCdhYCnnWtdrrsnxQunnjfXFEUTXINIr&df=mail163_letter";</script></head><body></body></html>

DDFjCVXXymmTTYJmFBXXhefaBzIgzveg
~~~
--------------------------------------------------
發件人: '"網易郵件中心" <[email protected]>' 主題: '網易郵箱提醒:登入網易郵箱失敗' 傳送時間: new Date(2017,9,10,11,33,11)
收件人: '"[email protected]" <[email protected]>' 接收時間: new Date(2017,9,10,11,33,11)


相關推薦

python-爬蟲獲取163郵箱資訊列表

在練習python爬蟲的時候看到了原博主的關於爬取163郵箱收件箱資訊列表的文章,就拿來練手了。這裡附上原部落格連結https://blog.csdn.net/u011379247/article/details/51019379由於原文用的是python2.X,瀏覽器的版本

python爬蟲獲取標籤內部全部文字

取出以下字串:親測連結 我要取出text內容,怎麼取呢,很多方法,bs4也可以,正則也可以,動態selenium也可以,這次我們先實現xpath,xpath的確很強大,不多說,上程式。 通過text獲取文字 import reqiests from lxml imp

Python+Selenium自動化測試筆記登入163郵箱

有幾點要注意的地方: 1 登入框使用者名稱和密碼輸入框的id是自動生成的,所以無法用id定位 2 登入框是通過iframe表單巢狀到頁面裡的。而webdriver只能在一個頁面上對元素識別與定位,對於iframe表單內嵌頁面上的元素無法直接定位,需要通過switch_to

Python爬蟲lxml模組分析並獲取網頁內容

運用css選擇器: # -*- coding: utf-8 -*- from lxml import html page_html = ''' <html><body> <input id="input_id" value="input value" nam

Python爬蟲爬蟲前得了解的事兒

編寫 election 檢查 語言 jpg mage 圖片 一個 網頁 這是關於Python的第14篇文章,主要介紹下爬蟲的原理。 提到爬蟲,我們就不得不說起網頁,因為我們編寫的爬蟲實際上是針對網頁進行設計的。解析網頁和抓取這些數據是爬蟲所做的事情。 對於大部分網頁來講,它

python爬蟲爬取網站視頻

爬蟲 python python爬取百思不得姐網站視頻:http://www.budejie.com/video/新建一個py文件,代碼如下:#!/usr/bin/python # -*- coding: UTF-8 -*- import urllib,re,requests import sys

Python爬蟲新浪新聞詳情頁的數據抓取(函數版)

earch edit arm python爬蟲 print 詳情 contents enter uwa 上一篇文章《Python爬蟲:抓取新浪新聞數據》詳細解說了如何抓取新浪新聞詳情頁的相關數據,但代碼的構建不利於後續擴展,每次抓取新的詳情頁時都需要重新寫一遍,因此,我們需

Python爬蟲HTTP協議、Requests庫

.org clas python爬蟲 print 通用 娛樂 信息 傳輸協議 介紹 HTTP協議: HTTP(Hypertext Transfer Protocol):即超文本傳輸協議。URL是通過HTTP協議存取資源的Internet路徑,一個URL對應一個數據資源。

python爬蟲--自動獲取seebug的poc

nowait 位數 完成 再次 問題 reading use odi html 簡單的寫了一個爬取www.seebug.org上poc的小玩意兒~ 首先我們進行一定的抓包分析 我們遇到的第一個問題就是seebug需要登錄才能進行下載,這個很好處理,只需要抓取返回值200

python爬蟲爬取海量病毒文

tle format nbsp contex logs request spl tde __name__ 因為工作需要,需要做深度學習識別惡意二進制文件,所以爬一些資源。 # -*- coding: utf-8 -*- import requests import re

Python 爬蟲把廖雪峰教程轉換成 PDF 電子書

網絡 odi 變量 turn chrome github htm git 臨時文件 寫爬蟲似乎沒有比用 Python 更合適了,Python 社區提供的爬蟲工具多得讓你眼花繚亂,各種拿來就可以直接用的 library 分分鐘就可以寫出一個爬蟲出來,今天嘗試寫一個爬蟲,將廖雪

通過python腳本獲取服務器硬信息

nbsp 通過 pen port ctu Coding meminfo platform [] #!/usr/bin/python # coding:utf-8 """ 采集機器自身信息 1 主機名 2 內存 3 ip與mac地址 4 cpu信息 5

Python爬蟲認識urllib/urllib2以及requests

更多 查看 sts urllib2 chrome 超時設置 word 3.0 erro 首先說明一下我的爬蟲環境是基於py2.x的, 為什麽用這個版本呢,因為py2.x的版本支持的多,而且一般會使用py2.x環境,基本在py3.x也沒有太大問題,好了,進入正題! urlli

Python爬蟲現學現用Xpath爬取豆瓣音樂

9.1 tree when href scrapy 發現 pat 直接 where 爬蟲的抓取方式有好幾種,正則表達式,Lxml(xpath)與Beautiful,我在網上查了一下資料,了解到三者之間的使用難度與性能 三種爬蟲方式的對比。 抓取方式 性能 使用難度

python 爬蟲HTTP ERROR 406

spl att sof sel cati python error line TP 解決方法: 設置了Accept頭後解決了,但是還是不知道原因 headers:{ Accept:"text/html, application/xhtml+xml, */

Python爬蟲Xpath語法筆記

上一個 div 運算符 tar 爬蟲 att 語法 ont tab 常用的路勁表達式: 表達式 描述 實例 nodename 選取nodename節點的所有子節點 xpath(‘//div’) 選取了div節點的所有子節點 / 從根節點選取 xpath

Python爬蟲抓取手機APP的數據

sig ner ont sele ebo span fail pytho 抓取 摘要: 大多數APP裏面返回的是json格式數據,或者一堆加密過的數據 。這裏以超級課程表APP為例,抓取超級課程表裏用戶發的話題。 1、抓取APP數據包 方法詳細可以參考這篇博文:

python Class獲取對象類型

oat functions example self. vpd implement add sting iter 獲取對象類型:一、type#!/usr/bin/env python3# -*- coding: utf-8 -*-class Animal(object):

JavaMail讀取退信郵件/分析郵件附件獲取Message_Id

isp ngxin 自定義 work pro nec tst aging 任務 需求描述:公司最近有個項目郵件通知功能,但是客戶上傳的郵件地址並不一定存在,以及其他的各種問題。所有希望發送通知後有個回執,及時發現地址存在問題的郵箱。 需求分析:經過分析JavaMail可以讀

我的第一個python爬蟲爬取豆瓣top250前100部電影

爬取豆瓣top250前100部電影   1 # -*-coding=UTF-8 -*- 2 3 import requests 4 from bs4 import BeautifulSoup 5 6 headers = {'User-Agent':'Moz