python beautifulsoup爬蟲

爬蟲這個聽起來很 hack 的名字,是我學習 python 的誘因.當 python 基礎學習到必定程度(基本語法,數據類型掌握) 就能夠開啓本身的小爬蟲了.畢竟實踐纔是提升的最快途徑.廢話說完了,下面直接開始: 
廖凱峯的 python 基礎教程css

作爬蟲須要幾步呢? 概況來講須要兩步: 
第一步是從網絡上獲取數據(大部分是html) 
第二步就是解析數據html

1. 從網站獲取數據

這裏我使用 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

header 的做用: requests模塊能夠很是方便地抓取URL內容,也就是發送一個GET請求到指定的服務器獲取界面,而瀏覽器在發送請求的時候會攜帶一些基本的信息做爲 header 傳遞給服務器.服務器會根據 header 裏的信息來判斷如何返回數據,或者返回什麼類型的數據,例如返回的數據是否能夠壓縮,是否返回移動端展現的界面.所以爲了不沒必要要的錯誤,在發送GET請求時,最好帶上header.至於header的內容,能夠經過瀏覽器調試,或者fiddler獲取.web

這時咱們得到了想要的數據,能夠用 print(req.text)查看瀏覽器

2. 解析數據

咱們用 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("_______________ 分割線 ____________________") 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
# 結果: 4日(今天) 晴間多雲轉晴轉多雲 33℃ 20℃ 微風 _______________ 分割線 ____________________ 25日(明天) 多雲轉晴 32℃ 19℃ 微風 _______________ 分割線 ____________________ 26日(後天) 多雲轉陣雨 29℃ 18℃ 微風
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

3. 總結

1 此網站獲取數據仍是很方便的,甚至能夠不傳header. 
2 數據解析前要本身查看網頁源碼,以後有一個大概的獲取範圍和思路 
3 數據解析方法對應特定的數據格式,不通用. 
4 有效代碼只有30行,python 語音果然 是「優雅」.「明確」.「簡單」markdown

相關文章
相關標籤/搜索