Python 爬蟲基礎:凜冬將至

啊哈,我又來了,winter is coming.

本文寫的是Python 爬蟲的一些基礎知識,需要python的語法知識做基礎,回顧和小結一下我看的視頻(麥子學院-python爬蟲基礎),寫得本文。

主要內容包括如下幾部分

  1. 什麼是爬蟲?
  2. Http 協議,url,cookie介紹
  3. Python標準庫里對http協議的實現及用法

1. 什麼是爬蟲?

爬蟲(spider),就是按照一定的規則,自動從網路上爬取對應數據的程序。

爬蟲可以獲取給定網站的圖片,文本,數據等,獲取的數據就可以處理之後用於數據分析領域

2. Http 協議,URL,Cookie介紹

  • http 協議

首先使用Chrome的開發者工具(ctrl+shift+I)查看需爬取網頁的http請求,點擊network下的左上角的紅點,刷新網頁,就顯示出該網頁相應的進程。

  • http請求及其構成
  1. 方法:GET/POST
  2. URL:相對路徑
  3. Host:目標主機
  4. Accept:可接受的媒體類型
  5. User-Agent:瀏覽器身份
  6. Accept-Encoding:編碼類型
  7. Accept-Language:可接受的語言
  • http應答及其構成
  1. 應答碼(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協議的實現及用法

  1. 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淺嘗數據挖掘

TAG:Python入門 | Python | Python教程 |