Python簡單爬蟲


簡單抓取網頁的代碼

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM