Scrapy - j88bet

/imgposts/7p3w1ctl.jpg

Đối với nhiều trang web đơn giản, việc viết từng dòng mã cho một trình bò (crawler) có thể rất nhàm chán. Vì vậy, tôi đã thử sử dụng Scrapy. Những yếu tố chính mà tôi muốn đánh giá bao gồm:

  • Hiệu quả phát triển
  • Xử lý ngoại lệ
  • Cơ chế chống bị chặn (anti-ban)

Hướng dẫn sử dụng có thể tham khảo trên trang chủ scrapy.org, tài liệu được viết rất chi tiết.

sudo pip install scrapy

Trên hệ điều hành Mac OS 10.11 El Capitan, quá trình cài đặt gặp lỗi sau:

build/temp.macosx-10.10-x86_64-2.7/_openssl.c:400:10: lỗi nghiêm trọng: không tìm thấy tệp 'openssl/aes.h' Ban đầu tôi nghĩ rằng OpenSSL chưa được cài đặt và đã thử lệnh sau:

$ brew install openssl
Cảnh báo: openssl-1.0.1j đã được cài đặt

Thực tế vấn đề không nằm ở đây, mà vì Mac OS X 10.11 El Capitan đã loại bỏ các tập tin tiêu đề của OpenSSL. Giải pháp tham khảo từ bài viết về lỗi khi biên dịch Git 2.6.1 trên macOS 10.11 là thực hiện lệnh sau:

xcode-select -p 

Lệnh này sẽ in ra thư mục làm việc của Xcode, trong trường hợp của tôi là /Applications/Xcode.app/Contents/Developer. Hãy vào thư mục đó:

$ cd /Applications/Xcode.app/Contents/Developer
$ find . -name ssl.h
./Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-migrator/sdk/MacOSX.sdk/usr/include/openssl/ssl.h

Tìm đến thư mục chứa OpenSSL: j88bet

cd Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-migrator/sdk/MacOSX.sdk/usr/include/
cp -R openssl /usr/local/include/

Tại sao phải sao chép vào /usr/local/include/? Vì trong nhật ký lỗi, có nhắc đến clang sử dụng -I/usr/local/include/. Thực tế là quá trình cài đặt Scrapy vẫn chưa hoàn tất. Nếu bạn gặp lỗi ImportError khi chạy chương trình, hãy thực hiện các bước sau. Nếu không, có thể bỏ qua.

ImportError: Twisted yêu cầu zope.interface phiên bản 3.6.0 hoặc mới hơn: không tìm thấy mô-đun zope.interface.

sudo pip install zope.interface

ImportError: Không tìm thấy mô-đun named cryptography.hazmat.bindings.openssl.binding

sudo pip install [game quay hũ đổi thưởng](/blog/no-dingtalk-administrator-rights-how-to-test-certain-interface/)  pyOpenSSL==0.13

Ngoài ra, trên Ubuntu 14.04 cũng có những khó khăn nhất định, ví dụ lỗi sau:

lỗi nghiêm trọng: libxml/xmlversion.h: Không tìm thấy tệp hoặc thư mục Giải pháp là:

sudo pip uninstall scrapy
sudo apt-get install libxml2-dev libxslt1-dev python-dev

Nếu bạn đang sử dụng VPS, có khả năng gặp vấn đề về bộ nhớ không đủ:

lệnh 'x86_64-linux-gnu-gcc' thất bại với trạng thái thoát 4 Phương pháp xác định vấn đề tham khảo dmesg | tail

Ví dụ như thu thập danh ngôn từ reddit quote:

# -*- coding: utf-8 -*-
import scrapy
class RedditQuoteSpider(scrapy.Spider):
  name = 'reddit-quote'
  start_urls = ['
  def parse(self, response):
    for text in response.css('a.title::text'):
      print text.extract()

Rất đơn giản, phải không? So với sự kết hợp giữa BeautifulSoup và Requests, mã nguồn ngắn gọn hơn và giảm thiểu mã lặp lại. Khi kết hợp với vim snippets tự viết, hiệu suất phát triển tăng đáng kể.

Scrapy shell dựa trên iPython, vì vậy nên cài đặt iPython trước khi sử dụng. Một vấn đề thường gặp là gỡ lỗi selector (các phần tử cần chọn), mỗi lần sửa đổi cần phải chạy lại toàn bộ chương trình, điều này gây lãng phí thời gian do phải tải lại trang web nguyên gốc. Scrapy shell giải quyết vấn đề này. Ví dụ, nếu muốn gỡ lỗi việc thu thập từ trang sunzhongwei.com, chỉ cần thực hiện lệnh sau trong terminal:

scrapy shell " 

Bạn sẽ nhận được phản hồi như sau:

[s] Các đối tượng Scrapy có sẵn:
[s]  crawler  <scrapy.crawler.Crawler object at 0x104c6bb10>
[s]  item    {}
[s]  request  <GET  
[s]  response  <200  
[s]  settings  <scrapy.settings.Settings object at 0x104c6ba90>
[s]  spider   <DefaultSpider 'default' tại 0x10519f950>
[s] Các phím tắt hữu ích:
[s]  shelp()      Trợ giúp shell (in trợ giúp này)
[s]  fetch(req_or_url) Lấy yêu cầu (hoặc URL) và cập nhật các đối tượng cục bộ
[s]  view(response)  Xem phản hồi trong trình duyệt

Rõ ràng response là đối tượng gỡ lỗi quan trọng mà chúng ta thường xuyên sử dụng, tức là đối tượng trang web đã được thu thập. Ví dụ, nếu muốn thu thập title của trang web hiện tại:

In [11]: print response.css("title::text")[0].extract()
Elephant Notes

Ở đây tôi xin nhan dinh keo hom nay giới thiệu hai phương thức chọn nội dung trang web tích hợp sẵn trong Scrapy, còn gọi là selector:

  • css, tương tự như selector trong jQuery, tôi cảm thấy phù hợp hơn
  • xpath

Cả css và xpath đều trả về selector list. Để trích xuất danh sách unicode, cần sử dụng extract() hoặc re(). Khi chỉ cần lấy một dữ liệu, việc sử dụng extract_first() và re_first() sẽ tiện lợi hơn so với extract()[0], ít nhất là không cần xử lý ngoại lệ.

Một mẹo nhỏ, bạn có cần mở một scrapy shell mới cho mỗi trang cần gỡ lỗi không? Không cần thiết. Thực tế, bạn có thể khởi động scrapy shell mà không cần URL và cập nhật URL bên trong shell:

scrapy shell
In [4]: fetch(" 

Phương pháp lấy XPath:

Nhấp chuột phải vào nút => "Sao chép XPath" Phương pháp kiểm tra XPath:

Bạn có thể sử dụng $x trong bảng điều khiển javascript của Chrome. Không cần mở rộng.
ví dụ: $x("//img")
Cũng có thể nhập XPath vào hộp tìm kiếm trong công cụ kiểm tra web

Tham khảo Có cách nào để lấy đường dẫn XPath trong Google Chrome không? Chrome thực sự là một công cụ mạnh mẽ!

Thực tế là ví dụ Hello world có thể được tạo tự động bằng cách sau:

scrapy startproject reddit
cd reddit
scrapy genspider quote reddit.com 
cd reddit/reddit/spiders
vim quote.py

Nếu không nhớ các lệnh, không sao, chỉ cần sử dụng scrapy -h để xem hướng dẫn. Khi vào dự án, bạn sẽ thấy thêm nhiều lệnh khác.

Sau khi thiết lập USER_AGENTS, có thể thấy rõ sự thay đổi trong tiêu đề yêu cầu từ nhật ký Nginx.

112.249.229.127 - - [24/Apr/2016:17:22:53 +0800] "GET / HTTP/1.1" 200 10725 "-" "Scrapy/1.0.3 (+...
112.249.229.127 - - [24/Apr/2016:17:25:50 +0800] "GET / HTTP/1.1" 200 10725 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"

Đối với các trình bò có tần suất yêu cầu thấp, điều này là đủ. Tham khảo Làm thế nào để trình bò Scrapy của bạn không bị chặn