python 從web抓取資訊
阿新 • • 發佈:2019-01-08
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)