Python爬取CSDN博客

      當時學習Python的主要原因,就是爲了學習爬蟲,從網上爬取自己想要的內容。Python作爲一種腳本語言,學習起來方便簡單,而且語言格式簡練,很多C++,java要寫很長的程序,用Python也許幾行就搞定了。這篇就來說說用Python編寫爬蟲的過程。其實用其他語言也可以寫爬蟲,只不過用Python非常簡單。

    1.最簡單的爬蟲

    新建一個python腳本,命名爲csdn.py。先來編寫個最簡單的爬蟲,就是爬取一個網頁的內容。打開一個網站,用python獲得該網站返回的響應,即html源碼。(這個源碼用瀏覽器打開就是我們獲得的網頁內容)

import urllib2
result=urllib2.urlopen("http://www.baidu.com/")
html=result.read()
print html
程序非常簡單:第一行導入模塊urllib2,該模塊用於web方面的開發。第二行用該模塊裏的urlopen函數打開“百度”主頁。第三行把第二步返回的內容賦值給html變量。最後就是print輸出結果。我們來看看返回的結果
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge"><meta content="always" name="referrer"><link rel="dns-prefetch" href="//s1.bdstatic.com"/><link rel="dns-prefetch" href="//t1.baidu.com"/><link rel="dns-prefetch" href="//t2.baidu.com"/><link rel="dns-prefetch" href="//t3.baidu.com"/><link rel="dns-prefetch" href="//t10.baidu.com"/><link rel="dns-prefetch" href="//t11.baidu.com"/><link rel="dns-prefetch" href="//t12.baidu.com"/><link rel="dns-prefetch" href="//b1.bdstatic.com"/><title>百度一下,你就知道</title>

。。。其實就是HTML源碼,代碼太多直貼了前面一部分。這就是一次最簡單的爬蟲


    2.最簡單的爬蟲爬取csdn博客
    我們就用上面最簡單的爬蟲來爬蟲CSDN博客的內容。將urlopen()裏面的網址換爲我的csdn其中一篇文章的地址“http://blog.csdn.net/u013080921/article/details/44134017”。運行,發現出錯,結果顯示如下:

Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    execfile("csdn.py")
  File "csdn.py", line 12, in <module>
    result=urllib2.urlopen("http://blog.csdn.net/u013080921/article/details/44134017")
  File "C:\Python27\lib\urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python27\lib\urllib2.py", line 410, in open
    response = meth(req, response)
  File "C:\Python27\lib\urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python27\lib\urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "C:\Python27\lib\urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "C:\Python27\lib\urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 403: Forbidden
其實就是403錯誤,被禁止訪問。爲什麼呢?因爲很多網站是禁止機器來訪問的,機器也就是程序訪問網站和人訪問網站是有區別的。這裏涉及到http協議。人上網用瀏覽器訪問的時候,除了請求行,後面的首部包含了很多的信息。比如,我用火狐瀏覽器訪問網站,使用Firebug查看親求內容如下圖


上圖很多內容,再用程序爬取時是沒有的,網站因此認爲你不是認爲瀏覽,將你的訪問禁止。既然這樣,我們就來模擬人爲訪問網站的過程。而Python也提供了相應的類來處理。


3.模仿瀏覽器爬取csdn博客

     將程序改爲如下:

import urllib2

opener=urllib2.build_opener()
user_agent="Mozilla/5.0 (Windows NT 6.1; rv:36.0) Gecko/20100101 Firefox/36.0"
headers={'User-Agent':user_agent}
req=urllib2.Request("http://blog.csdn.net/happylee6688/article/details/43953671",headers=headers)
result=opener.open(req)
html=result.read()

print html
因爲要模仿瀏覽器,需要使用build_opener函數,這是個高級函數,可以添加許多高級功能,如驗證,cookie,代理等。這裏只是添加了一個請求首部中的“User-Agent”對象,只是上圖的值“Mozilla/5.0 (Windows NT 6.1; rv:36.0) Gecko/20100101 Firefox/36.0”,有火狐瀏覽器的版本。再來執行給程序,結果如下:

說明我們獲取了csdn博客的html源碼。下面就是要提取我們需要的內容,這裏要用到一個很重要的概念---正則表達式。


3.根據HTML源碼提取內容

   這裏你需要知道正則表達式的基本知識,同時需要會分析源碼。火狐瀏覽器的用戶可以使用Firebug來查看源碼,IE的按下F12查看源碼。對於文章標題的源碼如下

<span class="link_title"><a href="/u013080921/article/details/42582267">
        Java多線程---Lock類
        </a></span>
那麼標題的匹配如下:

title=re.search(' <span class="link_title"><a .*?>(.*?)</a>',html,re.S)
re爲正則表達式模塊。獲取爲
print title.group(1)
輸出就是:   Java 加解密技術系列之 MD5 。文章的題目。提取內容也是一樣,不過提取的內容中有很多HTML標籤,需要去除。完整代碼如下:

# -*- coding: utf-8 -*- 
import urllib2
import urllib
import re
opener=urllib2.build_opener()
user_agent="Mozilla/5.0 (Windows NT 6.1; rv:36.0) Gecko/20100101 Firefox/36.0"
headers={'User-Agent':user_agent}
req=urllib2.Request("http://blog.csdn.net/happylee6688/article/details/43953671",headers=headers)
result=opener.open(req)
html=result.read().decode("utf-8")  
html.encode("utf-8")
#搜索文章題目
title=re.search(' <span class="link_title"><a .*?>(.*?)</a>',html,re.S)
#打印文章題目
print title.group(1)

content=re.findall('<div style=".*?">(.*?)</div>',html,re.S)
reg=re.compile('<[^>]*>')   #去除多餘的html標籤,只留下內容
for con in content:
	s=reg.sub('',con)
	print s,  #打印內容
	
結果如下圖 :

到這裏基本的爬蟲內容就寫完了。

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