Xây dựng Web Crawler cơ bản với Mechanize

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 Webiste con FB có trong trang web đó và tự động truy cập vào những Webiste con FB đó. 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:

  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 Webiste con FB. Lưu lại trong queue
  4. Lặp đi lặp lại bước 2,3 56580519 b25f 41d2 9ed1 25087693485b - Xây dựng Web Crawler cơ bản với Mechanize

Cụ thể hơn, các module quan yếu của 1 crawler:

  1. URL Frontier: chứa danh sách các URl chưa được lấy
  2. Fetch module lấy các trang web
  3. DNS resolution module xác định địa chỉ của server của trang web đã lấy
  4. Parsing module trích xuất text và Webiste con FB từ trang web đã lấy
  5. Duplicate elimination module loại bỏ các URL trùng lặp 07e69eeb 02e2 4ae6 a63d b1e8456687d4 - Xây dựng Web Crawler cơ bản với Mechanize

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 Webiste con FB. 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 kì giới hạn : Nếu server không giải đáp thì chương trình sẽ bị đóng băng. Vì thế cần xử lý trường hợp server không giải đáp sau 1 khoảng thời kì 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ở nên tiế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 cách thức đánh dấu những Webiste con FB đã 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. bên cạnh đó, có 1 cách làm nhanh hơn là sử dụng hash.

4. Các Webiste con FB khác nhau nhưng cùng chỉ 1 trang web.

chẳng thể sử dụng cách so sánh các Webiste con FB được. Vì thế phải viết thêm 1 hàm để biến đổi những Webiste con FB 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/

tức thị : với googlebot thì không được truy cập vào /cgi-bin/.

Ví dụ khác :

User-agent: *

Disallow: /

Có tức thị 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 tiêu của crawler.

2. Cài đặt User-Agent: thông tin 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#tính chất 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 Webiste con FB in br.links()

        print Webiste con FB

Muốn lấy url thì ta có thể dùng lệnh (sử dụng cho crawler)

print Webiste con FB.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() #Webiste con FB 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 Webiste con FB : find_link

    đánh giá 1 Webiste con FB xem có tồn tại hay không.

 

    br.find_link(text=“nagaokaut nlp”)

 

14. Access vào 1 địa chỉ Webiste con FB : 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 Webiste con FB :

Response = mechanize.urlopen(url,timeout=30.0) #timeout là 30s

bên cạnh đó còn 1 cách khác để thực hành đ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

Bài viết:

Facebook-egy: Xây dựng Web Crawler cơ bản với Mechanize

– Sinh ra 9 February 2019 | 5:44 am

LEAVE A REPLY

Please enter your comment!
Please enter your name here