1. 程式人生 > >python 從web抓取資訊

python 從web抓取資訊

requests模組

想詳細瞭解requests的,可以去看看requests官方文件

requests模組可以很容易的從web下載檔案 安裝

pip install requests

然後就可以呼叫了

>>>import requests
#requests.get()可以接受一個要下載的url字串
>>>res=requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
#type(res)可以看到它返回的Response物件
>>>type(res)
<class 'requests.models.Response'>
#
res.status_code可以檢視是否成功 #如果res.status_code等於requests.codes.ok,那就代表請求成功 >>>res.status_code==requests.codes.ok #res.text可以獲取文字(如果文字太大可能會直接卡死) #所以可以先看下文字大小 >>>len(res.text) 178981 #也可以檢視部分內容 >>>print(res.text[:20]) The Project Gutenbe #但是,如果url不對,按上面這種方法也不會報錯 #例如: >>>res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg111243.txt'
)
#檢視長度,也不會報錯 >>>len(res.text) 44 >>>res.status_code 404 >>>print(res.text) <h1>404 Not Found</h1><p>File not found.</p>

所以,檢查錯誤是必須的

raise_for_status()方法可以保證程式在下載失敗時立刻停止,當然,如果下載失敗不想停止程式,可以使用try...except語句

import requests
#這個url並不存在
res=request.get('https://www.gutenberg.org/cache/epub/1112/pg112312.txt'
) try: res.raise_for_status() #程式走到這裡發現了錯誤,然後進入except except Exception as e: print('There was a problem: %s' %(e))

執行程式,報錯:

將下載的檔案儲存到硬碟

儲存檔案可以用open()和write()方法,但是:

必須用'寫二進位制'模式開啟該檔案

因為這樣可以儲存該檔案中的'Unicode編碼'

import requests
res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
res.raise_for_status()
pfile=open('pg1112.txt','wb')
for i in res.iter_content(1000):
    pfile.write(i)

pfile.close()

iter_content(maxsize)在每次迭代中,返回一段內容。maxsize設定每次返回的最大位元組數(可以用來做進度條)

總體思路:

  • 1.呼叫requests.get()下載該檔案
  • 2.用'wb'呼叫open(),以二進位制方式開啟(創-建)一個新檔案(用來儲存下載的檔案內容)
  • 3.利用Respose物件的iter_content(maxsize)方法做迴圈
  • 4.每次迭代中呼叫write(),將內容寫入該檔案
  • 5.呼叫close()關閉檔案

BeautifulSoup模組解析HTML

BeautifulSoup是一個模組,用於從HTML頁面中提取資訊(比正則好用很多)

安裝

pip3 install beautifulsoup4

bs4.BeautifulSoup()函式呼叫時需要一個字串,其中包含要解析的html bs4.BeautifulSoup()函式返回一個BeautifulSoup物件。

用select()方法尋找元素

>>>import requests,bs4
>>>res=requests.get('http://book.dangdang.com/')
>>>res.raise_for_status()
>>>nSoup=bsr.BeautifulSoup(res.text)
>>>elems=nSoup.select('dt')
#獲取第一條資料
>>>elems[0]   #型別為class,可以用str(elems[0])轉為字串
<dt class="con " name="m403752_pid5367_t10276">特色書單</dt>
#獲取文字
>>>elems[0].getText()
'特色書單'
#獲取所有屬性對
>>>elems[0].attrs
{'class': ['con', ''], 'name': 'm403752_pid5367_t10276'}
#獲取某個屬性
>>>elems[0].get('name')
'm403752_pid5367_t10276'

css選擇器的例子

假如:soup=bs4.BeautifulSoup(exampleFile)

傳遞給select()方法的選擇器將匹配...
soup.select('div')所有名為<div>的元素
soup.select('#myid')所有id='myid'的元素
soup.select('.class1')所有class=class1的元素
soup.select('div span')所有<div>元素之內的<span>元素
soup.select('div > span')所有直接在<div>元素之內的<span>元素,中間沒有其他元素
soup.select('input[name]')所有名為<input>,並有name屬性(其值無所謂)
soup.select('input[type="button"]')所有名為<input>,並有type屬性,其值為button的元素