簡單抓取網頁的代碼 import requests#導入requests包 from bs4 import BeautifulSoup#從bs4中導入BeauifulSoup包 import re#導入正則表達式的包 r = requests.get("http://baidu.com") r.en ...
簡單抓取網頁的代碼
import requests#導入requests包 from bs4 import BeautifulSoup#從bs4中導入BeauifulSoup包 import re#導入正則表達式的包 r = requests.get("http://baidu.com") r.encoding = 'utf-8'#就沒有進行其他異常判斷了,做個簡單的HTML網頁的爬蟲 soup = BeautifulSoup(r.text) type(soup)#查看當前soup對象的類型 r.head#此後就可以抓取rr對象的屬性了,比如head,title,body等
如果要抓取本地的靜態網頁的代碼的話,我曾經抓取不成功,但是我想了其他的辦法,還是使用上述代碼,只不過url地址換成了本地的文件地址了而已,需要註意的是,我是在IDEA裡面編寫並且運行我的HTML代碼的,並且通過IDEA生成了一個本地區域網的埠,複製它的路徑,再導入url中,即可抓取本地靜態HTML代碼,如果我把這個瀏覽器或則IDEA關了的話,則python抓取的時候則會報錯。
下麵是爬蟲爬取大學排名的代碼:
import requests from bs4 import BeautifulSoup allUniv = []#建立一個二維列表,存儲所有表格信息 def getHTMLText(url):#獲取傳入的地址 try:#進行異常的處理 r = requests.get(url,timeout = 30)#參數1:某網頁的url地址,參數2:設定每次請求超時時間為n秒 r.raise_for_status()#如果次參數不是200,則產生異常,進入異常處理語句,否則程式繼續往下走 r.encoding = 'utf-8'#將獲取的內容轉碼,使中文能夠正常顯示而不會產生亂碼 return r.text#HTTP相應內容的字元串形式,即url對應的頁面內容 except: return "" def fillUnivList(soup): data = soup.find_all('tr')#通過soup對象的find_all屬性找到抓取的網頁中的所有tr標簽 for tr in data: ltd = tr.find_all('td')#再在每個tr標簽中找到所有的td標簽 if len(ltd) == 0:#如果這一行的tr中的td標簽數為0個的話,則跳過這個tr,繼續進行下一個 continue singleUniv = []#將這個大學的各項信息載入列表 for td in ltd: singleUniv.append(td.string)#提取已載入singleUniv列表的td標簽中的信息, allUniv.append(singleUniv)#提取singleUniv列表中的信息到allUniv列表中 def printUnivList(num): print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^4}{5:{0}^10}".format(chr(12288),"排名","學校名稱","省份","總分","培養規模"))#註意輸出格式的控制 for i in range(num): u = allUniv[i] print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^4}{5:{0}^10}".format(chr(12288),u[0],u[1],u[2],eval(u[3]),u[6])) def main(num): url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'#設定網頁的地址 html = getHTMLText(url)#將url地址傳入函數,返回字元串形式給變數html soup = BeautifulSoup(html,"html.parser")#生成一個soup的對象,此時soup就是一個BeautifulSoup對象 fillUnivList(soup)#將soup對象傳入函數 printUnivList(num) main(300)
在代碼中都有詳細的註釋即理解,希望對你有所幫助。
下麵是搜索關鍵字自動提交的爬蟲代碼:
import requests from bs4 import BeautifulSoup import re import json def getKeywordResult(keyword): url = 'http://www.baidu.com/s?wd='+keyword try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = 'utf-8' return r.text except: return "" def parserLinks(html): soup = BeautifulSoup(html, "html.parser") links = [] for div in soup.find_all('div', {'data-tools': re.compile('title')}): data = div.attrs['data-tools'] #獲得屬性值 d = json.loads(data) #將屬性值轉換成字典 links.append(d['title']) #將返回鏈接的題目返回 return links def main(): html = getKeywordResult('Python語言程式設計基礎(第2版)') ls = parserLinks(html) count = 1 for i in ls: print("[{:^3}]{}".format(count, i)) count += 1 main()
相關操作與其步驟的含義與其上的代碼如出一轍,請仔細參悟
下麵給出requests庫的相關屬性
requests庫是一個簡潔且簡單的處理HTTP請求的第三方庫,它的最大優點是程式邊學過程更接近正常URL訪問過程。requests庫支持非常豐富的鏈接訪問功能,包括國際功能變數名稱和URL獲取、HTTP長連接和連接緩存、HTTP會話和Cookie保持、瀏覽器使用風格的SSL驗證、基本的摘要認證、有效的鍵值對Cookie記錄、自動解壓縮、自動內容解碼、文件分塊上傳、HTTP(S)代理功能、連接超時處理、流數據下載等。
網路爬蟲和信息提交只是requests庫能支持的基本功能,requests庫中的網頁請求函數:
get(url,timeout = n) 對應HTTP的get方式,獲取網頁最常用的方法,可以增加timeout=n參數,設定每次請求超時時間為n秒
post(url,data = {'key':'value'}) 對應HTTP的post方式,其中字典用於傳遞客戶數據
delete(url) 對應於HTTP的delete方式
head(url) 對應於HTTP的head方式
options(url) 對應於HTTP的options方式
put(url,data = {'key':'value'}) 對應於HTTP的put方式,其中字典用於傳遞客戶數據
requests.get()代表請求過程,它返回的Response對象代表響應,Response對象的屬性如下:
status_code:HTTP請求的返回狀態,整數,200表示連接成功,404表示失敗
text:HTTP響應內容的字元串形式,即url對應的頁面內容
encoding:HTTP響應內容的編碼方式
content:HTTP響應內容的二進位形式
Response對象的方法:
json():如果HTTP響應內容包含JSON格式數據,則該方法解析JSON數據
raise_for_status():如果不是200,則產生異常
-------------------------------------------------------------------------------------------------------------------------
beautifulsoup4庫的使用
使用requests庫獲取HTML頁面並將其轉化成字元串後,需要進一步解析HTML頁面格式,提取有用信息,這需要處理HTML和XML的函數庫。beautifulsoup4庫,也成為Beautiful Soup庫或者bs4庫,用於解析和處理HTML和XML。需要註意的是,它不是BeautifulSoup庫。它的最大優點是能根據HTML和XML語法建立解析樹,進而高效解析其中的內容。beautifulsoup4庫採用面向對象思想實現,簡單地說,它把每個頁面當作一個對象,通過<a>.<b>()的凡是調用方法(即處理函數),BeautifulSoup中常用的一些屬性如下:
head:HTML頁面的<head>內容
title:HTML頁面標題,在<head>之中,有<title>標記
body:HTML頁面的<body>內容
p:HTML頁面中第一個<p>內容
strings:HTML頁面所有呈現在Web上的字元串,即標簽的內容
stripped_strings:HTML頁面所有呈現在Web上的非空格字元串
BeautifulSoup屬性與HTML的標簽名稱相同,遠不止這些。
標簽對象的常用屬性:
name:字元串,標簽的名字,比如div
attrs:字典,包含了原來頁面Tag所有的屬性,比如href
contents:列表,這個Tag下所有子Tag的內容
string:字元串,Tag所包圍的文本,網頁中真是的文字,string屬性的返回值遵循如下原則:
(1)如果標簽內部沒有其他標簽,string屬性返回其中的內容。
(2)如果標簽內部還有其他標簽,但只有一個標簽,string屬性返回最裡面標簽的內容。
(3)如果標簽內部有超過1層嵌套的標簽,string屬性返回None(空字元串)。
BeautifulSoup其中的兩個方法(這兩個方法會遍歷整個HTML文檔,按照條件返回標簽內容):
BeautifulSboup.find_all(name,attrs,recursive,string,limit)
作用:根據參數找到對應的標簽,返回列表類型。參數如下:
name:按照tag標簽,名字用字元串形式表示,例如div、li。
attrs:按照tag標簽屬性值檢索,需要列出屬性名稱和值,採用JSON表示。
recursive:設置查找層次,只查找當前標簽下一層時使用recursive=False。
string:按照關鍵字檢索string屬性內容,採用string=開始。
limit:返回結果的個數,預設返回全部結果。
簡單地說,BeautifulSoup的find_all()方法可以根據標簽名字、標簽屬性和內容檢索並返回標簽列表,通過片段字元串檢索時需要使用正則表達式re函數庫,re時Python標準庫,直接通過import re即可使用。採用re.comlile('jquery')實現對片段字元串(如‘jquery’)的檢索。當對標簽屬性檢索時,屬性和對應的值採用JSON格式,例如:'src':re.compile('jquery'),其中,鍵值對中值的部分可以是字元串或者正則表達式。
除了find_all()方法,BeautifulSoup類還提供一個find()方法,它們的區別隻是前者返回全部結果而後者返回找到的第一個結果,find_all()函數由於可能返回更多結果,所以採用列表形式:find()函數返回字元串形式。
BeautifulSoup.find(name,attrs,recursive,string)
作用:根據參數找到對應標簽,採用字元串返回找到的第一個值。
參數:與find_all()方法一樣。