xpath moocネットレッスン
6281 ワード
要件:のリンク:http://www.imooc.com/course/list 登る内容:カリキュラムリンク、カリキュラムの画像url、カリキュラムの名前、学習人数、カリキュラムの説明 で取得したコンテンツの格納方法: ファイル(csv); mysqlデータベース;
は這い出した情報を分析する. 語雲
import re
import requests
import lxml.etree as etree
import csv
def get_content(url):
""" """
try:
user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36"
response = requests.get(url, headers={'User-Agent': user_agent})
response.raise_for_status() # 200, ;
response.encoding = response.apparent_encoding # , respons.text ;
except Exception as e:
print(" ")
else:
print(response.url)
print(" !")
return response.content
def parser_content(html):
""" : , url, , , """
# 1). html xpath / ;
selector = etree.HTML(html)
# 2). :
courseDetails = selector.xpath('//div[@class="course-card-container"]')
courseInfos = []
for courseDetail in courseDetails:
# : HTML+CSS
name = courseDetail.xpath('.//h3[@class="course-card-name"]/text()')[0]
#
"""
1000167
"""
studentNum = courseDetail.xpath('.//span/text()')[1]
# : HTML+CSS 8
courseInfo = courseDetail.xpath(".//p[@class='course-card-desc']/text()")[0]
# print(name, studentNum, courseInfo)
# , h /learn/9 ====> http://www.imooc.com/learn/9
# courseUrl = "http://www.imooc.com" + courseDetail.xpath('.//a/@href')[0]
# print(courseUrl)
#レッスンの url:
"""
"""
courseImgUrl = 'http:' + courseDetail.xpath('.//img/@src')[0]
courseInfos.append((name, studentNum, courseInfo, courseUrl, courseImgUrl))
return courseInfos
def save_csv(courseInfo):
「 したカリキュラム をcsv に 」
with open('doc/mooc.csv', 'w') as f:
writer = csv.writer(f)
writer.writerows(courseInfo)
print(「csvファイルの に しました......」)
def save_json(courseInfo):
「 した をjson に 」
import json
with open('doc/mooc.json', 'w', encoding='utf-8') as f:
for item in courseInfo:
item = {
'name': item[0],
'studentNum': item[1],
'courseInfo': item[2],
'courseUrl': item[3],
'courseImgUrl': item[4]
}
# ensure_ascii: がある はFalseに し、Unicodeコードを していることを し、 は けしない。
#indent=4: は4つのスペースで、 みやすいです。
jsonitem = json.dumps(item, ensure_ascii=False, indent=4)
f.write(jsonitem + '')
print(「jsonファイルの に しました......」)
def moocSpider():
# 1). コース の のページを る
url = "http://www.imooc.com/course/list"
html = get_content(url=url)
courseInfos = parser_content(html)#リストは、 のカリキュラム を します。
# 2). のページの があれば、 の を き き します。
# のページの がない は、ループを び して、カリキュラム をファイルに します。
while True:
# のページを しますか?
selector = etree.HTML(html)
nextPage = selector.xpath('//a[contains(text(),“ のページ”)/@href')
print(nextPage)
# の2ページだけを って、テストに します。
# if nextPage and ('3' not in nextPage[0]):
if nextPage:
url = "http://www.imooc.com" + nextPage[0]
html = get_content(url=url)
otherCourseInfo = parser_content(html)
courseInfos+=otherCourseInfo# のページで したページ を に します。
else:
print(「 って わり・・・」)
break
# print(courseInfos)
save_csv(courseInfos)
save_json(courseInfos)
# 1). カリキュラム は ページあり、urlルール:
#urlは2 あります。
# http://www.imooc.com/course/list?page=28
# http://www.imooc.com/course/list?page=1
# http://www.imooc.com/course/list/2
# http://www.imooc.com/course/list/28
# 2). いつ りが わりますか? のページがないとき
のページがあります。
# のページ
# :
#
def dealCourseData(filename):
""" , """
#
wordcloudString = ''
#
with open(filename) as f:
reader = csv.reader(f)
# : , , ;
pattern = re.compile(r'([\u4e00-\u9fa5]+|[a-zA-Z0-9]+)')
for item in reader:
# , , ;
name = "".join(re.findall(pattern, item[0]))
detail = "".join(re.findall(pattern, item[2]))
wordcloudString += name
wordcloudString += detail
return re.sub(r'( | | | | | )', '', wordcloudString)
import re
import jieba
from PIL import Image
from wordcloud import wordcloud
import numpy as np
def gen_wordcloud(text, filename):
# 1). ;
# 2). : , jieba, lcut
result = jieba.lcut(text)
# print(result)
#
# 3). , ;
imgObj = Image.open('./doc/wordcloud.jpg')
img_mask = np.array(imgObj)
# print(img_mask)
# 4). ,
wcObj = wordcloud.WordCloud(
mask=img_mask, #
background_color="snow", #
font_path="/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc", # , (fc-list :lang=zh)
min_font_size=5, #
max_font_size=50, #
width=1000, #
height=1000, #
)
# 5).
# , , ?
wcObj.generate(",".join(result))
wcObj.to_file(filename)
print(" %s ......." %(filename))
if __name__ == '__main__':
#
# moocSpider()
#
text = dealCourseData('doc/mooc.csv')
filename = "doc/mooc.png"
gen_wordcloud(text, filename)