被我翻出來的python爬蟲筆記

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方法的:
requests.request(method,url,**kwarges),其中包括13個訪問控制參數:
params
data
json
headers
cookies
auth
filles
timeout
proxies
allow_redirects
stream
verify
cert

一般框架:
try:    r=requests.get(url,timeout=30)
    r.raise_for_status()
    r.encoding=r.apparent_encoding
except:
    return "產生異常"

正則表達式re模塊

正則表達式

是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個”規則字符串“,這個”規則字符串“用來表達對字符串的一種過濾邏輯

在這裏插入圖片描述
在這裏插入圖片描述



IP地址正規表達式:


(([1-9]?\d|1\d{2}|2[0-4\d]|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4\d]|25[0-5])





正則表達式的類型:
1.原生字符串類型raw string類型 r'表達式'
2.string類型

match對象



屬性
說明
.string
待匹配的文本
.re
匹配時使用的pattern對象(正則表達式)
.pos
正則表達式搜索文本的開始位置
.endpos
正則表達式搜索文本的結束位置

方法
說明
.group(0)
獲得匹配後的字符串
.start()
匹配字符串在原始字符串的開始位置
.end()
匹配字符串在原始字符串的結束位置
.span()
返回(.start(),.end())



flags:正則表達式使用時得控制標記


函數
說明
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 數據。

Evernote Export

五種基本元素:

基本元素
說明
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文本順序的前續所有平行節點的標籤
條件:平行遍歷發生子啊同一個父親節點下的各節點間
ps: Navigablestring也會構成標籤樹得節點,不能認爲平行遍歷到的下一個節點就是標籤類型


實例

我將老師給的代碼整合到一起,每句基本都會有註釋,還沒有學習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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章