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)