Thảo luận kỹ thuật về cào dữ liệu (crawling bot)

Discussion in 'Hỏi Đáp Kỹ Thuật' started by command, Jan 19, 2019.

  1. command

    command Bang Chúng

    Chào ae,

    Đa số ae ở đây toàn cào dữ liệu nên mình muốn chia sẻ một vài kỹ thuật đã làm cũng như một số thách thức của mình, đây là những kỹ thuật mình đang và sẽ áp dụng trong spider bot của mình:

    1. Hỗ trợ scale-out spiders
    Khi cào dữ liệu số liệu ít, giả sử 1 spider cào trung bình 40k pages/day (khoảng 2s/page) thì việc bạn viết các spider riêng cho từng victim sites của bạn khá dễ. Ví dụ hình sau mô tả việc cào dữ liệu của 1 site với tầm hơn 4 triệu dữ liệu.
    [​IMG]

    Tuy nhiên, nếu bạn muốn cào sites nhanh hơn mức 40k pages/day một ngày, giả sử 1M pages/day (cho nhiều victim sites) thì chắc chắn bạn cần tăng số spiders lên (nhu cầu cần 22 spiders hoặc tăng luồng tuỳ theo CPU bạn sở hữu), trong khi chia sẻ cùng 1 danh sách URLs. Khi đó bạn cần: hỗ trợ scale-out spiders (chạy spider trên servers hoặc VPS khác nhau) và 1 queue URLs DB (1 vps hoặc nhiều vps hỗ trợ HA). Ví dụ như hình sau:
    [​IMG]

    2. Anti-bot detection
    Khi cào dữ liệu thì bạn có thể gặp những websites sử dụng các cơ chế chặn bot (dĩ nhiên họ sẽ ko chặn các Search engine nổi tiếng như Google, Bing,... rồi). Họ có thể sẽ sử dụng các cơ chế:
    - Phát hiện user-agents truy cập nhiều —> Giải pháp: dùng user-agent khác nhau hoặc dùng SE agents nổi tiếng cho mỗi lần request. Danh sách 450 User-Agents download tại http://cafemmo.club/threads/chia-se-danh-sach-user-agent-thong-dung-nhat.1818/
    - Phát hiện IPs truy cập nhiều, giả sử 5 requests/s --> Giải pháp: dùng các dịch vụ IP rotator cho mỗi lần request. Mình dùng stormproxies(.)com.
    - Phát hiện người dùng thật qua Javascript, đa số bot ko hỗ trợ JS mà --> Giải pháp: dùng headless browser như Splash, Selenium, PhantomJS, Puppeter,... Có khá nhiều sites mình gặp dùng JS để detect robot như similarweb(.)com,...
    - Sử dụng honeypot traps: ví dụ như các links bẩy đính kèm display:none, visibility: hidden,... --> cài đặt cơ chế phát hiện các traps thôi ^^
    - Sử dụng cookie, captcha để chặn, đa số sites dùng Cloudflare để chặn bot --> có vài script bypass Cloudflare rồi, sử dụng như https://github.com/Anorov/cloudflare-scrape (script này bypass cookie của Cloudflare nhưng chưa có cơ chế bypass captcha của Cloudflare nhé).

    3. Ghi kết quả dữ liệu (scraped data) quá nhiều
    Khi bạn cào dữ liệu với nhiều spiders, ví dụ 1 spider cào được 1 record/2s, và bạn có 20 spiders thì bạn có 10 records/s, lúc này việc ghi dữ liệu quá nhiều và liên tục vào DB sẽ làm cho DB của bạn quá tải và giảm hiệu năng, có thể ảnh hưởng đến hiệu năng hoạt động. Khi đó, bạn nên cân nhắc dùng:
    - Bulk insert query: tức spider chỉ cần thực hiện 1 query để insert nhiều records
    - Bulk import file: tức là spider ghi dữ liệu vào 1 file với 1000 dữ liệu chẳng hạn, sau đó bạn sử dụng lệnh import file đó vào DB. Ví dụ: MySQL (LOAD DATA LOCAL INFILE), MongoDB (mongoimport)
    Các DB engines nào cũng hỗ trợ 2 dạng trên, ví dụ như MySQL, MongoDB,...

    4. Cấu trúc site thay đổi
    Ví dụ như site thay đổi layout, tức HTML tags thay đổi, lúc này bạn phải thay đổi các selectors để lấy đúng dữ liệu bạn cần. Trong tình huống này, spider cần có cơ chế phát hiện sự thay đổi cấu trúc site để thông báo cho chúng ta và dừng extract data của site đó. Khi đó, mỗi site ta cần hỗ trợ nhiều schemas để extract dữ liệu hơn.

    Trên đây là một vài kỹ thuật chia sẻ cùng các bạn, nếu bạn biết kỹ thuật bypass tốt hơn hoặc khi cào dữ liệu mà bị các kỹ thuật chặn khác thì cùng chia sẻ để chúng ta cải tiến spider bot của chúng ta hơn nhé!

    Happy crawling strategy ^^
     
    Last edited: Jan 20, 2019
  2. Phan Thị

    Phan Thị Bang Chúng

    Bài viêt công phu quá, Thank
     
    command likes this.
  3. no-reply

    no-reply Bang Chúng

    Quả thật công phu quá, không biết anh command được đào tạo qua trường lớp hay là anh tự học vậy ạ. Em cũng tự học mà vẫn chưa với được tới ngưỡng này. :(
     
    command likes this.
  4. Nai

    Nai MiddleMan Staff Member

    Thanks anh, ngắn gọn xúc tích. Em hiện đang crawl chỉ bằng php có gặp trường hợp site detect bằng script như 1 tình huống kể trên nhưng crawl trên vps thì bị detect còn trên local thì.. delay chuẩn 1 tí thì vô tư. Ko biết php có giải pháp cho trường hợp này không ạ.
     
    command likes this.
  5. console

    console Bang Chúng

    Ngồi ngắm mưa Đà Nẵng viết ra à anh :D
     
  6. command

    command Bang Chúng

    Mình là coder nên kiến thức lập trình thì có, còn crawler thì thực nghiệm là chính.
    Nếu ko ngại thì chia sẻ victim site đi bạn, mình ngâm cứu rồi mới chia sẻ đc, web mình bằng PHP nhưng crawler thì viết Python, nhưng bàn về giải pháp kỹ thuật thì ngôn ngữ nào cũng áp dụng được mà.
     
  7. command

    command Bang Chúng

    Đúng là lúc ở Đà Nẵng nhàn quá, có suy nghỉ về viết cái này. Nhưng sáng nay ngắm đồi thông Đà Lạt mới viết post này nhé!
     
    bernie likes this.
  8. console

    console Bang Chúng

    A đi Đà Nẵng nắng đẹp mấy ngày nay haha
     
  9. thitgaluoc

    thitgaluoc Hương Chủ

    Ghi dữ liệu ra ổ cứng rồi import vào db nghe vẻ khả dĩ hơn nhỉ :D
     
  10. Mr.BTD

    Mr.BTD Moderator Staff Member

    Anh em ĐN nhiều nhỉ , bữa nào off massage các kiểu tí chứ :v
     
  11. bernie

    bernie Tân Thủ Thôn

    dang DL ha a
     
  12. command

    command Bang Chúng

    Có e console thôi phải ko ae?

    Mình đi ngắm thông Đà Lạt rồi, mình ghé ĐN ít ngày mà mưa suốt, console cùng mình đi cổ vũ VN và Yemen ấy. Sau đó thắng lợi nên a đi ĐL cư trú.
     
  13. bernie

    bernie Tân Thủ Thôn

    gap nhau nao a oi :)
     
  14. command

    command Bang Chúng

    Hihi, tuỳ theo nhu cầu của mỗi người mà áp dụng cách thức phù hợp
     
  15. command

    command Bang Chúng

    Inbox đi, thứ 2 gặp đc, hihi
     
  16. Hoa Mãn Lâu

    Hoa Mãn Lâu Trưởng Môn

    E bắt quả tang 2 cụ oánh lẻ rồi nè {canny}
     
  17. Le Hieu

    Le Hieu Sơ Nhập Giang Hồ

    Bài viết hay quá {beauty}{beauty}{beauty}
     
  18. Mr.BTD

    Mr.BTD Moderator Staff Member

    Em nữa a ơi
     
  19. command

    command Bang Chúng

    Ra Đà Nẵng là gặp console mà {beauty}

    Ủa chú Khánh cũng đang ở ĐL à, thế thì có gì mai call cafe ^^
     
  20. vipkhongtin

    vipkhongtin Sơ Nhập Giang Hồ

    bác code tool bằng framew gì vậy?