很久沒寫博文了,最近搗鼓了一下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爲真時,點擊」下一頁「按鈕。看着下載回來的照片卻是挺有感受,哈哈。
要保持學習,好好努力,恩恩。