環境配置
這次我們用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先取球,然後雙方交替取球,直到取完。被迫拿到最後乙個球的一方為...