爬蟲這個聽起來很 hack 的名字,是我學習 python 的誘因.當 python 基礎學習到必定程度(基本語法,數據類型掌握) 就能夠開啓本身的小爬蟲了.畢竟實踐纔是提升的最快途徑.廢話說完了,下面直接開始:
廖凱峯的 python 基礎教程css
作爬蟲須要幾步呢? 概況來講須要兩步:
第一步是從網絡上獲取數據(大部分是html)
第二步就是解析數據html
這裏我使用 requests 模塊來代替內建模塊 urllibpython
import requests import random url = 'http://www.weather.com.cn/weather/101010100.shtml' # 數據地址,從瀏覽器copy header = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, sdch', 'Accept-Language': 'zh-CN,zh;q=0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.3226.400 QQBrowser/9.6.11681.400' } timeout = random.choice(range(80, 180)) # 超時時間 req = requests.get(url, headers=header, timeout=timeout) req.encoding = 'utf-8' # 防止中文亂碼 code = req.status_code # 返回狀態,200表明OK print(code)
header 的做用: requests模塊能夠很是方便地抓取URL內容,也就是發送一個GET請求到指定的服務器獲取界面,而瀏覽器在發送請求的時候會攜帶一些基本的信息做爲 header 傳遞給服務器.服務器會根據 header 裏的信息來判斷如何返回數據,或者返回什麼類型的數據,例如返回的數據是否能夠壓縮,是否返回移動端展現的界面.所以爲了不沒必要要的錯誤,在發送GET請求時,最好帶上header.至於header的內容,能夠經過瀏覽器調試,或者fiddler獲取.web
這時咱們得到了想要的數據,能夠用 print(req.text)
查看瀏覽器
咱們用 bs4 模塊來解析得到的數據
當咱們利用print(req.text)
打印數據後,會發現整整有1000多行.其實這些數據就是在瀏覽器中查看網頁源碼的數據.爲了方便的找到對咱們有用的數據,咱們須要 bs4 的 BeautifulSoup 類來完成.
Beautiful Soup 中文文檔服務器
from bs4 import BeautifulSoup soup = BeautifulSoup(req.text, 'html.parser') # 分析得 <ul class="t clearfix"> 標籤下記錄了咱們想要的數據,所以只須要解析這個標籤便可 ul_tag = soup.find('ul', 't clearfix') # 利用 css 查找 print(ul_tag) # 取出七天數據 # 打印每一天數據 li_tag = ul_tag.findAll('li') for tag in li_tag: print(tag.find('h1').string) # 時間 print(tag.find('p', 'wea').string) # wea # 溫度的tag格式不統一,作容錯 try: print(tag.find('p', 'tem').find('span').string) # 高溫 print(tag.find('p', 'tem').find('i').string) # 低溫 except: print('沒有高溫或低溫數據') pass print(tag.find('p', 'win').find('i').string) # win print("_______________ 分割線 ____________________")
# 結果: 4日(今天) 晴間多雲轉晴轉多雲 33℃ 20℃ 微風 _______________ 分割線 ____________________ 25日(明天) 多雲轉晴 32℃ 19℃ 微風 _______________ 分割線 ____________________ 26日(後天) 多雲轉陣雨 29℃ 18℃ 微風
# 部分網頁源碼
<ul class="t clearfix"> <li class="sky skyid lv2 on"> <h1>24日(今天)</h1> <big class="png40 d00"></big> <big class="png40 n01"></big> <p class="wea" title="晴間多雲轉晴轉多雲">晴間多雲轉晴轉多雲</p> <p class="tem"> <span>33℃</span>/ <i>20℃</i> </p> <p class="win"> <em> <span title="北風" class="N"></span> <span title="北風" class="N"></span> </em> <i>微風</i> </p> <div class="slid"></div> </li> <li class="sky skyid lv2"> <h1>25日(明天)</h1> <big class="png40 d01"></big> <big class="png40 n00"></big> <p class="wea" title="多雲轉晴轉晴">多雲轉晴</p> <p class="tem"> <span>32℃</span>/ <i>19℃</i> </p> <p class="win"> <em> <span title="西風" class="W"></span> <span title="北風" class="N"></span> </em> <i>微風</i>
1 此網站獲取數據仍是很方便的,甚至能夠不傳header.
2 數據解析前要本身查看網頁源碼,以後有一個大概的獲取範圍和思路
3 數據解析方法對應特定的數據格式,不通用.
4 有效代碼只有30行,python 語音果然 是「優雅」.「明確」.「簡單」markdown