Crawler crawler chỉ 1 phần mềm có khả năng tự động lấy dữ liệu như ảnh, text, … trên WWW. Thông thường, crawler thường có chức năng lấy thông tin từ server, trích xuất ra những thông tin người sử dụng cần, đồng thời cũng tìm những link có trong trang web đó và tự động truy cập vào những link đó.
Các tên gọi khác của crawler là robot, bot, spider, worm, ant. Nhưng gần đây tên gọi crawler là thông dụng nhất.
Crawler thường chỉ là 1 bộ phận của 1 hệ thống lớn hơn mà thôi. Ví dụ như những clawler tìm kiếm tự động của Google, hay Yahoo. Trong project này, crawler đóng vai trò tìm kiếm link các trang web tiếng Việt, còn việc xử lý, phân tích các trang đó sẽ được tìm hiểu sau.
Tham khảo : [Internet Agents : spider, wanderers, brokers, and bots] Fah-Chun Cheong, New Riders. Sử dụng các thư viện đã được công khai ở CPAN thì việc lập trình không phải quá khó.
Về mặt lý thuyết crawler có vẻ khá đơn giản, nhưng thực tế khi lập trình sẽ gặp phải nhiều vấn đề khó khăn và phức tạp.
1. Xây dựng mô hình crawler đơn giản nhất 1. Chọn URL khởi đầu. 2. Sử dụng HTML protocol để lấy trang web. 3. Trích xuất ra các link. Lưu lại trong queue. 4. Lặp đi lặp lại bước 2,3.
Các vấn đề cần giải quyết : 1. Thời gian giới hạn : Nếu server không trả lời thì chương trình sẽ bị đóng băng. Vì thế cần xử lý trường hợp server không trả lời sau 1 khoảng thời gian qui định. 2. Nếu không lên kế hoạch truy cập 1 cách hợp lý, chương trình sẽ liên tục truy xuất 1 trang web, điều đó sẽ trở thành tấn công DoS và gây ra rất nhiều phiền toái vì thế phải quản lý tần suất truy cập 1 trang, ví dụ 1request/1s hoặc ít hơn. 3. Truy cập lại trang web đã được xử lý xong. Nếu không xử lý vấn đề này, chương trình sẽ bị rơi vào vòng lặp vĩnh viễn. Vì thế phải xây dựng phương pháp đánh dấu những link đã xử lý. Đơn giản nhất là lưu lại URL của những trang web đã xử lý, trước khi thêm vào queue 1 URL mới thì so sánh với những URL đã xử lý trước. Ngoài ra, có 1 cách làm nhanh hơn là sử dụng hash. 4. Các link khác nhau nhưng cùng chỉ 1 trang web. Không thể sử dụng cách so sánh các link được. Vì thế phải viết thêm 1 hàm để biến đổi những link này về 1 dạng thống nhất. normalize.
Việc sử dụng crawler truy cập vào các website thường gây nên tình trạng nghẽn mạch, vì thế các website thường có qui định riêng dành cho các crawler. Các qui định này thường được lưu dưới văn bản “robots.txt” ngay dưới thư mục gốc. Ví dụ : User-Agent: Googlebot Disallow: /cgi-bin/ Nghĩa là : với googlebot thì không được truy cập vào /cgi-bin/. Ví dụ khác : User-agent: * Disallow: / Có nghĩa là cấm tất cả các crawler truy cập vào website này.
Những việc cần làm : 1. thêm tên người sử dụng crawler, khái yếu và mục đích của crawler. 2. Cài đặt User-Agent: thông báo cho server biết về crawler. Định dạng như sau : Crawler_name (+ URL ) Đăng kí crawler tại Web Robots Database (http://www.robotstxt.org/wc/active.html) 2.Mechanize Sử dụng mechanize Mechanize là 1 module được phát triển cho Python, nhằm làm đơn giản hoá các thao tác với Web và Browser. Bạn có thể download và cài đặt hoàn toàn toàn miễn phí.
Các thao tác cơ bản của mechanize :
1.Browser Tạo ra các instance trong class Browser() import mechanize br = mechanize.browser()
2.Cài đặt Proxy proxy_dict = {"http":"proxy.example.com:8080","ftp":"proxy.example.com"} br.set_proxies(proxy_dict) br.add_proxy_password("Username","Password") #trong trường hợp cần password và account để truy cập vào proxy
3. Cài đặt thông số trước khi access vào 1 URL br.set_handle_equiv(False) #thuộc tính HTTP-EQUIV br.set_handle_gzip(False) #có cho phép gửi dưới dạng nén không(gzip) br.set_handle_robots(False) #Tuân theo robots.txt hay không br.set_handle_referer(False) #cho phép referer br.set_handle_refresh(False) #có refresh lại 1 HTML hay không br.set_debug_redirects(True) #cho phép redirect hay không br.set_debug_http(True) #biểu thị header của HTTP
4. Thao tác open Mở (access) vào 1 URL open_URL = "http://eample.com/" br.open(open_URL)
5. Tự động điền password và Username open_URL = "http://eample.com/" br.add_password(open_URL,"Username","Password") br.open(open_URL)
6. Lấy links trong page hiện tại for link in br.links() print link Muốn lấy url thì ta có thể dùng lệnh (sử dụng cho crawler) print link.url 7. Lấy các forms trong page hiện tại for form in br.forms() print form
8. Lấy title của page hiện tại print br.title()
9. Lấy các thông tin HTML qua lệnh response response = br.response() print response.geturl() #link của page print response.info() #headers print response.read() #body
10. Lựa chọn form : select_form br.select_form(nr = 0) #chọn form thứ 0 print br.form #biểu thị form hiện tại br["name"] = "UserName" #điền các thông số cho form hiện tại br["Password"] = "UserPassword" br.submit() #gửi thông số đi
11. Quay lại page trước đó : back print br.geturl() #url của page hiện tại br.back() #quay lại print br.geturl() #url của page trước đó
12. Download 1 file về : retrieve download_URL = "http://example.com/image.gif" f = br.retrieve(download_URL)[0] print f fh = open(f)
13. Tìm link : find_link Kiểm tra 1 link xem có tồn tại hay không.
br.find_link(text="nagaokaut nlp")
14. Access vào 1 địa chỉ link : click_link req = br.click_link(text="nagaokaut nlp") br.open(req) print br.response().read() print br.geturl()
15. Cài đặt thông số timeout khi mở 1 link : Response = mechanize.urlopen(url,timeout=30.0) #timeout là 30s Ngoài ra còn 1 cách khác để thực hiện điều này là sử dụng socket có sẵn trong python : import socket socket.setdefaulttimeout(1000.0)# milisec |