python爬取换页_一个可识别翻页的简易Python爬虫程序
同學(xué)拿出一個(gè)需求:從某課程教學(xué)網(wǎng)站上爬取所有課程的主頁(yè)面,以及課程簡(jiǎn)介欄目?jī)?nèi)容。
于是在之前做的那個(gè)練手級(jí)的Python爬蟲程序中進(jìn)行修改,最終實(shí)現(xiàn)了該功能。與之前那個(gè)爬蟲不同,這里每一個(gè)大類的課程下面都有上千個(gè)具體課程名,分為幾百頁(yè),所以需要識(shí)別翻頁(yè)的問題。
另外,由于網(wǎng)站結(jié)構(gòu)不同,這里的程序整體實(shí)現(xiàn)思路也稍有不同,大致如下:
1、從該網(wǎng)站首頁(yè)獲取所有課程大類的鏈接放到list中
2、遍歷上述list,對(duì)于每一個(gè)鏈接,對(duì)應(yīng)的都是具體課程名的列表,24個(gè)為一頁(yè)。
2.1 獲取該頁(yè)面中包含的具體課程地址鏈接,并讀取出具體內(nèi)容,將相關(guān)信息保存到本地txt文件中;
2.2 是否有‘下一頁(yè)’鏈接。如果有,將此‘下一頁(yè)’的鏈接設(shè)置為當(dāng)前頁(yè),交給循環(huán)進(jìn)行迭代;如果沒有,說明該大類已經(jīng)讀取完畢,繼續(xù)外層循環(huán)
具體代碼:
from urllib.request import urlopen
from bs4 import BeautifulSoup
import time
#所需變量初始化及準(zhǔn)備工作
#記錄程序開始時(shí)間
start = time.clock()
#設(shè)置網(wǎng)站首頁(yè)地址
rooturl='http://www.jingpinke.com/'
#創(chuàng)建一個(gè)list用于保存課程大類的鏈接地址
indexlist=[]
##====================以下為方法========================##
'''
方法名:getContent
作用:從pagelist中的url中解析出相關(guān)內(nèi)容,并保存到本地文本中
參數(shù):含有具體課程內(nèi)容的網(wǎng)址
'''
def getContent(url):
try:
currentPage=urlopen(url).read() #讀取源碼
except Exception as err:
print('聯(lián)網(wǎng)超時(shí),退出當(dāng)前頁(yè)面。')
currentText=BeautifulSoup(currentPage) #利用bs進(jìn)行解析
#獲取課程標(biāo)題、時(shí)間、教師等信息,并將它們以空格連接起來作為文件名使用
title=currentText.find('div',{'class':'cTitle'}).find('h2').get_text()
teacher=currentText.find('div',{'class':'course_final_ohter'}).findAll('span')[0].get_text()
university=currentText.find('div',{'class':'course_final_ohter'}).findAll('span')[1].get_text()
date=currentText.find('div',{'class':'course_final_ohter'}).findAll('span')[2].get_text()
rank=currentText.find('div',{'class':'course_final_ohter'}).findAll('span')[3].get_text()
classtitle=date+' '+university+' '+rank+' '+title+' '+teacher
#獲取課程簡(jiǎn)介內(nèi)容
briefintro=currentText.find('pre').get_text()
#以標(biāo)題為文件名,創(chuàng)建txt文件,并寫入正文內(nèi)容
f=open('file/'+classtitle+'.txt','w+', encoding='utf-8')
f.write(classtitle+'\r\n'+briefintro)
print(classtitle+'.txt')
f.close()
#開始爬取
# 1、先解析根目錄,獲取13個(gè)目標(biāo)鏈接
print('解析根目錄')
rawtext=urlopen(rooturl).read()
soup = BeautifulSoup(rawtext)
targetDiv=soup.find('div',{'class':'benke_fenlei'})
catalogLinks=targetDiv.findAll('a')
for l in catalogLinks:
indexlist.append(l.get('href'))
print('根目錄解析完成')
#2、從indexlist中逐個(gè)讀取地址,獲取該課程大類下的每個(gè)課程的地址
for index in indexlist:
currentpage=index #初始時(shí),將某大類的鏈接設(shè)為當(dāng)前頁(yè)
count=1 # 計(jì)數(shù)器,計(jì)算某大類下的課程數(shù)目
while True:
print("當(dāng)前頁(yè):"+currentpage)
try:
rawtext=urlopen(currentpage).read() #讀取當(dāng)前頁(yè)
except Exception as err:
print('聯(lián)網(wǎng)超時(shí),退出當(dāng)前大類。')
break
soup= BeautifulSoup(rawtext) #解析當(dāng)前頁(yè)
eachclass=soup.find('div',{'class':'course_list'}).findAll('table') #獲取課程名列表,每一個(gè)課程名都放在一個(gè)table中
for c in eachclass: #循環(huán)獲取每一個(gè)課程的鏈接地址
print(str(count)+':http://course.jingpinke.com'+c.find('a').get('href')) #打印該地址
count=count+1 # 計(jì)數(shù)器自增
getContent('http://course.jingpinke.com'+c.find('a').get('href')) #調(diào)用getContent方法,獲取該頁(yè)內(nèi)容,并保存
if soup.find(id='nextPage')==None: # 如果當(dāng)前頁(yè)未發(fā)現(xiàn)下一頁(yè)鏈接 說明該大類已經(jīng)獲取完畢
print('沒有了。') # 打印結(jié)束
break #退出外層循環(huán),繼續(xù)下一大類
else: #否則,說明還有下一頁(yè)
nextpageurl='http://course.jingpinke.com/search'+soup.find(id='nextPage').find('a').get('href') # 獲取當(dāng)前頁(yè)中的下一頁(yè)鏈接
currentpage=nextpageurl #將當(dāng)前頁(yè)中的下一頁(yè)鏈接設(shè)為當(dāng)前頁(yè)
print('下一頁(yè):'+nextpageurl) # 打印下一步要處理的地址
#4、計(jì)算程序執(zhí)行過程耗時(shí)
end = time.clock()
print (end-start)
說明:
由于我是在sublime text2環(huán)境下寫的程序,之前將該軟件默認(rèn)的字符編碼設(shè)為gbk,這導(dǎo)致寫入的文件名中含有非中文字符(比如阿拉伯文)時(shí),出現(xiàn)gbk不能編譯的錯(cuò)誤,后來在csdn論壇上看到,如果 在操作系統(tǒng)的環(huán)境變量中加入PYTHONIOENCODING項(xiàng),項(xiàng)值為utf-8,其含義是將Python的默認(rèn)IO編碼設(shè)置為utf-8,然后將sublime text2中的pyton.sublim-build中人為添加的endoding:gbk刪掉,重啟sublime text2后,即可解決上述問題。
總結(jié)
以上是生活随笔為你收集整理的python爬取换页_一个可识别翻页的简易Python爬虫程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python import出错_Pyth
- 下一篇: springboot访问静态页面404_