網路資料爬取例項教程

2021-08-09 15:28:41 字數 4529 閱讀 1779

2023年趵突泉會停止噴湧嗎

用眼睛找到我們需要的資訊

事實上,從網上爬取資料的過程和我們瀏覽網頁的過程是一樣的,同樣也包含這兩個步驟,只是工具略有不同而已。

python有兩個內建的模組urllib和urllib2,可以用來作為爬取資料用的「瀏覽器」,pycurl也是乙個不錯的選擇,可以應對更複雜的要求。

我們知道,http協議共有8種方法,真正的瀏覽器至少支援兩種請求網頁的方法:get和post。相對於urllib2而言,urllib模組只接受字串引數,不能指定請求資料的方法,更無法設定請求報頭。因此,urllib2被視為爬取資料所用「瀏覽器」的首選。

這是urllib2模組最簡單的應用:

import urllib2

response = urllib2.urlopen('')

if response.code == 200:

html = response.read() # html就是我們所請求的網頁的原始碼

print html

else:

print

'response error.'

urllib2.urlopen除了可以接受字串引數,還可以接受urllib2.request物件。這意味著,我們可以靈活地設定請求的報頭(header)。

urllib2.urlopen的建構函式原型如下:

urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
urllib2.request的建構函式原型如下:

urllib2.request(url[, data][, headers][, origin_req_host][, unverifiable])
beautiful soup做為python的第三方庫,可以幫助我們從網頁原始碼中找到我們需要的資料。beautiful soup可以從乙個html或者xml提取資料,它包含了簡單的處理、遍歷、搜尋文件樹、修改網頁元素等功能。安裝非常簡單(如果沒有解析器,也一併安裝):

pip install beautifulsoup4

pip install lxml

下面的例子演示了如何從上找到我們需要的資訊。

import urllib2

from bs4 import beautifulsoup

response = urllib2.urlopen('')

if response.code == 200:

html = response.read()

soup = beautifulsoup(html, 'lxml')

div = soup.find('div') # 找出第乙個div節點

print div # 檢視div標籤的全部資訊

print div.text # 列印div標籤的內容

print div.attrs # 列印div標籤的全部屬性

print div['style'] # 列印div標籤的樣式

divs = soup.find_all('div') # 找出所有的div節點

for div in divs: # 遍歷所有的div節點

print div

for tr in divs[1].find_all('tr'): # 遍歷所有的tr

for td in tr.find_all('td'):

print td.text

else:

print

'response error.'

#-*- coding: utf-8 -*-

import re

html = u"""

2023年10月15日

2023年10月15日

2023年5月9日

2023年11月23日

2023年7月8日

2023年12月5日

2023年3月22日

2023年6月17日

"""pattern = re.compile(r'(\d)年(\d)月(\d)日')

data = pattern.findall(html.encode('utf-8'))

print data

濟南市城鄉水務局**(每天都會發布趵突泉和黑虎泉的地下水位,並且可以查詢到更早期的水位資料。本教程的目標任務是:

繪製指定時間段的水位變化曲線分析濟南市地下水位變化規律,對2023年泉水是否會停止噴湧做出預判簡單操作幾次,我們就會發現,自2023年5月2日開始,濟南市城鄉水務局**每天都會發布趵突泉和黑虎泉的地下水位資料,全部資料採用分頁方式顯示,每頁顯示20天,頁面編號從1開始,第1頁的url為:

.gov

.cn/list.php?catid=101&page=1

import urllib2

defget_data_by_page

(page):

url = '.gov.cn/list.php?catid=101&page=%d'%page

req = urllib2.request(url, '', )

response = urllib2.urlopen(req)

if response.code == 200:

html = response.read()

return html

else:

return

false

width="25%"

align="center"

bgcolor="#dae9f8"

class="s14">日期td>

width="15%"

align="center"

bgcolor="#dae9f8">

class="s14">趵突泉水位span>

td>

width="14%"

align="center"

bgcolor="#dae9f8">

class="s14">黑虎泉水位span>

td>

tr>

align="center"

bgcolor="#daf8e8"

class="s14">2023年10月2日td>

align="center"

bgcolor="#daf8e8"

class="s14">28.20公尺td>

align="center"

bgcolor="#daf8e8"

class="s14">28.15公尺td>

tr>

align="center"

bgcolor="#daf8e8"

class="s14">2023年10月1日td>

align="center"

bgcolor="#daf8e8"

class="s14">28.16公尺td>

align="center"

bgcolor="#daf8e8"

class="s14">28.10公尺td>

tr>

def

get_data_by_page

(page):

data = list()

p_date = re.compile(r'(\d)\d+(\d)\d+(\d)')

url = '.gov.cn/list.php?catid=101&page=%d'%page

req = urllib2.request(url, '', )

response = urllib2.urlopen(req)

if response.code == 200:

html = response.read()

soup = beautifulsoup(html, 'lxml')

for tr in soup.find_all('tr'):

tds = tr.find_all('td')

if len(tds) == 3

and'bgcolor'

in tds[0].attrs and tds[0]['bgcolor'] == '#daf8e8':

year, month, day = p_date.findall(tds[0].text.encode('utf8'))[0]

baotu = float(tds[1].text[:-1])

heihu = float(tds[2].text[:-1])

return data

目前已知的錯誤有:

最好的方法是,從最近的資料日期開始,使用datetime模組的timedelta物件,逐天處理,日期錯誤的,改正日期,缺失資料的,用前後兩天的平均值補齊。

待續待續

待續

awk例項教程

1.awk語法規則 awk 2.顯示最近登入的5個帳號 last n 5 awk root root root dmtsai root awk工作流程是這樣的 讀入有 n 換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,0則表示所有域,1表示第乙個域,n表示第n個域。預設域分隔符是 ...

CSS reflow例項教程

frame主要的動作有三個 構造frame,以建立物件樹 dom樹 reflow,以確定物件位置,或者www.cppcns.com是呼叫mozilla的layout 這裡是指原始碼的實現 繪製,以便物件能顯示在螢幕上 總的來說,reflow就是載入內容樹 在html中就是dom樹 和建立或更新fra...

MySQL檢索資料的例項教程

mysql 不區分大小寫,但盡量做到關鍵字大寫,列和表明小寫,方便閱讀和除錯。sql語句,所有的空格都被忽略。sql語句可以在上一行給出也可以分成許多行。一般,分成多行寫。自動增量 某些列表需要唯一值,mysql可以自動為每一行分配乙個可用編號,不用在新增每一行時手動分配唯一值。describe s...