Post a Reply
949 views

Xây dựng hệ thống proxy hỗ trợ crawler

  1. 6 months ago

    Crawler là bài toán cơ bản mà lập trình viên nào cũng cần nắm vững. Crawler giúp lập trình viên thu thập dữ liệu từ các website trên Internet để làm giàu cho kho dữ liệu, phục vụ các mục đích khác nhau của ứng dụng. Tuy nhiên, không phải website nào cũng cho phép bạn làm điều đó. Họ thường chặn những địa chỉ IP có truy cập bất thường, quá nhiều request trong 1 khoảng thời gian. Một trong những cách phổ biến để vượt qua bước kiểm tra này đó là sử dụng Proxy.

    1 xXX_BFQyFFchI4-zuJk80g.png

    Ném đá giấu tay

    Sử dụng Proxy tức là dùng một máy tính khác làm trung gian, mọi request đều thông qua máy tính này. Làm cách này thì website sẽ không biết được địa chỉ IP chính xác của server mà chương trình crawler đang chạy.

    1 OvypghYEiXl-3wKiLQafmw.png

    Bạn có thể dễ dàng cài đặt Proxy server dựa theo các bước ở bài hướng dẫn này How to Setup a SOCKS5 Proxy Server Using SS5 on CentOS 7 . Tuy nhiên, để đơn giản, mình khuyến khích các bạn dùng docker go-socks5-proxy

    docker run -d name --socks5 -p 1080:1080 -e PROXY_USER=<PROXY_USER> -e PROXY_PASSWORD=<PROXY_PASSWORD> serjs/go-socks5-proxy

    Lệnh này sẽ tạo 1 container docker proxy và dùng port 1080 chung với server thật. Nếu bạn muốn dùng server này public thì phải làm thao tác mở port nữa. Để test proxy, bạn dùng lệnh sau

        curl --socks5 <docker host ip>:1080 http://ifcfg.co

    Lấy thịt đè người

    Nếu bạn chỉ có 1 proxy thì tình cảnh vẫn không khác gì, bạn sẽ bị website chặn IP như thường nếu request quá nhiều. Do đó, thông thường mình sẽ setup 1 list các proxy đứng chờ sẵn. Tùy vào công việc, có thể dao động từ 10–100 server proxy. Mỗi lần request mình sẽ random chọn 1 con để thực hiện. Tuy nhiên, có thể bạn sẽ gặp trường hợp chọn đúng con đã bị khóa IP thì sao ? Trong trường hợp này, bạn phải chọn tiếp ngẫu nhiên 1 con proxy khác, và cứ tiếp tục như vậy. Để tự động hóa khâu này cho đỡ cực, các bạn có thể dùng proxychains-ng . Chỉ cần list hết tất cả proxy vào file config, rồi chèn proxychains4 vào trước mỗi câu lệnh là được, VD:

       proxychains4 curl http://ifcfg.co

    Nó sẽ tự động chọn proxy cho bạn và đổi sang proxy khác nếu gặp lỗi.

    Để dựng mạng proxy thì các bạn có thể dùng DigitalOcean (5$), Vultr (5$) hoặc AWS lightsail (3.5$). Nên chọn con máy rẻ nhất để mua vì làm proxy không tốn nhiều CPU, chỉ cần chú ý đến băng thông là được.

    Ve sầu thoát xác

    Bây giờ các bạn đã có một danh sách các proxy rồi, điều gì xảy ra nếu tất cả proxy này đều bị website block hết ? Hoặc nếu chỉ có 1 proxy bị block, thì làm sao loại proxy này khỏi danh sách ?

    Đây là lúc bạn cần đến một chút coding, tất cả các nhà cung cấp dịch vụ mà mình kể ở trên DigitalOcean, Vultr, AWS lightsail đều có API hỗ trợ bạn khởi tạo máy và xóa máy một cách tự động.

    Ban đầu, ý tưởng của mình như sau :

    • Viết 1 chương trình check proxy theo danh sách
    • Nếu proxy không còn crawler được website, xóa nó
    • Tạo máy proxy mới để duy trì số lượng proxy

    Cách làm này ok và thực hiện được với mọi nhà cung cấp dịch vụ ở trên. Tuy nhiên, khi mình tìm hiểu kỹ hơn về AWS lightsail, thì thằng này nó hỗ trợ IP động. Tức là mỗi lần bạn stop rồi start lại máy, máy đó sẽ được gán 1 IP mới (ngon). Chú ý là phải Stop rồi Start lại, chứ không phải là Reboot. Do đó, nếu bạn làm trên AWS lightsail thì làm như sau

    • Check proxy theo danh sách
    • Nếu proxy không crawler được, Stop, Start

    Cách làm này lợi ở chỗ bạn không cần tạo máy mới và cài đặt lại các phần mềm liên quan lên máy đó. Ngoài ra AWS lightsail hỗ trợ tạo máy mới từ snapshot của máy cũ, nên nếu bạn tạo máy mới thì cũng nhanh hơn so với 2 thằng kia.

  2. https://medium.com/@boygiandi/x%C3%A2y-d%E1%BB%B1ng-h%E1%BB%87-th%E1%BB%91ng-proxy-h%E1%BB%97-tr%E1%BB%A3-crawler-7243b55bffa0

 

or Sign Up to reply!