Python 爬蟲基礎:凜冬將至
啊哈,我又來了,winter is coming.
本文寫的是Python 爬蟲的一些基礎知識,需要python的語法知識做基礎,回顧和小結一下我看的視頻(麥子學院-python爬蟲基礎),寫得本文。
主要內容包括如下幾部分:
- 什麼是爬蟲?
- Http 協議,url,cookie介紹
- Python標準庫里對http協議的實現及用法
1. 什麼是爬蟲?
爬蟲(spider),就是按照一定的規則,自動從網路上爬取對應數據的程序。
爬蟲可以獲取給定網站的圖片,文本,數據等,獲取的數據就可以處理之後用於數據分析領域
2. Http 協議,URL,Cookie介紹
- http 協議
首先使用Chrome的開發者工具(ctrl+shift+I)查看需爬取網頁的http請求,點擊network下的左上角的紅點,刷新網頁,就顯示出該網頁相應的進程。
- http請求及其構成
- 方法:GET/POST
- URL:相對路徑
- Host:目標主機
- Accept:可接受的媒體類型
- User-Agent:瀏覽器身份
- Accept-Encoding:編碼類型
- Accept-Language:可接受的語言
- http應答及其構成
- 應答碼(status)
2××:成功
3××:重定向
4××:客戶端錯誤
5××:服務端錯誤
2. Server:應答伺服器
3. Content-Type:應答的數據類型
4. Content-Encoding:應答編碼類型
5. Content-Length:應答的內容長度
- URL介紹(Uniform Resource Locator)
組成部分:schema: //path?query(協議,路徑,參數)
編碼規則:除英文字母、數字和部分符號外,其他的全部使用百分號+十六進位碼值進行編碼。
參數規則:參數以問號作為開始;參數對樣式key=value;參數對之間使用&連接
- Cookie介紹
Cookie:伺服器在客戶端存儲的信息。
在http請求時,客戶端要把未超時的cookie發送回伺服器;在應答時,伺服器會把新的cookie發給客戶端,等下次請求時又帶上這些新cookie。
Cookie的用途:登錄信息(判斷用戶是否登錄),購物車(保存用戶購買的商品)。例如模擬用戶登錄知乎去修改個性簽名。
Cookie的格式:
客戶端發送Cookie時:
Cookie: key1=value1; key2=value2; key3=value3
伺服器端保存Cookie時:
Set-Cookie: key1=value1; path=/; domain=xx
3. Python標準庫urllib里對http協議的實現及用法
- urllib基礎知識:
- urllib.urlopen:
對http協議的最簡單的實現,是urllib的一個最基本方法。包含以下的參數:
url: scheme(http: / file:)
data: 如果data不為空,則變為post方法,相當於post數據給服務端,數據格式必須是application/x-www-form-urlencoded.
.urlopen返回類文件句柄。類文件句柄的常用方法:
read(size): size = -1 / None;readline();readlines();close();getcode()
def demo(): s = urllib.urlopen(http://blog.kamidox.com/no-exist) s.read() s.readline() for i in range(10): print(line %d: %s % (i+1,s.readlines()))
- urllib.urlretrieve
可以把遠程的文件下載到本地來。包含以下的參數:
url:遠程地址
filename:要保存到本地的文件
reporthook:下載狀態報告。(參數1:當前傳輸的塊數;參數2:塊大小size;參數3:數據總大小totalsize)
data:POST的數據,格式必須是application/x-www-form-urlencoded.
def progress(blk, blk_size, total_size): print(%d/%d - %.02f%% % (blk * blk_size, total_size, (float)(blk * blk_size) * 100 / total_size))def retrieve(): urllib.urlretrieve(http://blog.kamidox.com, index.html, reporthook=progress)if __name__ == __main__: retrieve()
2. HTMLParser簡介
HTMLParser是用於解析網頁獲得數據的一個類,在使用時一般繼承它然後重載它的方法。
feed: 向解析器喂數據,可以分段提供
handle_starttag: 處理html的開始標籤
- tag:標籤名稱
- attrs:屬性列表
handle_data:處理標籤里的數據體
- data:數據文本
handle_endtag(tag):處理結束標籤,比如</div>
handle_startendtag(tag, attrs) :處理自己結束的標籤,如<img />handle_comment(data) :處理注釋,<!-- -->之間的文本代碼如下:
# -*- coding: utf-8 -*-from html.parser import HTMLParserfrom urllib import requestclass MovieParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.movies = [] def handle_starttag(self, tag, attrs): def _attr(attrlist, attrname): for attr in attrlist: if attr[0] == attrname: return attr[1] return None if tag == li and _attr(attrs, data-title) and _attr(attrs, data-category) == nowplaying: movie = {} movie[title] = _attr(attrs, data-title) movie[score] = _attr(attrs, data-score) movie[director] = _attr(attrs, data-director) movie[actors] = _attr(attrs, data-actors) self.movies.append(movie) print(%(title)s|%(score)s|%(director)s|%(actors)s % movie)def nowplaying_movies(url): req = request.Request(url) req.add_header(User-Agent,Mozilla/5.0 (Windows NT 6.1; Win64; x64 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36) s = request.urlopen(req) parser = MovieParser() data = s.read() data.decode(utf8) # must be str, not bytes必須是字元串,不能是位元組,所以需要解碼,但是還是不對 parser.feed(data) s.close() return parser.moviesif __name__ == __main__: url = https://movie.douban.com/cinema/nowplaying/hangzhou/ movies = nowplaying_movies(url) import json print(%s % json.dumps(movies, sort_keys=True, indent=4, separators=(,, : )))
有些地方還需要調試,先這樣,溜了。。
推薦閱讀:
※在Mac系統下python如何安裝第三方函數庫?
※如何用 Python 中的 NLTK 對中文進行分析和處理?
※營銷人想學python,卻被卡在pycharm官網下載不了這環,求助?
※比特幣價格能預測嗎?(附python代碼) #1
※用Python淺嘗數據挖掘