最近在作語義方面的問題,須要反義詞。就在網上找反義詞大全之類的,可是大多不全,沒有我想要的。而後就找相關的網站,發現了http://fanyici.xpcha.com/5f7x868lizu.html,還行能把「老師」-「學生」,「醫生」-「病人」這樣對立關係的反義詞查出來。html
一開始我想把網站中數據庫中存在的全部的詞語都爬出來(暗網爬蟲),可是分析了url的特色:python
http://fanyici.xpcha.com/5f7x868lizu.htmllinux
查詢詞和非陰影部分的剩餘的7個位置有關,若是暴力破解的發,總共(26+10)^7=78364164096~780億個url有不少沒用的。寫了個爬蟲爬,感受太慢了,暫時放棄了這種想法,想用模擬瀏覽器的方式,根據查詢詞的存儲查詢結果。在網上找了不少資料,終於搞定。web
使用的是mechanize模塊,它是很是適合的模擬瀏覽器模塊。能夠利用該模塊完成一些瀏覽器想要作的事,好比自動填寫表單。主要特色:數據庫
下面以解決該問題爲導向,記錄下完成步驟瀏覽器
0. 預備cookie
環境:linux python 2.7網絡
安裝模塊:mechanize cookielib BeautifulSoup網站
1. 初始化並創建一個瀏覽器對象ui
import re import sys import mechanize import cookielib from bs4 import BeautifulSoup br = mechanize.Browser() ##創建瀏覽器對象 cj = cookielib.LWPCookieJar() ##經過導入cookielib模塊,並設置瀏覽器cookie,能夠在須要認證的網絡行爲以後不用重複認證登錄 br.set_cookiejar(cj) ##關聯cookies
###設置一些參數,由於是模擬客戶端請求,因此要支持客戶端的一些經常使用功能,好比gzip,referer等
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
###這個是degbug##你能夠看到他中間的執行過程,對調試代碼有幫助
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.set_debug_http(True)
br.set_debug_redirects(True)
br.set_debug_responses(True)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
2. 模擬瀏覽器的行爲(獲取web網頁模擬網站查詢)
r = br.open(sys.argv[1]) query = sys.argv[2] br.select_form(nr=0) br.form['q'] = query br.submit() html = br.response().read()
這裏選擇的表單是nr=0,能夠經過一下方式獲取表單信息,從而利用須要的表單號。
for f in br.forms: print f
查詢詞變量是’q’,是經過分析網站的源碼得到,以下圖
3. 解析須要的內容
這裏利用了BeautifulSoup模塊,更詳細看這裏
def parseHtml(html): ''' @summary: 抓取結構化數據 ''' content = "" wordpattern = '<h1>(.+?)的反義詞</h1>' pattern = '<span class="medium b">(.+?)</span>' temp = re.findall(pattern, html) wordtemp = re.search(wordpattern, html) if temp: word = wordtemp.group(1) content = word + '\t' for key in temp: content += key + '\t' content = content.strip('\t') return content
這樣實現基本的功能能夠了,參考代碼(文件名爲:crawler.py)
#! coding:utf-8 import re import sys import mechanize import cookielib from bs4 import BeautifulSoup def parseHtml(html): ''' @summary: 抓取結構化數據 ''' content = "" wordpattern = '<h1>(.+?)的反義詞</h1>' pattern = '<span class="medium b">(.+?)</span>' temp = re.findall(pattern, html) wordtemp = re.search(wordpattern, html) if temp: word = wordtemp.group(1) content = word + '\t' for key in temp: content += key + '\t' content = content.strip('\t') return content def saveData(data): ''' @summary: 數據存儲 ''' f = open('test', 'w') f.write(data) f.close() br = mechanize.Browser() cj = cookielib.LWPCookieJar() br.set_cookiejar(cj)##關聯cookies ###設置一些參數,由於是模擬客戶端請求,因此要支持客戶端的一些經常使用功能,好比gzip,referer等 br.set_handle_equiv(True) br.set_handle_gzip(True) br.set_handle_redirect(True) br.set_handle_referer(True) br.set_handle_robots(False) br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) ###這個是degbug##你能夠看到他中間的執行過程,對你調試代碼有幫助 br.set_debug_http(True) br.set_debug_redirects(True) br.set_debug_responses(True) br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] r = br.open(sys.argv[1]) query = sys.argv[2] br.select_form(nr=0) br.form['q'] = query br.submit() html = br.response().read() data = parseHtml(html) print data if data != "": saveData(data)
使用
python crawler.py 好
說明:最後一個爲查詢詞,最終寫到文件」test「中。
參考
http://blog.chinaunix.net/uid-26722078-id-3507409.html