用網絡爬蟲給本身寫個英語學習工具

做爲一個英語學習愛好者,我發現咱們學了那麼多年英語,雖然如今看英語文章已經不怎麼吃力,可是若是要本身寫一篇英語文章,就老是感受單詞雖然都懂,可要拼出一句有水平的句子就很難。其緣由我以爲是咱們平時雖然作了很多的閱讀,但只是在被動地將英語信息轉化成大概的中文意思理解,而沒有試着反過來訓練一下從中文怎麼表達成英文。做爲一個程序員有一個好處就是,當你發現一個需求的時候能夠本身試着作個東西來玩玩,爲了作這個學習工具,我首先想到了有些新聞網站會提供雙語新聞(好比酷優網http://www.cuyoo.com/home/portal.php),而後個人思路就簡單成型了,先搞個網絡爬蟲,把一些雙語新聞網頁抓取下來,而後將每一句中英文對照抽取出來,再作個圖形界面,每次先顯示一條中文,讓用戶嘗試輸入英文翻譯,寫不出來能夠查看原英文提示,再提供一個筆記功能用於記錄一下特殊詞彙,表達方式和體會等,下面就給你們看看我是如何一一實現這些功能的。php

網頁抓取框架—scrapyhtml

所謂的網絡爬蟲,其實就像咱們使用的瀏覽器,它去訪問一個個連接,而後把對應的網頁下載下來,所不一樣的是瀏覽器把文件下載下來後就呈現出來一個頁面,而爬蟲則能夠根據咱們定義的規則去自動地訪問網站裏的連接,而後把下載到的網頁文件進行處理,並抽取出咱們所要的數據。若是要本身實現一個網絡爬蟲,就要寫一個模擬http客戶端,還要實現文本解析等功能,仍是挺麻煩的,這時候能夠找找有什麼好用的開源軟件。Scrapyhttp://scrapy.org/)就是一個很不錯的工具,它是一個使用python實現快速高級的網頁抓取框架,使用它的時候,你只須要簡單地定義你要抓取的網頁url,還有對每一個抓取到的頁面須要進行的處理操做,其它的均可以由scrapy完成,有興趣的朋友能夠看看它提供的教程(http://doc.scrapy.org/en/0.18/intro/tutorial.html),如今開始咱們的工做。python

(1)在安裝scrapy後,在shell終端下隨便找個目錄運行命令: git

      scrapy startproject bilingual (本身取的項目名)程序員

  獲得以下面所示的一個項目結構github

 

bilingual/
    scrapy.cfg
    bilingual/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

 

  scrapy提供這些文件讓咱們自定義對抓取到的數據的處理過程,其中spiders目錄下用於存放用戶定義的spider類,scrapy根據這裏所定義的類進行信息抓取,在spider類中,須要定義初始的url列表,以及根據什麼規則爬取新的連接和如何解析抽取下載到的網頁信息,我這裏爲了簡單,就只在spiders目錄下寫了一個spider進行處理,沒有使用其它功能。正則表達式

 (2)在spiders目錄下,建立文件cuyoo.py (自定義的spider名,也就是要抓取的網站名),代碼以下shell

 1 from scrapy.selector import HtmlXPathSelector
 2 from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
 3 from scrapy.contrib.spiders import CrawlSpider, Rule
 4 
 5 import codecs
 6 import os
 7 
 8 class CuyooSpider(CrawlSpider):
 9     name = 'cuyoo'             
10     allowed_domains = ['cuyoo.com']
11     start_urls = [                 
12              'http://www.cuyoo.com/home/portal.php?mod=list&catid=2']
13                                                                      
14     rules = (                                                        
15         Rule(SgmlLinkExtractor(allow=r'.*mod=view_both.*'), callback=‘parse_item',
          follow=False), 16 ) 17 18 def __init__(self, *arg, **kwargs): 19 super(CuyooSpider, self).__init__(*arg, **kwargs) 20 self.output = codecs.open("data", "wb", "utf-8") 21 22 def __del__(self): 23 self.output.close() 24 25 def parse_item(self, response): 26 hxs = HtmlXPathSelector(response) 27 title = hxs.select("//h4[@class='ph']/text()").extract() 28 english = hxs.select('//div[@id="en"]/text()').extract() 29 chinese = hxs.select('//div[@id="cn"]/text()').extract() 30 self.output.write("---" + title[0].strip() + "---") 31 self.output.write(os.linesep) 32 for i in range(len(english)): 33 self.output.write(chinese[i].strip()) 34 self.output.write("->") 35 self.output.write(english[i].strip()) 36 self.output.write(os.linesep)

  稍微解釋一下,在上面這個spider中,我在star_urls成員中放了一個連接,http://www.cuyoo.com/home/portal.php?mod=list&catid=2,打開這個連接能夠看到下面這個網頁:編程



能夠看到
,在這個網頁中有多個新聞連接,每一個連接點擊雙語對照能夠獲得中英文對照版的新聞,查看源代碼能夠看出其連接形式爲:portal.php?mod=view_both&aid=19076,因此在rules裏定義規則

Rule(SgmlLinkExtractor(allow=r'.*mod=view_both.*'), callback=‘parse_item',follow=False)
用正則表達式表示包含'mod=view_both’的連接,scrapy在訪問該網頁時,就會自動抓取符合所定義的規則的全部連接,這樣就將這一頁裏的全部中英文對照的新聞都抓取了下來,而後對每一個抓取到的網頁調用parse_item(self, response)進行處理
(3) 由於咱們要的只是網頁裏的中英文新聞內容,因此要對下載到的網頁進行信息抽取,scrapy提供了XPath查找功能,讓咱們能夠方便地抽取文檔節點內容,不瞭解XPath能夠看看W3C的教程(http://www.w3school.com.cn/xpath/),要抽取信息,首先仍是要分析該新聞網頁的結構,可使用scrapy提供的命令行工具來分析網頁結構和試驗xpath語句,首先運行命令

scrapy shell 'http://www.cuyoo.com/home/portal.php?mod=view_both&aid=19076'
將網頁下載下來後,再輸入view(response),可在瀏覽器查看下載到的網頁


能夠看出,新聞的兩種格式分別包含在兩個div中,一個id爲en,另外一個爲cn,所在在parse_item()中,分別使用
hxs.select('//div[@id="en"]/text()').extract() 和 hxs.select('//div[@id="cn"]/text()').extract()
將內容抽取出來,並按格式寫到文件中。
(4)在項目目錄下運行 scrapy crawl cuyoo 開始抓取,最終獲得以下圖所示意的文件

2 圖形界面瀏覽器

  有了抓取到的數據,接下來要怎麼作就能夠自由發揮了,個人圖形界面是經過Qt實現的,我的以爲很方便好用,這一塊沒什麼好說的,就直接給你們看當作果吧。

程序界面                          

選擇文章

查看提示

 

 

  最後還有一個記筆記的功能還沒實現,原本是想經過使用印象筆記的SDK,把筆記直接記到印象筆記上的,可是由於他們的SDK的C++版沒有教程文檔,並且好像賬號也有點複雜,仍是等之後再找時間實現吧。

3 總結

  作這個東西收穫了兩點,第一是讓我感到編程其實頗有用,不只限於工做和學習,只要有想法,咱們能作的東西不少。第二是關於開源軟件,如今的開源軟件不少,使用開源的東西很方便,也頗有趣,同時在使用的過程當中咱們也能夠參與到其中,好比我在用scrapy的時候,在上面提到的這樣一個命令

scrapy shell 'http://www.cuyoo.com/home/portal.php?mod=view_both&aid=19076'

一開始個人連接沒用引號括起來,由於&在shell裏是個特殊符號,表示後臺運行,因此連接裏的第二個參數在運行的時候就沒了,後來想明白後,問題解決了,我以爲這個問題別人可能也會遇到,因此就在scrapy的github頁面上給提了這個問題,但願他們能加到tutorial文檔裏,而後過了一兩天,他們就真的加上了,這讓我感到很高興,也很佩服。

  好了,寫得好長,謝謝觀看~
相關文章
相關標籤/搜索