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