今天學到的東西都沒有什麼技術含量,但是又實在是累了,學不進去了。就寫下來吧。
這裏有個矛盾,我今天寫的這篇文章涉及很多不相干的知識點,如果分成多篇文章,會有更大的可能性被搜索到;但是寫成一篇更像是一天的總結,而且這些知識點拆開來都是可以谷歌到的。還是寫成一篇吧。
今天做的事情是:只下載我想下載的東西。分析網頁最出名的就是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]