用python爬取QQ空間

      很久沒寫博文了,最近搗鼓了一下python,好像有點上癮了,感受python比js厲害好多,可是接觸不久,只看了《[你們網]Python基礎教程(第2版)[www.TopSage.com]》的前7章,好多東西還不會,能作的也比較少。我想作的是爬QQ空間,而後把空間裏的留言,說說拷下來,已經成功作到了,只是,拷下來是word文檔,看着沒有在線看那麼有感觸,有些話,以爲不像本身會說的。css

      我花了好多時間,幸虧最近悠閒,有時間給我慢慢學。一開始,我使用urllib去登錄QQ空間:html

def getCookieOpener():
    postUrl="http://qzone.qq.com"
    cj = cookielib.LWPCookieJar()
    cookie_support = urllib2.HTTPCookieProcessor(cj)
    opener = urllib2.build_opener(cookie_support)
    postData={
        "app":"adv",
        "return":"http://user.qzone.qq.com/",
        "username":"登錄名",
        "password":"登錄密碼"
    }
    postData = urllib.urlencode(postData)
    loginRequest = opener.open(postUrl,postData)
    return opener

會報錯,建議我登錄手機端頁面,幾番嘗試,都不行,我去百度,果真,在我前面已經有好多人實踐過了。查到了使用selenium中的webdriver庫模擬瀏覽器操做,第六感告訴我,這個很是好,能夠作不少事情。立馬在cmd裏安裝這個包:pip install selenium,而後研究了下網上的一個例子:http://www.zh30.com/python-selenium-qzone-login.html,發現selenium的使用方法很是簡單,查找元素並點擊之類的操做和js有點類似,看完,開始本身動手,結果報錯了,不管是嘗試driver = webdriver.Chrome()仍是driver = webdriver.Firefox(),都是報錯:python

我查到模擬谷歌瀏覽器要裝個chromedriver.exe來輔助,可是火狐沒說須要耶,猜測是否是要裝個python3版本才行,目前用的是python2.7,結果仍是報同樣的錯誤,實在沒轍了,就裝了個chromedriver.exe,模擬谷歌,畢竟谷歌瀏覽器我用得最多。python3的語法和python2有區別,最早發現的是print方法。原來,新版的火狐瀏覽器也須要安裝點什麼東西才行,有個新加入博客的夥伴回覆了個人評論:web

原諒個人孤聞,其實不少東西我都不懂。chrome

      好了,程序終於能跑了,神奇的事情發生了,程序打開了一個新的谷歌頁面,按照代碼所寫的打開了QQ登錄頁,而後自動填進了名稱和密碼,自動點擊提交按鈕,成功登錄了,我愣了愣,原來所說的模擬登錄是這麼的可視化,真好。而後我開始研究怎麼把本身的全部留言都導出來。先說一個把內容下載到txt或者其餘格式的方法:瀏覽器

#日誌文件
def logToFile(content,name="liuyan.txt"):
    fileH=open(name,"a+")
    try:
        print(content)
        fileH.write(content+"\n")
    except Exception as e:
        print("except:"+str(e))
    finally:
        fileH.close()

接下來就是獲取問題了,我要獲取li裏的內容,而後翻到下一頁,繼續獲取,直到所有獲取完畢,留言板html結果以下圖:cookie

個人核心代碼是:app

def getData():
    num=1
    while (num<265):
        num+=1
        time.sleep(2)
        memu=driver.find_element_by_id('ulCommentList')
        logToFile(memu.text)
        p='QZBlog.Util.PageIndexManager.goDirectPage('+str(num)+')'
        #driver.execute_script調用頁面的js
        driver.execute_script(p+';return false;')
    if num==265:
        time.sleep(2)
        memu=driver.find_element_by_id('ulCommentList')
        logToFile(memu.text)

不須要直接獲取每一個li標籤的內容,獲取外層ul的文本便可,這種方法只能獲取核心文字,圖片沒法拷貝,下載完的樣子是這樣:python2.7

      拷完本身的,又去把閨蜜的留言拷了一份,她的留言比我多多了,由於她很喜歡本身去給本身留言,拷的速度仍是蠻快的,若是我不用time.sleep(延時執行)會更快,可是不用延時,有時會報錯,估計是頁面元素還沒加載出來,獲取不到。post

      下面繼續說說怎麼爬取說說以及說說的圖片(我真是太無聊了 )

      每條說說的內容都包含在類名爲「content‘的pre標籤中,說說發佈的時間在類名爲"c_tx c_tx3 goDetail"的a標籤中,因而這樣獲取內容:(我是百度的,哈哈,若是是我,我估計還不會用zip)

        contents = driver.find_elements_by_css_selector('.content')
        times = driver.find_elements_by_css_selector('.c_tx.c_tx3.goDetail')
        for c,t in zip(contents,times):
            data =t.text+"\n"+c.text+"\n"
            logToFile(data)

這樣得出的內容是這樣的:

很清晰明瞭,可是看着總少了那種feel。我本身想了個功能,就是把說說的圖片也下載下來,本想一塊兒放進word文檔,可是會報錯,因而放棄了,改成放到一個單獨的文件夾中:

        hp=driver.find_elements_by_class_name('img-attachments-inner')
        ho=''
        for ho in hp:
            hq=ho.find_elements_by_tag_name('a')
            for tg in hq:
                try:
                    linkF=tg.get_attribute('href')
                    urllib.request.urlretrieve(linkF,'./myshuoshuo/%s.jpg' % str(x))
                    x+=1
                except:
                    logToFile('something was wrong!')

上面的代碼有個地方坑苦了我,因爲以前的driver.find_elements_by_css_selector方法是我直接複製網上的,此次我下載圖片打成了:driver.find_element_by_css_selector,老是報錯,報hp不是個可迭代的對象,調試輸出也的確只輸出第一個圖片的內容,我就好納悶了,查了好多,百度和谷歌都翻了,我以前一直用的都是find_element,並不知道還有個find_elements,因此當我找到一篇博客,上面很清晰明瞭地告訴我,應該把前者改成後者,認真對比以後我才知道是少了個」s",加上果真不報錯了,也怪我本身不細心,沒留意到它們之間的區別,或者說個人基礎還不結實,我剛接觸不久,因此值得原諒,嘻嘻。翻頁是判斷是否還有下一頁這個跳轉,有就跳到下一頁,繼續獲取:

    try:
        driver.find_element_by_link_text('下一頁')
        d = True
    except:
        d = False

當變量d爲真時,點擊」下一頁「按鈕。看着下載回來的照片卻是挺有感受,哈哈。

 

要保持學習,好好努力,恩恩。

相關文章
相關標籤/搜索