python3獲取一個網頁特定內容


我們今天要爬取的網址為:https://www.zhiliti.com.cn/html/luoji/list7_1.html

一、目標:獲取下圖紅色部分內容

 


即獲取所有的題目以及答案。

二、實現步驟。

分析:
1,首先查看該網站的結構。

 

 

 

 

分析網頁后可以得到:

我們需要的內容是在該網頁<li>標簽下,詳細內容鏈接在<small>的<a>的href中。

但是這樣我們最多只能獲取這一頁的內容

 

 

別着急

我們點擊第二頁看一下目標網址有什么變化

 

 

我們發現目標網址最后的數字變成了2

再看一下最后一頁

 

 

我們可以分析出最后那個數字即第幾頁,所以我們待會可以直接用一個for循環拼接字符串即可。

分析詳細頁面:

我們隨便點擊進入一個閱讀全文

 

 

同樣分析網頁結構。

 

 

發現我們要的內容在一個塊<div class="info-zi mb15"/>的<p>標簽中,我們在看一下其他題是不是也是這樣的

 

 

很明顯是這樣的,所以我們只需要獲取class為info-zi mb15下的<p>標簽下的內容即可。

所以我們接下來開始實現。

Let's Go

 

實現:

1,獲取所有頁

def getall():
    for i in range(1,31,1):
        getalldoc(i)    

 


i表示第i頁,一共30頁所以i從1變化到30,每次增加1。

2,獲取當前頁詳細頁面的連接

#獲取目標網址第幾頁
def getalldoc(ii):
#字符串拼接成目標網址
testurl = "https://www.zhiliti.com.cn/html/luoji/list7_"+str(ii)+".html"
#使用request去get目標網址
res = requests.get(testurl,headers=headers)
#更改網頁編碼--------不改會亂碼
res.encoding="GB2312"
#創建一個BeautifulSoup對象
soup = BeautifulSoup(res.text,"html.parser")
#找出目標網址中所有的small標簽
#函數返回的是一個list
ans = soup.find_all("small")
#用於標識問題
cnt = 1
#先創建目錄
mkdir("E:\\Python爬取的文件\\問題\\第" + str(ii) + "頁\\")
for tag in ans:
    #獲取a標簽下的href網址
    string_ans=str(tag.a.get("href"))
    #請求詳細頁面
    #返回我們需要的字符串數據
    string_write = geturl(string_ans)
    #寫文件到磁盤
    writedoc(string_write,cnt,ii)
    cnt = cnt+1
print("",ii,"頁寫入完成")

 


先拼接處目標網頁url,然后調用request去請求,更改網頁編碼,使用BeautifulSoup對html文檔進行解析,找出所有<small>標簽,存入一個list,然后遍歷該list,獲取每一個<small>標簽里的<a>標簽的href屬性,並將其轉換為字符串string_ans。

得到詳細頁面的url之后我們調用geturl(自定義函數下面講解)返回我們所需要的題目字符串,最后調用writedoc寫入文件。

3,得到詳細頁面的url后篩選目標字符串

#根據詳細頁面url獲取目標字符串
def geturl(url):
    #請求詳細頁面
    r = requests.get(url, headers=headers)
    #改編碼
    r.encoding = "GB2312"
    soup = BeautifulSoup(r.text, "html.parser")
    #找出類名為 info-zi mb15 下的所有p標簽
    ans = soup.find_all(["p", ".info-zi mb15"])
    #用來儲存最后需要寫入文件的字符串
    mlist = ""
    for tag in ans:
        #獲取p標簽下的string內容,並進行目標字符串拼接
        mlist=mlist+str(tag.string)
    #返回目標字符串
    return mlist

首先請求網頁構建一個BeautifulSoup對象,篩選出class=info-zi mb15的對象下的<p>標簽內容,返回類型為list,遍歷list,將每個item的string拼接到目標字符串並返回。

4,將目標字符串寫進文件

#寫文件
def writedoc(ss, i,ii):
    #打開文件
    #編碼為utf-8
    with open("E:\\Python爬取的文件\\問題\\第" + str(ii) + "頁\\"+"問題" + str(i) + ".txt", 'w', encoding='utf-8') as f:
        #寫文件
        f.write(ss)
    print("問題" + str(i) + "文件寫入完成" + "\n")

5,創建指定目錄

def mkdir(path):
    # 去除首位空格
    path = path.strip()
    # 去除尾部 \ 符號
    path = path.rstrip("\\")
    # 判斷路徑是否存在
    # 存在     True
    # 不存在   False
    isExists = os.path.exists(path)
    # 判斷結果
    if not isExists:
        # 如果不存在則創建目錄
     # 創建目錄操作函數
        os.makedirs(path)
        return True
    else:
        # 如果目錄存在則不創建,並提示目錄已存在
        return False

三,最終python文件

import requests
from bs4 import BeautifulSoup
import os
 
# 服務器反爬蟲機制會判斷客戶端請求頭中的User-Agent是否來源於真實瀏覽器,所以,我們使用Requests經常會指定UA偽裝成瀏覽器發起請求
headers = {'user-agent': 'Mozilla/5.0'}
 
#寫文件
def writedoc(ss, i,ii):
    #打開文件
    #編碼為utf-8
    with open("E:\\Python爬取的文件\\問題\\第" + str(ii) + "頁\\"+"問題" + str(i) + ".txt", 'w', encoding='utf-8') as f:
        #寫文件
        f.write(ss)
    print("問題" + str(i) + "文件寫入完成" + "\n")
 
#根據詳細頁面url獲取目標字符串
def geturl(url):
    #請求詳細頁面
    r = requests.get(url, headers=headers)
    #改編碼
    r.encoding = "GB2312"
    soup = BeautifulSoup(r.text, "html.parser")
    #找出類名為 info-zi mb15 下的所有p標簽
    ans = soup.find_all(["p", ".info-zi mb15"])
    #用來儲存最后需要寫入文件的字符串
    mlist = ""
    for tag in ans:
        #獲取p標簽下的string內容,並進行目標字符串拼接
        mlist=mlist+str(tag.string)
    #返回目標字符串
    return mlist
 
#獲取目標網址第幾頁
def getalldoc(ii):
    #字符串拼接成目標網址
    testurl = "https://www.zhiliti.com.cn/html/luoji/list7_"+str(ii)+".html"
    #使用request去get目標網址
    res = requests.get(testurl,headers=headers)
    #更改網頁編碼--------不改會亂碼
    res.encoding="GB2312"
    #創建一個BeautifulSoup對象
    soup = BeautifulSoup(res.text,"html.parser")
    #找出目標網址中所有的small標簽
    #函數返回的是一個list
    ans = soup.find_all("small")
    #用於標識問題
    cnt = 1
    #先創建目錄
    mkdir("E:\\Python爬取的文件\\問題\\第" + str(ii) + "頁\\")
    for tag in ans:
        #獲取a標簽下的href網址
        string_ans=str(tag.a.get("href"))
        #請求詳細頁面
        #返回我們需要的字符串數據
        string_write = geturl(string_ans)
        #寫文件到磁盤
        writedoc(string_write,cnt,ii)
        cnt = cnt+1
    print("",ii,"頁寫入完成")
 
 
def mkdir(path):
    # 去除首位空格
    path = path.strip()
    # 去除尾部 \ 符號
    path = path.rstrip("\\")
    # 判斷路徑是否存在
    # 存在     True
    # 不存在   False
    isExists = os.path.exists(path)
    # 判斷結果
    if not isExists:
        # 如果不存在則創建目錄
     # 創建目錄操作函數
        os.makedirs(path)
        return True
    else:
        # 如果目錄存在則不創建,並提示目錄已存在
        return False
 
def getall():
    for i in range(1,31,1):
        getalldoc(i)
 
 
if __name__ == "__main__":
    getall()

 

四,運行結果

 

 

 


五,總結
一般網頁的編碼為utf-8編碼,但是這個網頁就不一樣編碼為GB2312,我第一次請求返回的是亂碼,如果python向一個不存在的目錄進行寫文件會報錯,所以寫文件之前要先判斷路徑是否正確存在,不存在就要創建路徑,請求頭請使用下面這個

# 服務器反爬蟲機制會判斷客戶端請求頭中的User-Agent是否來源於真實瀏覽器,所以,我們使用Requests經常會指定UA偽裝成瀏覽器發起請求
headers = {'user-agent': 'Mozilla/5.0'}

 




免責聲明!

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



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