好久沒寫博文了,最近搗鼓了一下python,好像有點上癮了,感覺python比js厲害好多,但是接觸不久,只看了《[大家網]Python基礎教程(第2版)[www.TopSage.com]》的前7章,好多東西還不會,能做的也比較少。我想做的是爬QQ空間,然后把空間里的留言,說說拷下來,已經成功做到了,只是,拷下來是word文檔,看着沒有在線看那么有感觸,有些話,覺得不像自己會說的。
我花了好多時間,幸好最近清閑,有時間給我慢慢學。一開始,我使用urllib去登陸QQ空間:
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(),都是報錯:
我查到模擬谷歌瀏覽器要裝個chromedriver.exe來輔助,但是火狐沒說需要耶,猜想是不是要裝個python3版本才行,目前用的是python2.7,結果還是報一樣的錯誤,實在沒轍了,就裝了個chromedriver.exe,模擬谷歌,畢竟谷歌瀏覽器我用得最多。python3的語法和python2有區別,最先發現的是print方法。原來,新版的火狐瀏覽器也需要安裝點什么東西才行,有個新加入博客的伙伴回復了我的評論:
原諒我的孤聞,其實很多東西我都不懂。
好了,程序終於能跑了,神奇的事情發生了,程序打開了一個新的谷歌頁面,按照代碼所寫的打開了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結果如下圖:
我的核心代碼是:
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的文本即可,這種方法只能獲取核心文字,圖片無法拷貝,下載完的樣子是這樣:
拷完自己的,又去把閨蜜的留言拷了一份,她的留言比我多多了,因為她很喜歡自己去給自己留言,拷的速度還是蠻快的,如果我不用time.sleep(延時執行)會更快,但是不用延時,有時會報錯,估計是頁面元素還沒加載出來,獲取不到。
下面繼續說說怎么爬取說說以及說說的圖片(我真是太無聊了 )
每條說說的內容都包含在類名為“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為真時,點擊”下一頁“按鈕。看着下載回來的照片倒是挺有感覺,哈哈。
要保持學習,好好努力,恩恩。