Lấy dữ liệu của site bảo vệ bởi CloudFlare

Discussion in 'Hỏi Đáp Kỹ Thuật' started by command, Dec 2, 2020.

  1. command

    command Bang Chúng

    Chào ae,

    Mình muốn lấy dữ liệu của site bảo vệ bởi CloudFlare, ví dụ như similarweb[.]com

    Hiện tại, mình test với 1 IP (sau khi test ổn thì dùng nhiều proxies), mình kết hợp kỹ thuật sau:
    + Trình duyệt hỗ trợ JS (Splash).
    + Lưu cookie lại (để tái sử dụng cho lần request sau)
    + Delay từ 40-60s.

    Tuy nhiên, khi lấy được tầm 20 pages trở lên thì lại bị chặn bởi CF. Mình ko muốn dùng mấy services xử lý captcha tự động để vượt CF vì sẽ tốn khá nhiều $.

    Có ae nào lấy dữ liệu site bảo vệ bởi CF thành công với số lượng lớn chưa? Nếu có thể, có thể chia sẻ kỹ thuật vượt qua CF được ko?

    Mong nhận góp ý và chia sẻ của ae, thanks.
     
  2. Cái bang

    Cái bang Sơ Nhập Giang Hồ

    Cái cookie của Cloudflare chỉ có tác dụng vượt qua captcha của nó trong vài phút. Cần phải get lại cookie mới. Một khi đã có cookie của cloudflare rồi thì không cần thiết phải delay 40-60s nữa. Cứ request vô tư cho đến khi thay cookie mới.
     
    Last edited: Dec 2, 2020
    command likes this.
  3. firefox

    firefox Bang Chúng

    Cách của em đang dùng:
    Nguyên liệu:
    - 1 VPS
    - CloudProxy: https://github.com/NoahCardoza/CloudProxy
    https://github.com/ngosang/FlareSolverr
    - C# RestSharp (làm client)

    Cách làm:
    1. Ở c#, chuẩn bị sẵn 1 class có thể request sử dụng cookie, kiểu như CookieContainer
    2. Cài cloud proxy lên vps, nó sẽ là 1 cái webserver
    3. Dùng c# client, gọi đến CloudProxy, hàm session.create, chỉ định 1 user agent nào đấy
    4. Dùng c# client, gọi đến CloudProxy, hàm request.get, get cái trang chủ của target
    5. Đâu đó tầm dưới 20s, CloudProxy sẽ trả về cookie các kiểu
    6. Ở c# client, set user agent giống ở bước 3, và cookie set theo response đã trả ở bước 5
    7. Request điên cuồng, chừng nào cloudflare chửi thì lặp lại bước 3
    Lưu ý:
    - Cả c# client và CloudProxy phải cùng IP, nếu c# ở nơi khác thì vps phải mở proxy
    - Sau bước 5, nên gọi hàm session.destroy để trả RAM
    - C# client là em lấy làm ví dụ thôi, ae có thể dùng cái khác tương tự, dùng code sẽ request nhanh/nhẹ/đa luồng hơn dùng headless
    - Có thể dùng thêm hcapcha để tiết kiệm thời gian, thường thì 1 lần lấy cookie cũng request được lâu lắm, cái c# client code càng tối ưu sẽ càng tiết kiệm được số lần lấy cookie
    Hiểu theo cách nôm na, CloudProxy sẽ mở 1 process chrome cho mỗi session, cho dù target bật captcha thì trong vài chục request cũng sẽ có cái không bật, lúc đấy CloudProxy sẽ chộp lấy cookie và trả về cho mình. Sau khi có cookie thì cuộc chơi này là của chúng ta rồi :D
     
    Last edited: Dec 13, 2021
  4. command

    command Bang Chúng

    Rất chi tiết, nên mình rất dễ hiểu khi triển khai, thanks @firefox

    Tuy nhiên, mình đọc qua CloudProxy thì package này hiện chưa hỗ trợ proxies, nên khi áp dụng cách này và lượng requests nhiều thì chắc sẽ bị CF chặn vì CloudProxy này chạy trên VPS với 1 IP duy nhất.

    Hơn nữa, khi có cookie thì cuộc chơi vẫn còn khó nhằn lắm đối với 1 số site lớn sử dụng CF (chắc là có trả phí), ví dụ mình đang thử site khác nhưng nó cũng khó nhằn như similarweb[.]com vậy.
     
    Last edited: Dec 2, 2020
    firefox likes this.
  5. Cái bang

    Cái bang Sơ Nhập Giang Hồ

    Để lấy cookie của cloudflare có thể dùng selenium. Muốn dùng proxy thì add proxy trong selenium thôi.
     
  6. command

    command Bang Chúng

    Thanks @Cái bang, mình ko dùng Selenium vì hao phí tài nguyên lắm, mình dùng Splash thay thế Selenium hoặc dùng Chrome headless như @firefox chia sẻ á.
     
  7. sincos

    sincos Bang Chúng

    Đã thử pupeteer chưa?
     
  8. firefox

    firefox Bang Chúng

    Lib này nó dùng pupeteer+steath plugin trên nền nodejs, về lý thuyết thì mình hoàn toàn có thể bùa thêm 1 vài parameters phục vụ proxy lúc tạo instance pupeteer, thằng similar web thì em chưa thử, chứ mấy thằng dùng cloudflare mà ko bật rate limit thì quất vài ngàn request/phút ko thấy xi nhê gì
     
  9. command

    command Bang Chúng

    Mình chưa dùng Pupeteer, nhưng có biết trước đó, vì nó sử dụng Nodejs mà mình ko rành nên chưa sử dụng Pupeteer. Mong là sau này Pupeteer có hỗ trợ tương tác qua HTTP API để người dùng ngôn ngữ lập trình khác có thể ứng dụng.

    Thanks @firefox, mình chưa sử dụng Nodejs (dù biết JS) nên thay đổi source code của package CloudProxy này khó với mình. Có lẽ phải đợi CloudProxy phát triển thêm và hỗ trợ proxy rồi và mình dành tìm kiếm package của ngôn ngữ khác.
     
    firefox likes this.
  10. firefox

    firefox Bang Chúng

    À, em mới check lại code của nó, có vẻ như nó đã ngầm ngầm hỗ trợ proxy thì phải:
    upload_2020-12-3_12-1-14.png
     
  11. Hoa Mãn Lâu

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

    Vờ lờ, cụ mò vô tới tận source để xem luôn, củng là coder à cụ
     
    firefox likes this.
  12. command

    command Bang Chúng

    Cám ơn @firefox nhiều nhiều, mình vừa đọc doc của Puppeteer thì thấy tham số `--proxy-server=<Proxy_IP>` do Puppeteer hỗ trợ, mình chưa đọc code của CloudProxy nhưng theo hình minh hoạ của bạn thì có thể suy đoán CloudProxy sẽ truyền các tham số định nghĩa qua Puppeteer xử lý. Vậy thì quá tuyệt vời rồi, many thanks. Có lẽ mình cần dành 1 tuần để học thêm NodeJS rồi.

    Mò được tham số truyền user&pass của proxy rồi, xem code tại https://github.com/NoahCardoza/CloudProxy/blob/master/src/routes.ts
    --- Double Post Merged, Dec 7, 2020, Original Post Date: Dec 3, 2020 ---
    @firefox ơi, ở bước 5, khi CloudProxy trả về thông số thì biến result['solution']['cookies'] chứa mảng các json cookie, vậy lấy phần tử nào trong mảng này? Mình thử truyền cả array cookies (bên cạnh truyền user-agent và proxy giống như bước tạo session cho CloudProxy) vào requests package của Python thì ko truy cập được lần thứ 2 (lần đầu là lấy cookie từ CloudProxy).
     

    Attached Files:

    firefox likes this.
  13. sincos

    sincos Bang Chúng

    Đằng nào cũng phải cài 1 con cho Puppeteer thì dùng thẳng Puppeteer luôn đi...... random 20% cho load full js còn lại block cũng nhanh mà..... get cookie rồi dùng http client khác làm phức tạp thêm tình hình.
     
    firefox likes this.
  14. firefox

    firefox Bang Chúng

    Ở phần cookie thì name và value là quan trọng nhất, tuỳ vào cái ngôn ngữ bác code ra cái client bác dùng mà có thể lấy thêm path và domain.
    Miễn sao lúc đẩy request bằng http client lên, header nó chứa dạng này
    Code:
    Cookie: name1=value1; name2=value2; name3=value3
    Nếu là c# thì dùng constructer này https://docs.microsoft.com/en-us/do...HttpCookie__ctor_System_String_System_String_
    --- Double Post Merged, Dec 7, 2020, Original Post Date: Dec 7, 2020 ---
    Tiết kiệm ram là chính thôi anh, có mấy site cần cào nhanh nhanh chút nên phải bùa ngải tý xíu :p
     
    command likes this.
  15. Tusupper

    Tusupper Tân Thủ Thôn

    Cao thủ quá, bây giờ mới biết cloudflare cũng có thể bypass được
     
  16. thitgaluoc

    thitgaluoc Hương Chủ

    JS được support khủng quá, có lẽ phải học js gấp :D
     
  17. sincos

    sincos Bang Chúng

    Tại bị js được buff nhiều quá.... rất nhiều lib, tool... chỉ có trên js.
     
  18. command

    command Bang Chúng

    Nếu tăng được tốc độ request trang và tiết kiệm tài nguyên thì làm thôi, thêm một vài kiểm tra điều kiện thì đâu có gì phức tạp.

    Thanks @firefox mình sẽ thử theo gợi ý :)
     
  19. Cái bang

    Cái bang Sơ Nhập Giang Hồ

    Requests package của python không thể truyền cookie qua headers được.

    M thường gửi cookie bằng requests session :

    Code:
    s = requests.session()
    for cookie in cookies:
        s.cookies.set(cookie['name'], cookie['value'])
    s.get('https://google.com')
    
     
  20. thitgaluoc

    thitgaluoc Hương Chủ

    có bạn ơi, gửi được mà
    bạn gửi dạng dict kèm với request nhé :D
    r = requests.get(ep, cookies=cookies, headers=headers)
     
    Cái bang likes this.