Python簡單爬蟲

簡單抓取網頁的代碼html

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抓取的時候則會報錯。python

下面是爬蟲爬取大學排名的代碼:jquery

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)
            

在代碼中都有詳細的註釋即理解,但願對你有所幫助。正則表達式

下面是搜索關鍵字自動提交的爬蟲代碼:json

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庫中的網頁請求函數:app

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()方法同樣。

相關文章
相關標籤/搜索