#
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...