request模塊
HTTP協議方法 | requests庫方法 | 說明 |
GET | requests.get(url,params=None,**kwarges) | 請求獲取url位置的資源 |
HEAD | requests.head(url,**kwargs) | 請求獲取url位置資源的響應消息報告,即獲得該資源的頭部信息 |
POST | requests.post(url,data=None,json=None,**kwarges) | 請求像URL位置的資源後附加新的數據 |
PUT | requests.put(url,data=None,**kwarges) | 請求向url位置存儲一個資源,覆蓋原URL位置的資源 |
PATCH | requests.patch(url,data=Noen,**kwarges) | 請求局部更新URL位置的資源,即改變該處資源的部分內容 |
DELETE | requests.delete(url,**kwarges) | 請求刪除URL位置存儲的資源 |
requests.request(method,url,**kwarges),其中包括13個訪問控制參數:
try: r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
except:
return "產生異常"
正則表達式re模塊
正則表達式
是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個”規則字符串“,這個”規則字符串“用來表達對字符串的一種過濾邏輯
match對象
屬性 | 說明 |
.string | 待匹配的文本 |
.re | 匹配時使用的pattern對象(正則表達式) |
.pos | 正則表達式搜索文本的開始位置 |
.endpos | 正則表達式搜索文本的結束位置 |
方法 | 說明 |
.group(0) | 獲得匹配後的字符串 |
.start() | 匹配字符串在原始字符串的開始位置 |
.end() | 匹配字符串在原始字符串的結束位置 |
.span() | 返回(.start(),.end()) |
函數 | 說明 |
re.search(pattern,string,flags=0) | 在一個字符串中搜索匹配正則表達式的第一個位置,返回match對象 |
re.match(pattern,string,flags=0) | 在一個字符串的開始位置起匹配正則表達式,返回match對象 |
re.findall(pattern,string,flags=0) | 搜索字符串,以列表類型返回全部能匹配的子串 |
re.split(pattern,string,maxsploit=0,flags=0) | 將一個字符串按照正則表達式匹配結果進行分割,返回列表類型 |
re.finditer(pattern,string,flags=0) | 搜索字符串,返回一個匹配結果的迭代類型,每個迭代元素是match對象 |
re,sub(pattern,repl,string,count=0,flags=0) | 在一個字符串替換所有匹配正則表達式的子串,返回替代後的字符串 |
regx=re.compile(pattern,flags=0) | 將正則表達式的字符串形式編譯成正則表達式對象(個人理解就是相當於定義一個變量) |
練習代碼
import re
'''
match = re.search(r'[1-9]\d{5}', 'BIT 100081')
if match:
print(match.group(0))#search函數得使用。返回match類型
match = re.match(r'[1-9]\d{5}', 'BIT 100081')
#這裏match函數是從頭開始匹配,所以輸出爲空,需要將字符串改爲數字開頭
ls = re.findall(r'[1-9]\d{5}','BIT100081 TSU100084')
print(ls)#返回列表類型
ls = re.split(r'[1-9]\d{5}', 'BIT100081 TSU100084')
print(ls)#split函數使用,輸出去掉正則表達式得部分
print(re.split(r'[1-9]\d{5}', 'BIT100081 TSU100084', maxsplit=1))
#只匹配第一部分
'''
for m in re.finditer(r'[1-9]\d{5}', 'BIT100081 TSU100084'):
if m:
print(m.group(0))
#findiiter返回的是迭代類型,每個迭代類型又是一個match對象
ls = re.sub(r'[1-9]\d{5}', ':zipcode','BIT100081 TSU100084')
print(ls)#sub函數簡單來說,就是替換匹配到的字符
淘寶爬蟲實例
import requests
import re
#獲取頁面
def getHTMLText(url):
try:
header = {這裏要寫入你的頭部信息}
r = requests.get(url, headers=header)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def parsePage(ilt,html):
try:
plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)#最小匹配
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
ilt.append([price, title])
except:
print("")
def printGoodslist(ilt):
tplt = "{:4}\t{:8}\t{:16}"
print(tplt.format("序號","價格","商品名稱"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count, g[0],g[1]))
def main():
goods = "書包"
depth = 2
start_url = 'http://s.taobao.com/search?q=' + goods
infolist = []
for i in range(depth):
try:
url = start_url + '&s=' + str(44*i)
html = getHTMLText(url)
parsePage(infolist,html)
except:
continue
printGoodslist(infolist)
main()
beautiful soup模塊
功能
簡而言之,解析和提取 HTML/XML 數據。
基本元素 | 說明 |
Tag | 標籤是最基本的信息組織的單元,分別用<></>標明開頭和結尾 |
Name | 標籤的名字,<p></p>的名字是p,格式:<tag>.name |
attributes | 標籤的屬性,字典形式組織(鍵和值),格式:<tag>.attrs |
Navigablestring | 標籤內非屬性字符串,格式:<tag>.string |
comment | 標籤內字符串的註釋部分 |
屬性 | 說明 |
.contens | 子節點的列表,將<tag>所有兒子節點存入列表 |
.children | 子節點的迭代類型,與.contens類似,用於循環遍歷兒子節點 |
.descendants | 子孫節點的迭代類型,包含所有子孫節點,用於循環遍歷 |
屬性 | 說明 |
.parents | 節點的父親標籤 |
.parents | 節點先輩標籤的迭代類型用於循環遍歷先輩節點 |
屬性 | 說明 |
.next_sibling | 返回按照HTML文本順序的下一個平行節點的標籤 |
.previous_sibling | 返回按照HTML的文本順序的上一個平行節點標籤 |
.next_siblings | 迭代類型,返回按照HTML文本順序的後續所有平行節點的標籤 |
.previous_siblings | 迭代類型,返回按照HTML文本順序的前續所有平行節點的標籤 |
實例
我將老師給的代碼整合到一起,每句基本都會有註釋,還沒有學習python的小夥伴又不想看視頻的話,把這些代碼碼一碼也就差不多啦! 要注意的是,這裏基本都是輸出語句,一定要慢慢體會,print一個語句運行以下,比較輸出結果分析輸出內容一步步來,學完一個知識塊以後記得註釋掉,再接着學下一個知識塊,我這樣學自我感覺棒棒噠~~~~下面這個就不要註釋掉了喔
基本元素練習代碼塊
下行遍歷練習代碼塊
上行遍歷練習代碼塊
平行遍歷練習代碼塊
這裏還是把源代碼放一下,不要copy不要只顧着看,碼一碼
import requests
from bs4 import BeautifulSoup
url="http://python123.io/ws/demo.html"
r = requests.get(url)
demo = r.text
soup = BeautifulSoup(demo , 'html.parser') #html解釋器
print(demo)
print(soup.prettify)#對比輸出的不同,html解析的功能
#以下是五種基本元素的使用
tag = soup.a
print(tag)#輸出a標籤
print(tag.name) #輸出標籤的名字
print(tag.parent.name) #輸出a的父類標籤的名字
print(tag.attrs)#輸出標籤屬性(輸出方式爲字典)
print(tag.attrs['class'])#輸出['py1'],也就是屬性class的值
print(tag.attrs['href'])#輸出herf屬性的值
print(type(tag.attrs)) #輸出標籤屬性類型,這裏是字典類型
print(type(tag))#輸出標籤的類型
print(tag.string)#輸出a標籤中的非屬性字符串信息
print(soup.p.string)#輸出p標籤中的string
print(type(soup.p.string))#輸出標籤中的string的類型,是Navigablestring,有跨標籤的性質所以p標籤中的b標籤並沒有顯示出來
newsoup = BeautifulSoup("<b><!--this is a comment--></b><p>this is not a moment</p>","html.parser")
#註釋以<!--註釋內容-->
print(newsoup)#並分析b標籤和p標籤的類型觀察有什麼不同
#標籤數的下行遍歷
tag = soup.body
print(tag)
print(tag.contents)#輸出body標籤的兒子節點,.contents返回的類型是列表
print(len(tag.contents))#返回兒子節點的數量,因爲返回類型是列表類型所以可以用列表來檢索標籤內容
print(tag.contents[1])#輸出列表第一個子節點
for child in tag.children:
print(child)#遍歷所有兒子節點
for child in tag.descendants:
print(child)#遍歷所有子孫節點
#標籤樹的上行遍歷
tag = soup.title
print(tag.parent)#輸出title標籤的父親
for parent in soup.a.parents:
if parent is None:
print(parent)
else:
print(print.name)#這裏是遍歷出a標籤的所有父標籤
#標籤樹的平行遍歷
tag = soup.a
print(tag.next_sibling)#發現輸出不是標籤
print(tag.next_sibling.next_sibling)#a標籤的下下個平行節點
print(tag.previous_sibling)#輸出a標籤的上一個平行節點
for sibling in tag.next_siblings:
print(sibling)#遍歷後續節點
for sibling in tag.previous_siblings:
print(sibling)#遍歷前續節點
中國大學排名
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()#值不爲200時產生異常信息
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def fillUnivList(ulist, html):#提取關鍵數據到列表中
soup = BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):#檢測tr標籤類型是否爲Tag類型(因爲這裏有可能時string類型)
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])
def printUnivList(ulist, num):#輸出排名結果
tplt = "{0:^12}\t{1:{3}^12}\t{2:^10}"
print(tplt.format("排名", "學校名稱", "總分", chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288)))
def main():
uinfo = []
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20)#20所學校相關信息
main()