去年就寫(xiě)過(guò)一個(gè)類(lèi)似的爬蟲(chóng)程序,不過(guò)因?yàn)橹匮b電腦找不到了,今天剛好又再寫(xiě)了一個(gè),而且寫(xiě)的比之前的更加簡(jiǎn)潔。把寫(xiě)爬蟲(chóng)過(guò)程中遇到的問(wèn)題,和思路簡(jiǎn)單記錄下來(lái)。源代碼發(fā)在我的github上:https://github.com/haolexiao/A-toy-caoliu-crawler 其實(shí)代碼不長(zhǎng)也非常的簡(jiǎn)潔。
起因是因?yàn)椴萘裾搲挥袝?huì)員才能使用搜索功能,非會(huì)員不能用,這就給找資源帶來(lái)了很多的不便,然后我想,我把每個(gè)資源帖子的標(biāo)題和地址爬下來(lái),不就可以在本地用搜索功能了嗎? 于是說(shuō)干就干。
先初步研究了一下網(wǎng)頁(yè)源碼和網(wǎng)頁(yè)鏈接之后,覺(jué)得這個(gè)工作不難,網(wǎng)頁(yè)地址的翻頁(yè)就是原地址之后修改”page=x”其中x就是頁(yè)數(shù),而且資源帖子是存在一個(gè)表格里的,所以地址獲取和頁(yè)面都不復(fù)雜, 于是就著手開(kāi)始寫(xiě)爬蟲(chóng)。 編程語(yǔ)言用的是Python
最開(kāi)始打算直接用
urllib.urlopen(url)來(lái)直接爬,但是發(fā)現(xiàn)該論壇應(yīng)該是啟用了防爬蟲(chóng)措施,用了幾種鏈接獲取方法都拿不到需要的東西。 這可怎么辦呢 想到之前看到的大殺器——selenium,直接模擬網(wǎng)頁(yè)操作,這總不會(huì)被禁了吧。 果然用selenium之后就可以順利爬下來(lái)所需要的內(nèi)容 因?yàn)橹皼](méi)怎么用過(guò)selenium,所以就仔細(xì)研究了一下selenium獲取元素的方法,然后對(duì)照著網(wǎng)頁(yè)源碼,每個(gè)帖子定位的源碼地方在:
<h3><a href="**********這里是超鏈接地址**********" target="_blank" id="">**********這里是標(biāo)題**********</a></h3>發(fā)現(xiàn)直接采用
find_element_by_tag_name("h3")命令只能抓下來(lái)標(biāo)題部分,不能抓下來(lái)超鏈接,因?yàn)橛?/p>get_attribute('href')
命令得到的是空列表。 如果要抓超鏈接的話,得再按照tag:a這個(gè)標(biāo)簽來(lái)抓,這樣就太麻煩了(其實(shí)我是后來(lái)才意識(shí)到:按照h3的tag找,找的的是包含h3部分的整個(gè),而直接用get_attribute的話,因?yàn)閔3標(biāo)簽里不含有href的,所以找不出來(lái)。此時(shí)只要再繼續(xù)抓a的tag就能找出來(lái)) 然后發(fā)現(xiàn)
find_elements_by_xpath("http://h3/a[@target='_blank']")就能非常好的找到結(jié)果,然后
x.textx.get_attribute('href')分別就得到標(biāo)題和地址。
然后抓取數(shù)據(jù)的問(wèn)題得到解決后,就要寫(xiě)入數(shù)據(jù)了,打算直接寫(xiě)到一個(gè)csv文件里,用「,」隔開(kāi)標(biāo)題和地址,最后用Excel打開(kāi)就好。 但是寫(xiě)入的時(shí)候碰見(jiàn)的問(wèn)題是,因?yàn)闃?biāo)題中文用的是Unicode編碼,直接write是不支持的,所以查了下相關(guān)資料,用utf-8編碼打開(kāi)并寫(xiě)入文件即可。
import codecsfile_output = codecs.open('caoliu.csv','w', 'utf_8_sig')至于后面的為什么是’utf_8_sig’而不是’utf-8’那是因?yàn)槟J(rèn)的utf-8是不帶BOM的,用excel打開(kāi)中文是亂碼,用Notepad++可以正常打開(kāi)【去年那次我是先用notepad++打開(kāi),然后用Notepad++里自帶的轉(zhuǎn)換格式進(jìn)行轉(zhuǎn)換的】 今年我研究了一下發(fā)現(xiàn)是因?yàn)閹Р粠OM的問(wèn)題,網(wǎng)上搜了下用’utf_8_sig’就可以直接解決,搞定~
最后爬了十幾分鐘,把騎兵區(qū)的前100個(gè)頁(yè)總共9k多條的帖子標(biāo)題和地址都給抓到本地excel里了 為什么是前100頁(yè)呢,因?yàn)?00頁(yè)之后還是需要會(huì)員才能訪問(wèn)了
找了不少參考資料尤其是關(guān)于selenium的用法,下面這篇博文講的還是非常的詳細(xì)的: Python爬蟲(chóng)學(xué)習(xí)(9):Selenium的使用
新聞熱點(diǎn)
疑難解答
圖片精選