2015-10-20 12 views
7

Thỉnh thoảng tôi thường xuyên sử dụng trang web thương mại điện tử để lấy thông tin về giá sản phẩm. Tôi đã không sử dụng scraper được xây dựng bằng cách sử dụng Scrapy trong một thời gian và ngày hôm qua đã cố gắng sử dụng nó - Tôi gặp phải vấn đề với bảo vệ bot.Làm thế nào để bỏ qua bảo vệ bot/ddos ​​cloudflare trong Scrapy?

Ứng dụng đang sử dụng tính năng bảo vệ DDOS của CloudFlare, về cơ bản, sử dụng đánh giá JavaScript để lọc ra các trình duyệt (và do đó các trình gỡ rối) bị tắt JS. Khi hàm được đánh giá, phản hồi với số được tính được tạo ra. Đổi lại, dịch vụ gửi lại hai cookie xác thực được đính kèm theo mỗi yêu cầu cho phép thu thập dữ liệu thông thường trang web. Here 's mô tả về cách hoạt động của nó.

Tôi cũng đã tìm thấy một mô-đun Python cloudflare-scrape sử dụng công cụ đánh giá JS bên ngoài để tính toán số và gửi yêu cầu quay lại máy chủ. Tôi không chắc chắn làm thế nào để tích hợp nó vào Scrapy mặc dù. Hoặc có thể có một cách thông minh hơn mà không cần sử dụng thực thi JS? Cuối cùng, đó là một biểu mẫu ...

Tôi xin lỗi bất kỳ trợ giúp nào.

+0

có vấn đề gì với việc thực thi JS? không thể truy cập nhiều nội dung mà không có nó ... – dandavis

+0

@dandavis Scrapy không thực thi JS. – Rejected

+0

mà không có JS, cạo là nhận được vô dụng hơn tất cả các thời gian. bạn nên cân nhắc sử dụng trình duyệt để loại bỏ. kịch bản cạo của tôi có thể nhận được thông tin đăng nhập, lấy nội dung động và được phân trang, thậm chí là nhấp chuột giả để yêu cầu nội dung phụ động hơn trước khi cạo và tôi không nghĩ có bất kỳ mã nào trên 10 dòng hoặc cần thư viện bên ngoài lớn. tất cả những gì bạn cần là tampermonkey và thói quen tải xuống ... KISS. nếu bạn muốn nó tự động hơn, bạn có thể chuyển usercript thành phantomJS hoặc tương tự như vậy. – dandavis

Trả lời

4

Vì vậy, tôi đã thực thi JavaScript bằng Python với sự trợ giúp của cloudflare-scrape.

Để scraper của bạn, bạn cần phải thêm đoạn mã sau:

def start_requests(self): 
    cf_requests = [] 
    for url in self.start_urls: 
     token, agent = cfscrape.get_tokens(url, 'Your prefarable user agent, _optional_') 
     cf_requests.append(Request(url=url, 
         cookies={'__cfduid': token['__cfduid']}, 
         headers={'User-Agent': agent})) 
    return cf_requests 

cùng với chức năng phân tích cú pháp. Và đó là nó!

Tất nhiên, trước tiên bạn cần phải cài đặt quét đám mây và nhập vào con nhện của mình. Bạn cũng cần cài đặt một công cụ thực thi JS. Tôi đã có Node.JS rồi, không có khiếu nại.

+0

Xin chào, tôi đã thử sử dụng giải pháp của bạn cho trang web bằng cách sử dụng cloudflare - Có vẻ như yêu cầu phù hợp đang được gửi, nhưng tôi vẫn định thời gian với 503 lỗi từ yêu cầu đầu tiên. Dưới đây là những gì mà các thiết bị trông giống như sau: 'DEBUG:" GET/cdn-cgi/l/chk_jschl? Jschl_answer = 386 & jschl_vc = 3ee197400dbcca30577bcb3949cf781f & pass = 1446694346.755-esyN0f4s4% 2F HTTP/1.1 "302 165 DEBUG:" GET /forumdisplay.php?29-DotA-Chat HTTP/1.1 "200 21367' ' 2015-11-04 22:32:48 [scrapy] DEBUG: Sẵn sàng thử lại (không thành công 3 lần): 503 Dịch vụ không khả dụng ' – ddnm

+0

@ddnm, tôi đã cập nhật mã. Nó sẽ hoạt động ngay bây giờ. Thay đổi 'cookies = {" cfuid ": token [" cfuid "]}' thành 'cookies = token' –

1

Rõ ràng cách tốt nhất để làm điều này là liệt kê IP của bạn trong CloudFlare; nếu điều này không phù hợp, hãy để tôi giới thiệu thư viện cloudflare-scrape. Bạn có thể sử dụng mã này để nhận mã thông báo cookie, sau đó cung cấp mã thông báo cookie này trong Scrapy request quay lại máy chủ.

2

Nếu bạn chấp nhận một chút tốc độ trong quá trình cào, bạn có thể kết hợp Scrapy với Selenium để mô phỏng tương tác người dùng thực với trình duyệt. Tôi đã viết một hướng dẫn ngắn về nó ở đây: http://www.6020peaks.com/2014/12/how-to-scrape-hidden-web-data-with-python.

Nó không nhắm mục tiêu vấn đề cụ thể của bạn với CloudFlare, nhưng nó có thể giúp đỡ vì tôi đã có vấn đề tương tự khi tải dữ liệu cần thiết của một số thực thi JS.

Các vấn đề liên quan