
1. Link tải xuống trực tiếp
LINK TẢI GG DRIVE: LINK TẢI 1
LINK TẢI GG DRIVE: LINK TẢI 2
LINK TẢI GG DRIVE: LINK DỰ PHÒNG
Các chương trình đọc thông tin từ các trang web hoặc trình thu thập thông tin web có tất cả các loại cô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ó một thư viện tuyệt vời để viết script trích xuất thông tin từ các trang web. Bài viết dưới đây hướng dẫn bạn cách sử dụng Scrapy để tạo trình thu thập thông tin web.
Sử dụng phế liệu để tạo trình thu thập thông tin web
Cài đặt Scrapy
Scrapy là một thư viện Python được thiết kế để quét và xây dựng trình thu thập dữ liệu web. Nó nhanh chóng, dễ dàng và có thể điều hướng qua nhiều trang web một cách dễ dàng.
Scrapy có sẵn thông qua thư viện Pip Installs Python (PIP). Để biết thông tin về cách cài đặt PIP, hãy xem bài viết: Cài đặt Gói Python với PIP trên Windows, Mac và Linux.
Việc sử dụng môi trường ảo Python là một ưu tiên vì nó cho phép bạn cài đặt Scrapy trong một thư mục ảo và giữ nguyên các tệp hệ thống. Tài liệu Trị liệu 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ạo 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 trong thư mục này 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 <command> [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)
...

Cách tạo trình thu thập thông tin web
Sau khi môi trường đã sẵn sàng, bạn có thể bắt đầu xây dựng trình thu thập thông tin web. Có một số thông tin về pin trên trang Wikipedia:
https://en.wikipedia.org/wiki/Battery_(electricity)
Bước đầu tiên khi viết trình thu thập thông tin là xác định lớp Python mà từ đó nó sẽ mở rộng Scrapy.Spider. Điều này cho phép bạn truy cập vào tất cả các tính năng trong Scrapy. Hãy gọi lớp này con nhện1.
Lớp nhện cần một số thông tin:
- Họ (Họ) để xác định con nhện
- ngoài start_urls chứa danh sách các URL sẽ được thu thập thông tin (URL Wikipedia là một ví dụ trong hướng dẫn này).
- phương pháp phân tích cú pháp () Được sử dụng để xử lý 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 bài kiểm tra nhanh để đảm bảo mọi thứ diễn ra đúng như ý muốn.
Scrapy Runspider spider1.py # in 2017-11-23 09:09:21 [scrapy.utils.log] THÔNG TIN: Scrapy 1.4.0 đã được bắt đầu (Bot: Scrapybot) 2017-11-23 09:09:21 [scrapy.utils.log] THÔNG TIN: Cài đặt bị ghi đè: {'SPIDER_LOADER_WARN_ONLY': True} 2017-11-23 09:09:21 [scrapy.middleware] THÔNG TIN: Các phần mở rộng đã kích hoạt: ['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 thông tin nhật ký sẽ không giúp ích gì ở thời điểm hiện tại. Hãy làm cho mọi thứ đơn giản 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, thông tin 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 trữ trong các yếu tố HTML. Các phần tử đượ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 tối đa 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 tất cả các thành phần HTML trên một trang để tìm thông tin, vì vậy 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 phần tử 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 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 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ẽ nhận đượ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 thông tin đơn giản để có được văn bản tiêu đề của trang web.
Bắt đầu script bằng cách 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 gọi là CSS() chọn các thành phần từ trang bằng cách sử 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ề phần tử đã 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ờ chúng tôi đã tận dụng lợi thế của văn bản tiêu đề. Hãy làm nhiều hơn với script. Trình thu thập thông tin 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 mục trong Bảng điều khiển dành cho nhà phát triển Chrome:
div#mw-content-text>div>p
Mũi tên bên phải (>) biểu thị mối quan hệ cha-con giữa các phần tử. Vị trí này trả về tất cả các phần tử p Phù hợp, đưa ra mô tả đầy đủ. Nhận phần tử p Đầu tiên bạn có thể viết mã này:
response.css('div#mw-content-text>div>p')[0]
Như với tiêu đề, 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 được sử dụng gần đây nhất Trích xuất () để trả lại danh sách. Bạn có thể sử dụng hàm python tham gia () để tham gia danh sách sau khi thu thập thông tin 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 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, điều này rất hữu ích. Bạn cũng có thể sử dụng Scrapy để xem dữ liệu JavaScript Object Notation (JSON). JSON là một cách tuyệt vời để tổ chức thông tin và được sử dụng rộng rãi trong phát triển web. JSON cũng hoạt động rất tốt với Python.
Nếu bạn cần nắm bắt dữ liệu dưới dạng JSON, bạn có thể sử dụng câu lệnh năng suất tích hợp vào Scrapy.
Đây là phiên bản mới của tập lệnh sử dụng lệnh Năng suất. Thay vì nhận vật phẩm p Lệnh này đầu tiên nhận tất cả các phần tử ở định dạng văn bản p và ánh xạ nó ở đị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ó thể chạy con nhện bằng cách chỉ định tệp JSON Đầu ra:
scrapy runspider spider3.py -o joe.json
Tập lệnh hiện xuất tất cả các phần tử 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
...
Tận dụng nhiều yếu tố
Cho đến nay, trình thu thập dữ liệu web đã khai thác tiêu đề và một số loại yếu tố của trang. Scrapy cũng có thể trích xuất thông tin từ các loại phần tử khác nhau trong một tập lệnh.
Chúng ta hãy trích xuất các bản hit IMDb Box Office hay nhất vào cuối tuần. Thông tin này đến từ http://www.imdb.com/chart/boxofficeTrong bảng có các hàng cho mỗi số liệu.
phương pháp phân tích cú pháp () có thể trích xuất nhiều trường từ hàng. Bạn có thể tìm thấy các phần tử lồng nhau trong bảng bằng Công cụ dành cho nhà phát triển Chrome.
...
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(),
}
...
Người bỏ phiếu hình ảnh nhận thấy, điều đó img là hậu duệ của td.posterColumn. Sử dụng một biểu thức để trích xuất thuộc tính chính xác :: ::attr (src).
Running 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"},
...
]