python爬蟲——簡單論文標題檢索

有趣的爬蟲,獨有的意義召喚着我去學習,去嘗試。最近有感於每天對於論文的收集,感覺自己的收集速度趕不上論文的更新速度,同時對於自己想找到的論文的收集比較麻煩。因此,學習用python寫一個很簡單的爬蟲,完成對最新論文的概括或查找。對於計算機領域的最新論文,一般都可以在 http://arxiv.org/list/cs/recent 找到,因此,對此網頁嘗試簡單爬蟲。 本博客簡要介紹簡單爬蟲快速獲取相關新論文標題和pdf。

所需網頁的抓取

首先加載爬蟲所需的模塊,urlliburllib2是常見的打開url網頁的模塊,如urllib.urlopen(url[,data[,proxies]]),打開一個url,並返回一個文件對象
我們這裏使用urllib2模塊,發送一個打開網頁的請求,並使用urlopen打開網頁,代碼如下:

import urllib2

req = urllib2.Request('http://arxiv.org/list/cs/recent')
response = urllib2.urlopen(req)
the_page = response.read()

print(the_page)

輸出得到的結果即爲整個網頁源代碼:
這裏寫圖片描述

信息的匹配與搜索

抓取到所需要的網頁後會發現,網頁的源代碼雜亂,這時需要在雜亂的代碼中找到自己所需要的信息,將有用的信息輸出。因此,信息的匹配與正則化的運用由此生出。例如,需要對所有的文章標題進行輸出,那麼需要找到每個論文標題處的獨有特徵,正則化表達後表示出標題,將其全部輸出。
具體的正則化規則在其他人的博客中也有詳細介紹,如:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html ,正則表達式並不是Python的一部分。正則表達式是用於處理字符串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益於這一點,在提供了正則表達式的語言裏,正則表達式的語法都是一樣的,區別只在於不同的編程語言實現支持的語法數量不同;但不用擔心,不被支持的語法通常是不常用的部分。如果已經在其他語言裏使用過正則表達式,只需要簡單看一看就可以上手了。
其匹配流程如下:
這裏寫圖片描述
具體我們來看我們的例子,對於論文標題的表達,首先提取網頁源代碼中涉及每一篇最新論文的部分,如下(隨機舉例):

<dt><a name="item18">[18]</a>&nbsp;  <span class="list-identifier"><a href="/abs/1609.04722" title="Abstract">arXiv:1609.04722</a> [<a href="/pdf/1609.04722" title="Download PDF">pdf</a>, <a href="/ps/1609.04722" title="Download PostScript">ps</a>, <a href="/format/1609.04722" title="Other formats">other</a>]</span></dt>
<dd>
<div class="meta">
<div class="list-title mathjax">
<span class="descriptor">Title:</span> Concordance and the Smallest Covering Set of Preference Orderings
</div>
<div class="list-authors">
<span class="descriptor">Authors:</span> 
<a href="/find/cs/1/au:+Lin_Z/0/1/0/all/0/1">Zhiwei Lin</a>, 
<a href="/find/cs/1/au:+Wang_H/0/1/0/all/0/1">Hui Wang</a>, 
<a href="/find/cs/1/au:+Elzinga_C/0/1/0/all/0/1">Cees H. Elzinga</a>
</div>
<div class="list-comments">
<span class="descriptor">Comments:</span> 21 pages
</div>
<div class="list-subjects">
<span class="descriptor">Subjects:</span> <span class="primary-subject">Artificial Intelligence (cs.AI)</span>; Data Structures and Algorithms (cs.DS); Computer Science and Game Theory (cs.GT); Information Theory (cs.IT)

這裏,下面句子即爲該論文的title部分描述:

<span class="descriptor">Title:</span> Concordance and the Smallest Covering Set of Preference Orderings
</div>

我們想要的結果,即爲<span class="descriptor">Title:</span>之後和</div>之前的部分文字進行輸出,對應於正則表達式規則,可以表達如下:

import re #加載正則化匹配模塊
myItems = re.findall('<span class="descriptor">Title:</span>(.*?)</div>',page,re.S)

這就是正則化的方法,類似該方法可以進行所需信息的匹配的查找。
同時,python中函數功能的使用,可以使得代碼更簡潔,爬蟲的功能添加也更加方便,python中的函數主要用def表示,如上文中的論文標題輸出函數可以寫成如下形式,輸出即爲所有該網頁新論文的標題。

def paper_title(page):
    myItems = re.findall('<span class="descriptor">Title:</span>(.*?)</div>',page,re.S)

    for item in myItems:
        print item

簡單實例

這裏我們完成論文的標題輸出部分的爬蟲,代碼如下:

import urllib2
import re
req = urllib2.Request('http://arxiv.org/list/cs/recent')
response = urllib2.urlopen(req)
the_page = response.read()

def paper_title(page):
    myItems = re.findall('<span class="descriptor">Title:</span>(.*?)</div>',page,re.S)

    for item in myItems:
        print item

paper_title(the_page)

輸入結果如下:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章