Python簡單爬蟲

来源:https://www.cnblogs.com/biaobiao88/archive/2019/12/29/12116245.html
-Advertisement-
Play Games

簡單抓取網頁的代碼 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()方法一樣。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對事件作出反應 JavaScript 能夠在事件發生時執行,比如當用戶點擊某個 HTML 元素時。 為了在用戶點擊元素時執行代碼,請向 HTML 事件屬性添加 JavaScript 代碼: HTML 事件的例子: 當用戶點擊滑鼠時 當網頁載入後 當圖像載入後 當滑鼠移至元素上時 當輸入欄位被改變時 ...
  • 通過Java日期時間API系列7 Jdk8中java.time包中的新的日期時間API類的優點,java8具有很多優點,現在網上查到的農曆轉換工具類都是基於jdk7及以前的類寫的,下麵使用java新的日期時間API重寫農曆LunarDate。 package com.xkzhangsan.time; ...
  • 1.到官網下載scala源代碼 點擊如下鏈接下載源碼:http://www.scala-lang.org/download/all.html 選擇需要的版本點擊進行下載,我選擇的是2.11.8版本,如下圖: 2.在idea中設置指向源代碼 在intellij中選擇 File –> Project S ...
  • SpringCloud+Eureka+Feign+Ribbon的簡化搭建流程,加入熔斷,網關和Redis緩存 ...
  • 最近使用 Mybatis 遇到了一個奇怪的問題,前端傳了一個數字字元串(type = "1") ,我做瞭如下判斷: 就這樣系統無情的告訴我這樣無法被解析,原因是字元串和數字無法判斷相等!Are you kidding me?我這明明寫的是字元串呀! 後來,跟蹤了下源碼,發現 '1' 確實被直接當成數 ...
  • 一、Tkinter​ 1.組件的大致使用步驟 (1)創建總面板 (2)創建面板上的各種組件; i.指定組件的父組件,即依附關係;ii.利用相應的屬性對組件進行設置;iii.給組件安排佈局。 (3)同步驟2相似,創建好多個組件; (4)最後,啟動總面板的消息迴圈 import tkinter ​ ba ...
  • 代碼塊(初始化塊)的作用:對java對象進行初始化。 程式的執行順序 1、聲明成員變數的預設值; 2、顯式初始化、多個初始化塊依次被執行(同級別下按先後順序執行); 3、構造方法再對成員進行賦值操作; 一個類中的初始化塊若有修飾符,則只能被static修飾,稱為靜態代碼塊(static block) ...
  • 位運算是指按二進位進行的運算。在系統軟體中,常常需要處理二進位位的問題。C語言提供了6個位操作運算符。這些運算符只能用於整型操作數,即只能用於帶符號或無符號的char,short,int與long類型。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...