Web crawler là gì?
Web crawler có chức năng lấy thông tin từ website , 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.
Mô hình crawler đơn giản:
- Chọn URL khởi đầu
- Sử dụng HTML protocol để lấy trang web
- Trích xuất ra các link. Lưu lại trong queue
- Lặp đi lặp lại bước 2,3
Cụ thể hơn, các module quan trọng của 1 crawler:
- URL Frontier: chứa danh sách các URl chưa được lấy
- Fetch module lấy các trang web
- DNS resolution module xác định địa chỉ của server của trang web đã lấy
- Parsing module trích xuất text và link từ trang web đã lấy
- Duplicate elimination module loại bỏ các URL trùng lặ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
Tổng hợp