手工分析網頁內容

今天學到的東西都沒有什麼技術含量,但是又實在是累了,學不進去了。就寫下來吧。

這裏有個矛盾,我今天寫的這篇文章涉及很多不相干的知識點,如果分成多篇文章,會有更大的可能性被搜索到;但是寫成一篇更像是一天的總結,而且這些知識點拆開來都是可以谷歌到的。還是寫成一篇吧。

今天做的事情是:只下載我想下載的東西。分析網頁最出名的就是beautifulsoup,但是我想用用笨辦法,正好了解一下網頁組成。

簡單介紹一下下載網頁。首先就是向網頁發送請求。這個我正在鑽研,普通的就是發送個請求,python默認的請求是帶着python頭(headers)的。這樣的會被大部分服務器拒絕,我們簡單的僞裝一下就好。

headers = {
        "headers" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36"
    }

這個基本就可以僞裝成主流瀏覽器。也可以僞裝成windows系統,網上一查便知。向網站發送請求:

response = requests.get(url, headers = headers)

url就是你想要下載的網頁。我這裏選擇的是cnbeta,因爲它基本不會拒絕爬蟲的請求。csdn相對來說就保護有點過頭了,我把原味鏈接放到微信公共賬號裏,然後在微信裏點擊的時候,就相當於是微信的服務器向csdn發送請求,csdn竟然直接就拒絕了。在我這邊看來,就是網址不存在。

再高級一點可以加入自己的cookie,這樣就相當於自己登錄了。改天寫個教程專門寫這個。

網頁就保存在response裏,想要查看網頁內容的話可以:

print response.text
注意看是沒有()的哦。因爲不是method。現在我們就可以開始分析了。

先轉換成html對象

parsed_body = html.fromstring(response.text)
這樣這個對象有個xpath的method,就是我們分析網頁的殺器了。有關xpath的教程建議搜索w3c,很簡單,就5頁。

比如這個網頁:http://www.cnbeta.com/articles/329197.htm,我在源代碼中找到標題

<section class="main_content">
    <section class="main_content_left">
        <article class="cb_box article">
            <div class="body">
                <header>
                    <h2 id="news_title">創新發布聲霸鑼藍牙音箱 2.1聲道帶NFC是亮點</h2>
                    <a alt="432" id="sign"></a>
儘量找到其與衆不同的地方,感覺id就是個好的切入點。於是搜索了一下,h2的id是獨一無二的:

article_title = parsed_body.xpath('//h2[@id="news_title"]/text()')
//指的是目前的標籤,這個例子中我們要的就是h2,[ ]是該標籤的性質,我們抓的是id,@是性質的修飾,標明後面是它的性質。text()是該標籤的內容,注意沒有@,因爲不是它的性質。

比如我要下載下面標籤的超鏈接:

<span class="where">
                            稿源:<a href="http://digi.tech.qq.com/">騰訊數碼</a></span>
其實就是下載span下面的a的href性質

from_url = parsed_body.xpath('//span[@class="where"]/a/@href')
末尾的性質或者文檔或者標籤本身就是我們要取出的內容。

內容也是一樣的方法。

本來事情就算是結束了,沒想到遇到了討人厭的漢字編碼問題。如果print article_title,你會發現會輸出:

[u'\xe5\xbd\xad\xe5\x8d\x9a\xef\xbc\x9a\xe9\x98\xbf\xe9\x87\x8cIPO\xe5\x8a\xbf\xe5\xa4\xb4\xe5\xbc\xba \xe5\x85\xb3\xe8\x81\x94\xe8\x82\xa1\xe5\x8f\x97\xe7\x9b\x8a\xe8\x82\xa1\xe4\xbb\xb7\xe4\xb8\x8a\xe6\xb6\xa8']
首先這是個字符串,但是即使把其中的內容取出來打印,也依然是這樣的內容,網頁的編碼是utf-8,這看起來也是utf-8。如果把u去掉,把其餘的複製出來輸出的話,會得到:
彭博:阿里IPO勢頭強 關聯股受益股價上漲
就沒問題了。這個u用來修飾字符串,是把字符串內的內容翻譯成unicode,而這些字符串本來就是unicode,因此就出錯了。

網上提供的解決辦法如下:

title = article_title[0].encode('raw_unicode_escape')
這下就可以盡情的下載啦。

源代碼:https://github.com/gt11799/cnbeta_crawler

——————————————

github主頁:https://github.com/gt11799

E-mail:[email protected]










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