Python爬取藍橋杯真題講解課程

2022-06-12 21:27:13 字數 3093 閱讀 4636

環境配置

這次我們用re、requests、urllib這三個庫來提取。

構造請求頭

我們需要安裝chrome瀏覽器,進入瀏覽器 ctrl+shift+i 呼出開發者工具。接著開啟**:

後面**會用到。

請求訪問網頁

def get_html(url):

headers =

response = requests.get(url,headers=headers)

if response.status_code == 200:

return response.text

else:

return

response = requests.get(url, headers=headers)
使用 requests 庫的 get 方法去訪問網頁,第乙個引數為**,第二個引數為請求頭,請求結果賦值給變數 response,其中裡面有很多結果、狀態響應碼、網頁原始碼、二進位制等。

response.status_code == 200
呼叫請求結果 response 中的 status_code 檢視請求狀態碼,200 代表請求成功,就返回,否則返回乙個 none,狀態碼一般有 2xx,4xx,3xx,5xx,分別代表請求成功,客戶端訪問失敗,重定向,伺服器問題。

return response.text
返回響應結果的 text,代表返回網頁 html 原始碼

獲取資料

我通過開發者工具檢查網頁原始碼,如下圖所示:

pat = ''
其中只有(.?)裡的漢字標題內容不同,(.?)內的內容會賦值給pat。

titles = re.findall(pat,str(html),re.s)

for title in titles:

title = parse.quote(title,'+')

編碼函式:quote(string, safe)
除了三個符號「_.-」不編碼,後面的引數safe是新增不編碼的字元。

批量url

chinese_num = ['一', '二', '三', '四', '五', '六']

id = ['1102','1103','1104','1105','1106','1497']

urls = ['static/coursehuifang/lnztc++a/content/第{}節{}年省賽真題詳解.html?courseid=19&dayclassid={}'

.format(num, str(i), j) for num, i, j in zip(chinese_num, range(2013, 2019),id)]

for url in urls:

url = parse.quote(url, '=/:+?&')

html = get_html(url)

get_infos(html)

time.sleep(1)

這裡主要就看每一年真題鏈結的規律,覺得麻煩的可以乙個乙個鏈結手動輸入。畢竟一共就6年真題6個鏈結。

這個zip函式,意思是把三個元素打包,可以這樣理解 zip 函式的結果是乙個列表 [(num,i,j)],每一次迴圈的 num,i,j 一次對應元組中的元素。range函式取不到最後乙個數字所以是2019,實際只會取到2018。

完整**

# 藍橋杯課程

import re

import time

import requests

from urllib import parse

def get_html(url):

headers =

response = requests.get(url,headers=headers)

if response.status_code == 200:

response.encoding = 'utf-8'

return response.text

else:

return

def get_infos(html):

pat = ''

# 要爬取內容的正規表示式,觀察url只有(.*?)裡的標題內容不同,pat=(.*?)。

titles = re.findall(pat,str(html),re.s)

for title in titles:

title = parse.quote(title,'+')

# quote(string, safe),除了三個符號「_.-」不編碼,後面的引數safe是新增不編碼的字元。

print("static/coursehuifang/lnztc++c/sources/"+title)

def main():

chinese_num = ['一', '二', '三', '四', '五', '六']

id = ['1102','1103','1104','1105','1106','1497']

urls = ['static/coursehuifang/lnztc++a/content/第{}節{}年省賽真題詳解.html?courseid=19&dayclassid={}'

.format(num, str(i), j) for num, i, j in zip(chinese_num, range(2013, 2019),id)]

for url in urls:

url = parse.quote(url, '=/:+?&')

html = get_html(url)

get_infos(html)

time.sleep(1)

# if __name__ == '_main_':

if __name__ == '__main__':

main()

藍橋杯真題 武林秘籍python講解

題目如下 小明到x山洞探險,撿到一本有破損的武功秘籍 2000多頁!當然是偽造的 他注意到 書的第10頁和第11頁在同一張紙上,但第11頁和第12頁不在同一張紙上。小明只想練習該書的第81頁到第92頁的武功,又不想帶著整本書。請問他至少要撕下多少張紙帶走?我們思考,偶數頁開始,奇數頁結束是一頁,也就...

藍橋杯真題 梅森素數python講解

如果乙個數字的所有真因子之和等於自身,則稱它為 完全數 或 完美數 例如 6 1 2 3 28 1 2 4 7 14 早在西元前300多年,歐幾里得就給出了判定完全數的定理 若 2 n 1 是素數,則 2 n 1 2 n 1 是完全數。其中 表示 乘方 運算,乘方的優先順序比四則運算高,例如 2 3...

藍橋杯真題 取球遊戲 題解

題目 今盒子裡有n個小球,a b兩人輪流從盒中取球,每個人都可以看到另乙個人取了多少個,也可以看到盒中還剩下多少個,並且兩人都很聰明,不會做出錯誤的判斷。每個人從盒子中取出的球的數目必須是 1,3,7或者8個。輪到某一方取球時不能棄權!a先取球,然後雙方交替取球,直到取完。被迫拿到最後乙個球的一方為...