Crawler

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ônggzip

    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


Comments