慕課課程列表爬取實現

2021-10-02 10:00:11 字數 4233 閱讀 9630

#

import requests

from bs4 import beautifulsoup

import re

defgetthmltext

(url)

:try

: r = requests.get(url, timeout =60)

r.raise_for_status(

) return r.text

except

:return

"爬取鏈結失敗!"

defparserhtml

(html, clist)

: course_start_url =

''soup = beautifulsoup(html,

'html.parser'

) a = soup.find_all(

'a')

for a1 in a:

href = a1.attrs[

'href'

] div = a1.find_all(

'div'

)for div1 in div:

try:

h3 = div1.find_all(

'h3'

)for h in h3:

course_name = h.string

course_url = course_start_url + href

span = div1.find_all(

'span'

) person_num_part = re.

compile

(r'.*?(.*?)'

,re.s)

course_drank = span[0]

.string

course_number = re.findall(person_num_part,

str(span[1]

))[0

] course_introduction = div1.find_all(

'p')[0

].string

course_price = span[2]

.string

course_item =

[course_name, course_url, course_price, course_drank, course_number, course_introduction]

if course_name.strip()!=

'':except

:continue

defcourseprint

(clist)

: tplt =

"^10}\t^10}\t^10}\t^10}\t^10}\t^10}"

print

(tplt.

format

("課程名稱"

,"課程鏈結"

,"課程**"

,"課程級別"

,"參加人數"

,"課程介紹"

,chr

(12288))

)for courselist in clist:

print

(tplt.

format

(courselist[0]

, courselist[1]

, courselist[2]

, courselist[3]

, courselist[4]

, courselist[5]

,chr

(12288))

)def

writexls

(clist)

: output =

open

('慕課課程.xls'

,'w'

, encoding=

'gbk'

) output.write(

'課程名稱\t課程鏈結\t課程**\t課程級別\t參加人數\t課程介紹\n'

)for i in

range

(len

(clist)):

for j in

range

(len

(clist[i]))

: output.write(

str(clist[i]

[j])

)# write函式不能寫int型別的引數,所以使用str()轉化

output.write(

'\t'

)# 相當於tab一下,換乙個單元格

output.write(

'\n'

)# 寫完一行立馬換行

output.close(

)def

writetxt

(clist)

: output =

open

('慕課課程.txt'

,'w'

, encoding=

'gbk'

) tplt =

"^10}\t^10}\t^10}\t^10}\t^10}\t^10}"

output.write(tplt.

format

("課程名稱"

,"課程鏈結"

,"課程**"

,"課程級別"

,"參加人數"

,"課程介紹"

,chr

(12288))

)for courselist in clist:

output.write(tplt.

format

(courselist[0]

, courselist[1]

, courselist[2]

, courselist[3]

, courselist[4]

, courselist[5]

,chr

(12288))

) output.write(

'\n'

)# 寫完一行立馬換行

output.close(

)def

main()

: start_url =

'?page='

courselist =

for i in

range(30

):c_url = start_url +

str(i)

html = getthmltext(start_url)

parserhtml(html,courselist)

# courseprint(courselist)

writexls(courselist)

# writetxt(courselist)

main(

)

getthmltext(url),獲取url鏈結中的內容為html結構。

parserhtml(html, clist), 負責解析html頁面中的內容,用於提取課程名稱,課程鏈結,課程**, 課程級別,參加人數, 課程介紹。

在檢視網頁元**之後可以發現課程鏈結位於a標籤的href屬性中,而課程名稱是a標籤下的div標籤中的h3標籤中的文字。而課程級別, 參加人數,課程**位於div標籤下的span標籤中,使用div.find_all(『span』),可以發現結果中存在四個結果,第乙個結果的string是課程級別, 第二個結果的string是參加人數,第三個結果的string是課程**。其中在提取參加人數的時候如果直接使用string會出現問題,所以使用re正規表示式進行匹配。

r'.*?(.*?)'

用於匹配<

/i>

<

/span>之間的字元。

課程介紹位於p標籤下。在完整提取了所有的內容之後,將所有內容放入乙個列表,然後在將列表加入clist中。

courseprint(clist),用於列印爬取的所有內容,雖然在程式中使用了格式化對齊,但是,由於內容的數量,依舊不能很好的輸出爬取的資料。所以還編寫了writexls(clist), 用於將爬取的資料儲存到excel**中,此外還編寫了writetxt(clist)方法用於將爬取的資料寫入txt檔案中。在main方法中實現了迴圈爬取30頁內容資料。

結果如圖所示:

爬取新聞列表

獲取單條新聞的 標題 鏈結 時間 內容 點選次數,幷包裝成乙個函式。獲取乙個新聞列表頁的所有新聞的上述詳情,幷包裝成乙個函式。獲取所有新聞列表頁的 呼叫上述函式。完成所有校園新聞的爬取工作。完成自己所選其他主題相應資料的爬取工作。import requests import refrom bs4 i...

爬取新聞列表

獲取單條新聞的 標題 鏈結 時間 內容 點選次數,幷包裝成乙個函式。獲取乙個新聞列表頁的所有新聞的上述詳情,幷包裝成乙個函式。獲取所有新聞列表頁的 呼叫上述函式。完成所有新聞的爬取。import requests from bs4 import beautifulsoup res requests....

爬取新聞列表

import requests import re from bs4 import beautifulsoup url res requests.get url res.encoding utf 8 soup beautifulsoup res.text,html.parser n int soup...