Hỏi cách scrape tải image từ url protect by cloudflare

Hello toàn thể ace cô dì chú bác. Em newbie vừa học python muốn viết tool download ảnh. Nhưng cục nỗi có mấy trang dùng cloudflare nên em đành bó tay.
Em đã thử hết cfscrape đến cloudscraper nhưng đều bị block:

import random
import subprocess
import cloudscraper
import string

url = "http://imageinstant.com/data/images/17696/603689/001.jpg"
headers = {
            'User-Agent': "Mozilla/5.0 (X11; U; SunOS sun4m; en-US; rv:1.4b) Gecko/20030517 Mozilla Firebird/0.6",
            'Cache-Control': 'no-cache',
            'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
            'Referer': 'http://www.google.com/?q=' + random.choice(string.ascii_lowercase),
            'Keep-Alive': str(random.randint(110,120)),
            'Connection': 'keep-alive'
            }
session = cloudscraper.create_scraper(
      interpreter='nodejs', recaptcha={'provider': 'return_response'}
)
session.get(url, headers=headers)

Báo lỗi: TypeError: init() got an unexpected keyword argument ‘recaptcha’

Nên em thử mần mò một lúc mới thấy thằng này: gitmemory.com/issue/codemanki/cloudscraper/254/526000646
Sau khi đọc thì cũng hiểu sơ sơ về cách hoạt động nhưng vẫn còn non và mơ hồ.
Em là 1 thằng hamhochoi nên mong cao nhân nào đó dẫn đường 1 bước ạ. Thanks all!

Đối với những trang sử dụng dịch vụ chặn DDOS như Cloudflare, chúng ta không gửi trực tiếp request đến server mà gửi thông qua một bên thứ 3, trong trường hợp này là server Cloudflare, sau đó nó mới gửi request đến server. Khi user mới vào trang lần đầu thì Cloudflare gửi xuống một trang giải reCAPTCHA, khi user giải xong thì sẽ được một mã gọi là captcha token, trình duyệt tự động gửi captcha token lên server Cloudflare, bên Cloudflare xác nhận captcha token, nếu hợp lệ thì trả về cái trang bạn cần vào. Đối với mấy dịch vụ “vượt ReCaptcha” hay giải ReCaptcha, thực chất bên đó giải ReCaptcha bằng tay rồi trả về cái captcha token cho bạn dùng. Lưu ý là mã captcha token chỉ có thể dùng được trong vòng 3 phút kể từ lúc được tạo ra.


Ở cái trang mà bạn nói đến thì họ đã có giải thích khá rõ rồi, mình xin vắn tắt và giải thích thêm. Cloudscrapper thực chất chỉ là một thư viện cào dữ liệu bình thường nhưng được bổ sung thêm khả năng vượt rào, tránh gặp trang giải reCaptcha, nhưng thường khi vào lần đầu thì Cloudflare sẽ bắt giải reCaptcha. Trong trường hợp này thì CloudScrapper sẽ cung cấp cho bạn thông tin và gửi lên mấy trang giải ReCaptcha dùng bạn, tuy nhiên, để dùng dịch vụ giải reCaptcha thì phải đăng kí tài khoản rồi lấy API key (hoặc API token gì đó) cung cấp cho nó. Nghe nói đâu mấy trang giải free cho tốc độ chậm lắm, muốn nhanh phải sài mấy thằng trả phí.

7 Likes

Quá chi tiết và dễ hiểu. Cảm ơn bác nhiều (y)

Ngoài ra, khi cào dữ liệu từ mấy trang dùng Cloudflare nhớ cào ít ít thôi, không là nó ban ip luôn đấy. À mà tích solution cái bình luận trên dùm mình nha.

1 Like

Puppeteer là một thư viện headless browser bên Node.js, có thể hiểu nó là một thư viện điều khiển trình duyệt vậy. Dùng thư viện headless browser thì dễ bypass hơn và tỉ lệ thành công cũng cao hơn so với cách sử dụng mấy thư viện như Cloudscrapper, tất nhiên gặp captcha thì vẫn phải dùng dịch vụ giải captcha thôi. Mấy bác kia bảo dùng Puppeteer vì trong số các thư viện headless browser thì thằng này tốt nhất, do chính Google tạo ra, mỗi tội chỉ có trên Node.js thôi. Bên Python có Selenium kém hơn chút nhưng vẫn sài OK.


Sau khi giải xong mấy cái thử thách của Cloudflare (trong đó có ReCaptcha) thì bên Cloudflare sẽ trả cho mình một vài cái cookie, trong thời gian mấy cookie đó còn hiệu lực thì chương trình không cần phải giải mấy cái thử thách của họ, trừ khi chương trình của bác làm một vài hành động bất thường như gửi quá nhiều request chẳng hạn.

6 Likes

Tư vấn hữu ích với một thằng nhập môn như em. Em có đọc bài viết này trên kipalog: https://kipalog.com/posts/Danh-bat--captcha-voi-Headless-browser và thấy việc setup khá phức tạp
Với bác có nhận đệ tử không ạ. Em cần một người chỉ đưởng. Cảm ơn bác

Làm tool crawl thì phải biết cả lập trình front-end, không biết thì khỏi làm :V. Mà công nhận cái trang kia giải thích khó hiểu thật, cứ hiểu thế này cho nhanh:

  • Đối với ReCaptcha, captcha token chỉ dùng được cho site key nào đó, captcha token dùng cho site key khác sẽ không dùng được cho site key này.

  • Khi dùng bất kì cái API nào dành cho bot thì trước tiên cần phải đăng ký tài khoản, sau đó lấy API key (hay API token gì đó,…). Khi sử dụng cái API của họ thì lúc nào cũng phải gửi cái API key này lên.


Giờ, muốn dùng 2Captcha thì trước tiên phải đăng ký tài khoản, lấy API key, sau đó gửi cái request chứa cái API key, site key và cái trang muốn vượt ReCaptcha lên, nó sẽ trả về một cái ID. Gửi request lên 2Captcha vói cái API key và ID đó lên cỡ 1, 2 giây một lần, nếu bên họ đã giải xong ReCaptcha thì sẽ trả về cái captcha token để mình dùng, chưa giải xong thì trả về CAPCHA_NOT_READY, và rồi cứ gửi request cho đến khi có được captcha token.


Có trang này giải thích đơn giản hơn cái trang trên nhưng lại code bằng C#, không phải Python:

Khi dùng API thì nên đọc tài liệu về cái API đó. Link API document của 2Captcha:

https://2captcha.com/2captcha-api

5 Likes

Hệ thống chặn DDOS, crawler của bên CloudFlare không chỉ có mỗi chặn bằng ReCaptcha không, nó có đủ thứ thể loại chặn, có cái chỉ cần refresh trang là qua, có cái phải đợi 5 giây mới cho qua,… Cứ lên mạng tìm hiểu luôn cho nhanh.

5 Likes

Share code cho mình với bạn, mình đang cần

https://m.coupang.com/vm/v4/enhanced-pdp/products/281403973
Mình có api này từ coupang. request trên local thì lấy bình thường. nhưng mình đẩy lên vps bằng centos 7 thì luôn bị timeout. Thử cài trên ubuntu thì được. Vấn đề này của mk có liên quan đến cloudfont không. VÌ mình thấy site này nó sử dụng cloudfront. Mình viết bằng nodejs

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?