【python爬蟲】根據查詢詞爬取網站返回結果

最近在作語義方面的問題,須要反義詞。就在網上找反義詞大全之類的,可是大多不全,沒有我想要的。而後就找相關的網站,發現了http://fanyici.xpcha.com/5f7x868lizu.html,還行能把「老師」-「學生」,「醫生」-「病人」這樣對立關係的反義詞查出來。html

一開始我想把網站中數據庫中存在的全部的詞語都爬出來(暗網爬蟲),可是分析了url的特色:python

http://fanyici.xpcha.com/5f7x868lizu.htmllinux

查詢詞和非陰影部分的剩餘的7個位置有關,若是暴力破解的發,總共(26+10)^7=78364164096~780億個url有不少沒用的。寫了個爬蟲爬,感受太慢了,暫時放棄了這種想法,想用模擬瀏覽器的方式,根據查詢詞的存儲查詢結果。在網上找了不少資料,終於搞定。web

 

使用的是mechanize模塊,它是很是適合的模擬瀏覽器模塊。能夠利用該模塊完成一些瀏覽器想要作的事,好比自動填寫表單。主要特色:數據庫

  1. http,https協議等
  2. 簡單的HTML表單填寫
  3. 瀏覽器歷史記錄和重載
  4. Referer的HTTP頭的正確添加(可選)
  5. 自動遵照robots.txt的
  6. 自動處理HTTP-EQUIV和刷新

下面以解決該問題爲導向,記錄下完成步驟瀏覽器

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

相關文章
相關標籤/搜索