蓝桥杯python试题_Python爬取蓝桥杯真题讲解课程
今年疫情期間藍(lán)橋杯課程全線(xiàn)免費(fèi),但是如果每次聽(tīng)課都要登錄賬號(hào)實(shí)在太麻煩了,所以想著用爬蟲(chóng)抓去一下視頻到本地。
環(huán)境配置
這次我們用re、requests、urllib這三個(gè)庫(kù)來(lái)提取。
構(gòu)造請(qǐng)求頭
我們需要安裝Chrome瀏覽器,進(jìn)入瀏覽器 Ctrl+Shift+I 呼出開(kāi)發(fā)者工具。接著打開(kāi)網(wǎng)址:http://weike.lanqiao.cn/
找到如圖所示的User-Agent:
請(qǐng)求頭代碼如下:
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
后面代碼會(huì)用到。
請(qǐng)求訪(fǎng)問(wèn)網(wǎng)頁(yè)
def get_html(url):
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.text
else:
return
response = requests.get(url, headers=headers)
使用 requests 庫(kù)的 get 方法去訪(fǎng)問(wèn)網(wǎng)頁(yè),第一個(gè)參數(shù)為網(wǎng)址,第二個(gè)參數(shù)為請(qǐng)求頭,請(qǐng)求結(jié)果賦值給變量 response,其中里面有很多結(jié)果、狀態(tài)響應(yīng)碼、網(wǎng)頁(yè)源碼、二進(jìn)制等。
response.status_code == 200
調(diào)用請(qǐng)求結(jié)果 response 中的 status_code 查看請(qǐng)求狀態(tài)碼,200 代表請(qǐng)求成功,就返回,否則返回一個(gè) None,狀態(tài)碼一般有 2xx,4xx,3xx,5xx,分別代表請(qǐng)求成功,客戶(hù)端訪(fǎng)問(wèn)失敗,重定向,服務(wù)器問(wèn)題。
return response.text
返回響應(yīng)結(jié)果的 text,代表返回網(wǎng)頁(yè) html 源碼
獲取數(shù)據(jù)
我通過(guò)開(kāi)發(fā)者工具檢查網(wǎng)頁(yè)源碼,如下圖所示:
紅線(xiàn)部分的就是視頻的鏈接,通過(guò)觀(guān)察鏈接與鏈接只有最后的漢字部分不同,我們書(shū)寫(xiě)正則表達(dá)式:
pat = ''
其中只有(.?)里的漢字標(biāo)題內(nèi)容不同,(.?)內(nèi)的內(nèi)容會(huì)賦值給pat。
titles = re.findall(pat,str(html),re.S)
for title in titles:
title = parse.quote(title,'+')
titles里存放的是這個(gè)網(wǎng)頁(yè)所有的漢字標(biāo)題,由于我們最終要得到的是可以下載的直接鏈接,我們對(duì)漢字進(jìn)行編碼。
編碼函數(shù):quote(string, safe)
除了三個(gè)符號(hào)“_.-”不編碼,后面的參數(shù)safe是添加不編碼的字符。
批量URL
Chinese_num = ['一', '二', '三', '四', '五', '六']
id = ['1102','1103','1104','1105','1106','1497']
urls = ['http://weike.lanqiao.cn/static/coursehuifang/LNZTC++A/content/第{}節(jié){}年省賽真題詳解.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)
這里主要就看每一年真題鏈接的規(guī)律,覺(jué)得麻煩的可以一個(gè)一個(gè)鏈接手動(dòng)輸入。畢竟一共就6年真題6個(gè)鏈接。
這個(gè)zip函數(shù),意思是把三個(gè)元素打包,可以這樣理解 zip 函數(shù)的結(jié)果是一個(gè)列表 [(num,i,j)],每一次循環(huán)的 num,i,j 一次對(duì)應(yīng)元組中的元素。range函數(shù)取不到最后一個(gè)數(shù)字所以是2019,實(shí)際只會(huì)取到2018。
完整代碼
# 藍(lán)橋杯課程
import re
import time
import requests
from urllib import parse
def get_html(url):
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
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 = ''
# 要爬取內(nèi)容的正則表達(dá)式,觀(guān)察url只有(.*?)里的標(biāo)題內(nèi)容不同,pat=(.*?)。
titles = re.findall(pat,str(html),re.S)
for title in titles:
title = parse.quote(title,'+')
# quote(string, safe),除了三個(gè)符號(hào)“_.-”不編碼,后面的參數(shù)safe是添加不編碼的字符。
print("http://weike.lanqiao.cn/static/coursehuifang/LNZTC++C/sources/"+title)
def main():
Chinese_num = ['一', '二', '三', '四', '五', '六']
id = ['1102','1103','1104','1105','1106','1497']
urls = ['http://weike.lanqiao.cn/static/coursehuifang/LNZTC++A/content/第{}節(jié){}年省賽真題詳解.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()
這里建議使用IDM批量下載速度很快。
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯python试题_Python爬取蓝桥杯真题讲解课程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端学习(1890)vue之电商管理系统
- 下一篇: 前端学习(1742):前端调试值之快速调