Vui : Vọc Python với Requests and Beautiful Soup package
Python
39
White

nguyenkhuyen viết ngày 25/06/2016

Nói tới Python thì mình cũng mới chân ướt chân ráo vào với nó, nhưng Python làm mình cảm thấy thích khi làm việc với ngôn ngữ này, đặc biệt là gói requests và beautiful soup.

Tại sao mình lại thích thú với mấy package này? nguyên căn là trên công ty mình cần một tool nho nhỏ cho các tester có thể call API lên server và lấy các data trả về thay vì dùng POSTMAN extension app của Chrome (cái này chắc mọi người cũng biết nó là gì rùi hen), vì các API có 1 parameter cực độc là Signature được generate ra từ những param được truyền vào theo một thuật toán độc quyền của các bác trên cty, do đó xài POSTMAN thì các bạn tester phải cực nhọc đi generate cái signature rồi truyền vào. Vậy là mình dấn thân vào Python và request package - script python đơn giản, dễ đọc, dễ hiểu, còn requests package thì support gần như đủ cả rồi, cứ thế mà xài.
Còn beaturiful soup, nguyên nhân cũng chỉ vì đống HTML bùi nhùi và cần phải parse ra lấy dữ liệu mà thôi

Và mình đã sử dụng ra sao ? thui tạm gác cái source trên cty lại nha, public ra bị chém chít. Mình về với 1 cái tool nho nhỏ để chôm truyện tranh về máy đọc (mình thích đọc offline hơn là online).

Nguồn mình lấy truyện là manga24h, và ở Manga24h thì 1 truyện sẽ có cấu trúc site :

  • Page truyện - list tất cả các chapter link
    • Chapter 1
      • Image 1
      • Image 2
      • ...
    • Chapter 2
      • Image 1
      • Image 2
      • ...

Như vậy mình muốn lấy truyện nào đó từ 1 link truyện như : http://manga24h.com/4160/Love-Riron.html thì mình cần phải lấy danh sách các chapter, sau đó vào từng chapter, lấy danh sách các file hình, và rồi download các file đó về.

OK, requirement sơ sơ là như vậy, giờ chuyển qua vọc code với các vấn đề

  1. Mình cần open 1 request method GET tới cái page truyện : http://manga24h.com/4160/Love-Riron.html hoặc chapter page
  2. Mình cần parse HTML từ dữ liệu ở 1 và lấy cụ thể link chapter hay link image
  3. Mình cần download file và store về ổ cứng
  4. Thưởng thức thành quả :D

Giải quyết đống vấn đề với coding thoai:

  1. requests package cung cấp 1 method đơn giản là get và bạn chỉ cần truyền vào param là cái URL :

    response = requests.get(url)
    

    và còn nhiều nhiều nữa các method khác, các bạn có thể tham khảo thêm ở :
    http://docs.python-requests.org/en/master/

  2. Beautiful soup sẽ giúp bạn điều này, sau khi bạn làm với step 1 thì bạn sẽ có 1 object và attributes text chính là đống HTML bạn nhận được từ web server, việc cần làm là cho nó "beautiful" lên với

    parsed_html = BeautifulSoup(response.text)
    

    Sau đó thì các bạn có thể tự do di chuyển trong trong cái đống HTML đã được parse bằng cách select các node và hoặc lấy các attribute value của node
    document thì cực kì dễ hiểu :
    https://www.crummy.com/software/BeautifulSoup/bs4/doc/

  3. Download file thì cực kì đơn giản nữa, gói request hỗ trợ luôn

    response  = requests.get(fileURL, stream=True)
    

    cũng là method get thôi, nhưng cái quan trọng ở đây chính là stream=True
    và rồi mình ghi dữ liệu đó xuống file:

    #newfilepath = local path to save file
    filedata = file(newfilepath,"wb") 
    for block in response.iter_content(1024):
        if not block:
            break
        filedata.write(block)
    
  4. Thưởng thức thành quả, hmmm đợi chút, có vẻ chưa xong khi các bạn chưa combine chúng nó lại để ra 1 thứ như requirement :D

Giải quyết requirement:

  1. mình cần phải lấy danh sách các chapter

    def parsing_main_page(mainpageURL):
    chapterlist = []
    
    response = requests.get(mainpageURL)
    
    parsed_html = BeautifulSoup(response.text)
    #print parsed_html
    option_select = parsed_html.find("select", class_ = "form-control")
    
    if option_select is not None:
        parsed_chapters = option_select.find_all("option",limit=2000)                
        for chapter in parsed_chapters:                 
            for attr,val in chapter.attrs.iteritems():                               
                if attr == 'value':
                    chapterlist.append(val)
    else:
        print "Cannot find manga list"    
    return chapterlist
    
  2. vào từng chapter, lấy danh sách các file hình - Cái này thì HTML của manga24h ko include trong HTML node mà chứa trong 1 đoạn javascript, phải parse đoạn javascript đó ra và lấy các file hình:

    def parsing_chapter_page(chapterURL):
    imageList = []    
    response = requests.get(chapterURL)    
    parsed_html = BeautifulSoup(response.text)    
    data_script = parsed_html.find("div",{"id":"wrapAll"}).find_all("script")
    for script in data_script:
        if script.getText().find('images = new Array();') != -1:
            text_data = script.getText()            
            data_value = re.search("\w*data=('.*').*",text_data)            
            imageList = data_value.group(1).strip("'").split("|")   
    return imageList
    
  3. download các file đó về: imageList là các bạn có list URL các file hình rồi, giờ download và save thì quá đơn giản với hướng dẫn get file và save file ở trên

Ta dah, vậy là xong, tha hồ đọc truyện offline lại còn được vọc vạch với Python và 2 gói package hữu ích cho việc make HTTP request và parsing HTML.

Chúc các bạn vui.

nguyenkhuyen 26-06-2016

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

nguyenkhuyen

1 bài viết.
2 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
1 0
Mở đầu Như đã nói ở bài trước, mình đang nghiên cứu về Spark nên cần log lại một số thứ để dành sau này dùng đến :smile: Đối tượng hướng đến vẫn ...
Phạm Quốc Thắng viết gần 2 năm trước
1 0
White
4 3
Observer pattern (python example) 1. Observer là gì : Theo như (Link) Observer Pattern là : A software design pattern in which an object, calle...
Khôi Trọng Nguyễn viết hơn 1 năm trước
4 3
White
0 0
Web Framework Flask định nghĩa route bằng annotations kiểu như @route('/users/add', methods='GET']) def user_add(): pass Lợi thế của cách là...
studybot viết hơn 2 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
1 bài viết.
2 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!