Cách tạo trình thu thập dữ liệu web cơ bản với Scrapy

Website truongthinh.info có bài Cách tạo trình thu thập dữ liệu web cơ bản với ScrapyViết các chương trình thu thập dữ liệu web này dễ dàng hơn bạn nghĩ. Python có một thư viện tuyệt vời để viết các script trích xuất thông tin từ những trang web. Hãy cùng xem cách tạo trình thu thập dữ liệu web bằng Scrapy qua bài viết sau đây!

Các chương trình đọc thông tin từ trang web hoặc trình thu thập dữ liệu web, có mọi thứ những kiểu ứng dụng hữu ích.

Viết các chương trình thu thập dữ liệu web này dễ dàng hơn bạn nghĩ. Python có 1 thư viện tuyệt hảo để viết các script trích xuất tin tức từ các trang web. Hãy cùng xem cách tạo trình thu thập dữ liệu web bằng Scrapy qua bài viết sau đây!

Dùng Scrapy để tạo trình thu thập dữ liệu web

  • Cài đặt Scrapy
  • Cách tạo trình thu thập dữ liệu trên web
    • Tắt tính năng ghi nhật ký
    • Sử dụng Chrome Inspector
    • Trích xuất tiêu đề
    • Tìm miêu tả
  • Thu thập dữ liệu JSON
  • Khai thác nhiều yếu tố

Cài đặt Scrapy

Scrapy là một thư viện Python được tạo nên để quét và xây dựng các trình thu thập dữ liệu web. Nó nhanh chóng, đơn giản và có thể điều phối qua một số trang web mà không mất không ít công sức.

Scrapy có sẵn thông qua thư viện Pip Installs Python (PIP). Để biết phương pháp cài đặt PIP, vui lòng tham khảo bài viết: Cài đặt Python Package với PIP trên Windows, Mac và Linux.

Sử dụng môi trường ảo Python được ưu tiên vì nó sẽ cấp phép bạn cài đặt Scrapy trong 1 thư mục ảo và giữ nguyên các file hệ thống. Tài liệu về Scrapy khuyên bạn nên làm điều này để có kết quả tốt nhất.

Tạo thư mục và tái tạo một môi trường ảo.

  mkdir crawler cd crawler virtualenv venv. venv/bin/activate  

Bây giờ, bạn có thể cài đặt Scrapy vào thư mục đó bằng lệnh PIP.

  pip install scrapy  

Kiểm tra nhanh để đảm bảo Scrapy được cài đặt đúng cách:

  scrapy # prints Scrapy 1.4.0 - no active project Usage: scrapy [options] [args] Available commands: bench Run quick benchmark test fetch Fetch a URL using the Scrapy downloader genspider Generate new spider using pre-defined templates runspider Run a self-contained spider (without creating a project). ..  
Scrapy
Scrapy

Cách tạo trình thu thập dữ liệu trên web

Bây giờ, môi trường đã sẵn sàng, bạn có thể bắt đầu tạo trình thu thập dữ liệu web. Hãy khai thác một số tin tức từ trang Wikipedia về pin:

  https://en.wikipedia.org/wiki/Battery_(electricity)  

Bước đầu tiên để viết trình thu thập thông tin là xác định lớp Python mở rộng từ Scrapy.Spider. Điều này cấp phép bạn truy cập vào tất cả các chức năng trong Scrapy. Hãy gọi lớp này là spider1.

Lớp spider cần một vài thông tin:

  • Tên ( name ) để định vị spider
  • Biến start_urls chứa bản kê các URL cần thu thập dữ liệu (URL Wikipedia sẽ là thí dụ trong hướng dẫn này)
  • Phương thức parse() được dùng làm giải quyết trang web và trích xuất thông tin.
  import scrapy class spider1(scrapy.Spider): name = 'Wikipedia' start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)'] def parse(self, response): pass  

Một thử nghiệm nhanh để đáp ứng tất cả đang chạy đúng.

  scrapy runspider spider1.py # prints 2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot) 2017-11-23 09:09:21 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True} 2017-11-23 09:09:21 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.memusage.MemoryUsage', 'scrapy.extensions.logstats.LogStats',  

Tắt tính năng ghi nhật ký

Chạy Scrapy với lớp này xuất tin tức nhật ký sẽ không hỗ trợ ích gì ở thời điểm hiện tại. Hãy khiến cho mọi thứ dễ dàng bằng cách loại bỏ thông tin nhật ký dư thừa này. Thêm code sau vào đầu file.

  import logging logging.getLogger('scrapy').setLevel(logging.WARNING)  

Bây giờ khi bạn chạy lại script, tin tức nhật ký sẽ không được in.

Sử dụng Chrome Inspector

Mọi thứ trên một trang web được lưu giữ trong số nhân tố HTML. Các thành phần được sắp xếp trong Document Object Model (DOM). Việc hiểu rõ về DOM rất quan trọng để tận dụng nhiều nhất trình thu thập dữ liệu web. Trình thu thập dữ liệu web tìm kiếm thông qua mọi thứ các thành phần HTML trên một trang để tìm thông tin, vì thế việc hiểu cách chúng được sắp xếp là rất quan trọng.

Google Chrome có những công cụ giúp bạn tìm các thành phần HTML nhanh hơn. Bạn có thể định vị vị trí trong HTML cho bất kỳ yếu tố nào mình thấy trên trang web bằng inspector (trình kiểm tra).

  • Điều hướng đến một trang trong Chrome
  • Đặt chuột vào phần tử bạn mong muốn xem
  • Nhấp chuột phải và chọn Inspect từ menu

Các bước này sẽ mở bảng điều khiển dành riêng cho nhà phát triển với tab Elements được chọn. Ở dưới cùng của giao diện điều khiển, bạn sẽ thấy một sơ đồ cây chứa các yếu tố. Sơ đồ cây này là cách bạn sẽ thu được thông tin cho script.

Trích xuất tiêu đề

Hãy sử dụng script để thực hiện một số công việc. Thu thập tin tức đơn giản để thực hành được được văn bản tiêu đề của trang web.

Bắt đầu script bằng phương pháp thêm một số code vào phương thức parse() để trích xuất tiêu đề.

 . .. def parse(self, response): print response.css('h1#firstHeading::text').extract(). ..  

Đối số response hỗ trợ một phương thức xem là CSS() chọn các phần tử từ trang bằng cách dùng vị trí bạn cung cấp.

Trong ví dụ này, phần tử là h1.firstHeading. Thêm ::text vào script là những gì cần để cung cấp cho bạn nội dung của phần tử. Cuối cùng, phương thức extract() trả về thành phần đã chọn.

Chạy script này trong Scrapy để xuất tiêu đề ở dạng văn bản.

  [u'Battery (electricity)']  

Tìm mô tả

Bây giờ, ta đã khai thác được phần văn bản tiêu đề. Hãy làm nhiều thứ hơn với script. Trình thu thập thông tin sẽ tìm đoạn đầu tiên sau tiêu đề và trích xuất thông tin này.

Đây là sơ đồ cây nhân tố trong Chrome Developer Console:

  div#mw-content-text> div> p  

Mũi tên phải ( > ) biểu thị mối liên hệ cha – con giữa các yếu tố. Vị trí này sẽ trả về tất cả các thành phần p phù hợp, cho dù là toàn bộ mô tả. Để có được thành phần p đầu tiên, bạn cũng có thể có thể viết code này:

  response.css('div#mw-content-text> div> p')[0]  

Giống như tiêu đề, bạn thêm ::text để lấy nội dung văn bản của phần tử.

  response.css('div#mw-content-text> div> p')[0].css('::text')  

Biểu thức cuối cùng sử dụng extract() để trả về danh sách. Bạn cũng có thể có thể sử dụng hàm Python join() để ghép nối bản kê sau khi quá trình thu thập tin tức hoàn tất.

  def parse(self, response): print ''.join(response.css('div#mw-content-text> div> p')[0].css('::text').extract())  

Kết quả là đoạn đầu tiên của phần văn bản!

  An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is. ..  

Thu thập dữ liệu JSON

Scrapy có thể trích xuất thông tin dưới dạng văn bản, rất hữu ích. Scrapy cũng cho phép bạn xem dữ liệu JavaScript Object Notation (JSON). JSON là 1 cách chỉn chu để sắp xếp tin tức và được dùng rộng rãi trong phát triển web. JSON cũng hoạt động khá độc đáo với Python.

Khi cần thu thập dữ liệu dưới dạng JSON, bạn có thể sử dụng câu lệnh yield được tích hợp trong Scrapy.

Ở đây, một phiên bản mới của script sử dụng câu lệnh yield. Thay vì lấy phần tử p trước mắt ở định dạng văn bản, câu lệnh này sẽ lấy ra mọi thứ các thành phần p và bố trí nó theo định dạng JSON.

 . .. def parse(self, response): for e in response.css('div#mw-content-text> div> p'): yield { 'para' : ''.join(e.css('::text').extract()).strip() }. ..  

Bây giờ, bạn cũng có thể có thể chạy spider bằng cách chỉ định file JSON đầu ra:

  scrapy runspider spider3.py -o joe.json  

Script bây giờ sẽ xuất ra mọi thứ các thành phần p .

  [ {"para": "An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is the cathode and its negative terminal is the anode.[2] The terminal marked negative is the source of electrons that when connected to an external circuit will flow and deliver energy to an external device. When a battery is connected to an external circuit, electrolytes are able to move as ions within, allowing the chemical reactions to be completed at the separate terminals and so deliver energy to the external circuit. It is the movement of those ions within the battery which allows current to flow out of the battery to perform work.[3] Historically the term "battery" specifically referred to a device composed of multiple cells, however the usage has evolved additionally to include devices composed of a single cell.[4]"}, {"para": "Primary (single-use or "disposable") batteries are used once and discarded; the electrode materials are irreversibly changed during discharge. Common examples are the alkaline battery used for flashlights and a multitude of portable electronic devices. Secondary (rechargeable) batteries can be discharged and recharged multiple. ..  

Khai thác nhiều yếu tố

Cho đến nay, trình thu thập dữ liệu web đã khai thác được tiêu đề cùng một loại yếu tố từ trang. Scrapy cũng cũng đều có thể trích xuất thông tin từ những dòng yếu tố khác nhau trong 1 script.

Hãy để trích xuất các bản hit IMDb Box Office hàng đầu cho ngày cuối tuần. Thông tin này được lấy từ http://www.imdb.com/chart/boxoffice , trong 1 bảng có các hàng cho từng số liệu.

Phương thức parse() cũng có thể trích xuất nhiều trường từ hàng. Sử dụng Chrome Developer Tools, bạn cũng có thể tìm thấy các yếu tố được lồng trong bảng.

 . .. def parse(self, response): for e in response.css('div#boxoffice> table> tbody> tr'): yield { 'title': ''.join(e.css('td.titleColumn> a::text').extract()).strip(), 'weekend': ''.join(e.css('td.ratingColumn')[0].css('::text').extract()).strip(), 'gross': ''.join(e.css('td.ratingColumn')[1].css('span.secondaryInfo::text').extract()).strip(), 'weeks': ''.join(e.css('td.weeksColumn::text').extract()).strip(), 'image': e.css('td.posterColumn img::attr(src)').extract_first(), }. ..  

Selector image định vị rằng img là descendant (hậu duệ) của td.posterColumn. Để trích xuất tính chất đúng, sử dụng biểu thức :: attr(src).

Chạy spider trả về JSON:

  [ {"gross": "$93.8M", "weeks": "1", "weekend": "$93.8M", "image": "https://images-na.ssl-images-amazon.com/images/M/MV5BYWVhZjZkYTItOGIwYS00NmRkLWJlYjctMWM0ZjFmMDU4ZjEzXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_UY67_CR0,0,45,67_AL_.jpg", "title": "Justice League"}, {"gross": "$27.5M", "weeks": "1", "weekend": "$27.5M", "image": "https://images-na.ssl-images-amazon.com/images/M/MV5BYjFhOWY0OTgtNDkzMC00YWJkLTk1NGEtYWUxNjhmMmQ5ZjYyXkEyXkFqcGdeQXVyMjMxOTE0ODA@._V1_UX45_CR0,0,45,67_AL_.jpg", "title": "Wonder"}, {"gross": "$247.3M", "weeks": "3", "weekend": "$21.7M", "image": "https://images-na.ssl-images-amazon.com/images/M/MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI@._V1_UY67_CR0,0,45,67_AL_.jpg", "title": "Thor: Ragnarok"},. .. ]  

Từ khóa bài viết: truongthinh.info, Scrapy, thu thập dữ liệu web, tạo trình thu thập dữ liệu web, tạo trình thu thập dữ liệu web với scrapy, tạo trình thu thập dữ liệu web cơ bản, cài đặt scrapy

Bài viết Cách tạo trình thu thập dữ liệu web cơ bản với Scrapy được tổng hợp và biên tập bởi: truongthinh.info. Mọi ý kiến đóng góp và phản hồi vui lòng gửi Liên Hệ cho truongthinh.info để điều chỉnh. truongthinh.info xin cảm ơn.