Trị liệu - Hướng dẫn nhanh

Scrapy là một khung thu thập dữ liệu web mã nguồn mở, nhanh chóng được viết bằng Python, được sử dụng để trích xuất dữ liệu từ trang web với sự trợ giúp của các bộ chọn dựa trên XPath.

Scrapy được phát hành lần đầu tiên vào ngày 26 tháng 6 năm 2008 được cấp phép theo BSD, với mốc 1.0 phát hành vào tháng 6 năm 2015.

Tại sao sử dụng Scrapy?

  • Dễ dàng hơn để xây dựng và mở rộng các dự án thu thập thông tin lớn.

  • Nó có một cơ chế tích hợp được gọi là Bộ chọn, để trích xuất dữ liệu từ các trang web.

  • Nó xử lý các yêu cầu một cách không đồng bộ và nó rất nhanh.

  • Nó tự động điều chỉnh tốc độ thu thập thông tin bằng cách sử dụng cơ chế Tự động điều chỉnh .

  • Đảm bảo khả năng tiếp cận của nhà phát triển.

Đặc điểm của Trị liệu

  • Scrapy là một mã nguồn mở và miễn phí để sử dụng khung thu thập thông tin web.

  • Scrapy tạo xuất nguồn cấp dữ liệu ở các định dạng như JSON, CSV và XML.

  • Scrapy có hỗ trợ tích hợp để chọn và trích xuất dữ liệu từ các nguồn bằng biểu thức XPath hoặc CSS.

  • Scrapy dựa trên trình thu thập thông tin, cho phép trích xuất dữ liệu từ các trang web một cách tự động.

Ưu điểm

  • Liệu pháp có thể dễ dàng mở rộng, nhanh chóng và mạnh mẽ.

  • Nó là một khung ứng dụng đa nền tảng (Windows, Linux, Mac OS và BSD).

  • Yêu cầu trị liệu được lập lịch và xử lý không đồng bộ.

  • Trị liệu đi kèm với dịch vụ tích hợp có tên là Scrapyd cho phép tải lên các dự án và kiểm soát các trình thu thập thông tin bằng cách sử dụng dịch vụ web JSON.

  • Có thể loại bỏ bất kỳ trang web nào, mặc dù trang web đó không có API để truy cập dữ liệu thô.

Nhược điểm

  • Scrapy chỉ dành cho Python 2.7. +

  • Cài đặt khác nhau đối với các hệ điều hành khác nhau.

Trong chương này, chúng ta sẽ thảo luận về cách cài đặt và thiết lập Scrapy. Scrapy phải được cài đặt bằng Python.

Scrapy có thể được cài đặt bằng cách sử dụng pip. Để cài đặt, hãy chạy lệnh sau:

pip install Scrapy

các cửa sổ

Note - Python 3 không được hỗ trợ trên hệ điều hành Windows.

Step 1- Cài đặt Python 2.7 từ Python

Đặt các biến môi trường bằng cách thêm các đường dẫn sau vào PATH:

C:\Python27\;C:\Python27\Scripts\;

Bạn có thể kiểm tra phiên bản Python bằng lệnh sau:

python --version

Step 2- Cài đặt OpenSSL .

Thêm C: \ OpenSSL-Win32 \ bin vào các biến môi trường của bạn.

Note - OpenSSL được cài đặt sẵn trong tất cả các hệ điều hành ngoại trừ Windows.

Step 3- Cài đặt Visual C ++ 2008 redistributables.

Step 4- Cài đặt pywin32 .

Step 5- Cài đặt pip cho các phiên bản Python cũ hơn 2.7.9.

Bạn có thể kiểm tra phiên bản pip bằng lệnh sau:

pip --version

Step 6 - Để cài đặt scrapy, hãy chạy lệnh sau:

pip install Scrapy

Anaconda

Nếu bạn đã cài đặt anaconda hoặc miniconda trên máy của mình, hãy chạy lệnh dưới đây để cài đặt Scrapy bằng conda -

conda install -c scrapinghub scrapy

Công ty Scrapinghub hỗ trợ các gói conda chính thức cho Linux, Windows và OS X.

Note - Bạn nên cài đặt Scrapy bằng lệnh trên nếu bạn gặp sự cố khi cài đặt qua pip.

Ubuntu 9.10 trở lên

Phiên bản Python mới nhất được cài đặt sẵn trên hệ điều hành Ubuntu. Sử dụng các gói Ubuntu apthesia do Scrapinghub cung cấp. Để sử dụng các gói -

Step 1 - Bạn cần nhập khóa GPG được sử dụng để ký các gói Scrapy vào khóa APT -

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 627220E7

Step 2 - Tiếp theo, sử dụng lệnh sau để tạo tệp /etc/apt/sources.list.d/scrapy.list -

echo 'deb http://archive.scrapy.org/ubuntu scrapy main' | sudo tee 
/etc/apt/sources.list.d/scrapy.list

Step 3 - Cập nhật danh sách gói và cài đặt liệu pháp -

sudo apt-get update && sudo apt-get install scrapy

Archlinux

Bạn có thể cài đặt Scrapy từ gói AUR Scrapy bằng lệnh sau:

yaourt -S scrapy

Mac OS X

Sử dụng lệnh sau để cài đặt các công cụ dòng lệnh Xcode:

xcode-select --install

Thay vì sử dụng Python hệ thống, hãy cài đặt phiên bản cập nhật mới không xung đột với phần còn lại của hệ thống của bạn.

Step 1- Cài đặt homebrew .

Step 2 - Đặt biến PATH môi trường để chỉ định rằng các gói homebrew nên được sử dụng trước các gói hệ thống -

echo "export PATH = /usr/local/bin:/usr/local/sbin:$PATH" >> ~/.bashrc

Step 3 - Để đảm bảo các thay đổi được thực hiện, hãy tải lại .bashrc sử dụng lệnh sau:

source ~/.bashrc

Step 4 - Tiếp theo, cài đặt Python bằng lệnh sau:

brew install python

Step 5 - Cài đặt Scrapy bằng lệnh sau:

pip install Scrapy

Sự miêu tả

Công cụ dòng lệnh Scrapy được sử dụng để kiểm soát Scrapy, thường được gọi là 'Scrapy tool'. Nó bao gồm các lệnh cho các đối tượng khác nhau với một nhóm các đối số và tùy chọn.

Thiết lập cấu hình

Scrapy sẽ tìm cài đặt cấu hình trong scrapy.cfgtập tin. Sau đây là một số địa điểm -

  • C: \ scrapy (thư mục dự án) \ scrapy.cfg trong hệ thống

  • ~ / .config / scrapy.cfg ($ XDG_CONFIG_HOME) và ~ / .scrapy.cfg ($ HOME) cho cài đặt chung

  • Bạn có thể tìm thấy scrapy.cfg bên trong thư mục gốc của dự án.

Scrapy cũng có thể được định cấu hình bằng các biến môi trường sau:

  • SCRAPY_SETTINGS_MODULE
  • SCRAPY_PROJECT
  • SCRAPY_PYTHON_SHELL

Dự án trị liệu cấu trúc mặc định

Cấu trúc sau đây cho thấy cấu trúc tệp mặc định của dự án Scrapy.

scrapy.cfg                - Deploy the configuration file
project_name/             - Name of the project
   _init_.py
   items.py               - It is project's items file
   pipelines.py           - It is project's pipelines file
   settings.py            - It is project's settings file
   spiders                - It is the spiders directory
      _init_.py
      spider_name.py
      . . .

Các scrapy.cfgtệp là thư mục gốc của dự án, bao gồm tên dự án cùng với cài đặt dự án. Ví dụ -

[settings] 
default = [name of the project].settings  

[deploy] 
#url = http://localhost:6800/ 
project = [name of the project]

Sử dụng công cụ trị liệu

Công cụ trị liệu cung cấp một số cách sử dụng và các lệnh có sẵn như sau:

Scrapy X.Y  - no active project 
Usage: 
   scrapy  [options] [arguments] 
Available commands: 
   crawl      It puts spider (handle the URL) to work for crawling data 
   fetch      It fetches the response from the given URL

Tạo một dự án

Bạn có thể sử dụng lệnh sau để tạo dự án trong Scrapy:

scrapy startproject project_name

Điều này sẽ tạo ra dự án có tên project_namedanh mục. Tiếp theo, chuyển đến dự án mới được tạo, sử dụng lệnh sau:

cd  project_name

Kiểm soát dự án

Bạn có thể kiểm soát dự án và quản lý chúng bằng công cụ Scrapy và cũng có thể tạo nhện mới, sử dụng lệnh sau:

scrapy genspider mydomain mydomain.com

Các lệnh như thu thập thông tin, v.v. phải được sử dụng bên trong dự án Scrapy. Bạn sẽ biết những lệnh nào phải chạy bên trong dự án Scrapy trong phần tới.

Scrapy chứa một số lệnh cài sẵn, có thể được sử dụng cho dự án của bạn. Để xem danh sách các lệnh có sẵn, hãy sử dụng lệnh sau:

scrapy -h

Khi bạn chạy lệnh sau, Scrapy sẽ hiển thị danh sách các lệnh có sẵn như được liệt kê:

  • fetch - Nó tìm nạp URL bằng trình tải xuống Scrapy.

  • runspider - Nó được sử dụng để chạy Spider khép kín mà không cần tạo dự án.

  • settings - Nó chỉ định giá trị cài đặt dự án.

  • shell - Nó là một mô-đun cạo tương tác cho URL đã cho.

  • startproject - Nó tạo ra một dự án Scrapy mới.

  • version - Nó hiển thị phiên bản Scrapy.

  • view - Nó tìm nạp URL bằng trình tải xuống Scrapy và hiển thị nội dung trong trình duyệt.

Bạn có thể có một số lệnh liên quan đến dự án như được liệt kê -

  • crawl - Nó được sử dụng để thu thập dữ liệu bằng cách sử dụng spider.

  • check - Nó kiểm tra các mục được trả về bởi lệnh được thu thập thông tin.

  • list - Nó hiển thị danh sách các nhện có sẵn trong dự án.

  • edit - Bạn có thể chỉnh sửa nhện bằng cách sử dụng trình chỉnh sửa.

  • parse - Nó phân tích cú pháp URL đã cho với con nhện.

  • bench - Nó được sử dụng để chạy kiểm tra điểm chuẩn nhanh (Điểm chuẩn cho biết số lượng trang có thể được thu thập thông tin mỗi phút bởi Scrapy).

Lệnh dự án tùy chỉnh

Bạn có thể tạo một lệnh dự án tùy chỉnh với COMMANDS_MODULEthiết lập trong dự án Scrapy. Nó bao gồm một chuỗi trống mặc định trong cài đặt. Bạn có thể thêm lệnh tùy chỉnh sau:

COMMANDS_MODULE = 'mycmd.commands'

Có thể thêm lệnh trị liệu bằng cách sử dụng phần scrapy.commands trong tệp setup.py được hiển thị như sau:

from setuptools import setup, find_packages  

setup(name = 'scrapy-module_demo', 
   entry_points = { 
      'scrapy.commands': [ 
         'cmd_demo = my_module.commands:CmdDemo', 
      ], 
   }, 
)

Đoạn mã trên cho biết thêm cmd_demo lệnh trong setup.py tập tin.

Sự miêu tả

Spider là một lớp chịu trách nhiệm xác định cách theo các liên kết thông qua một trang web và trích xuất thông tin từ các trang.

Các trình thu thập thông tin mặc định của Scrapy như sau:

vật liệu trị liệu.

Nó là một con nhện mà mọi con nhện khác phải kế thừa. Nó có lớp sau:

class scrapy.spiders.Spider

Bảng sau đây cho thấy các trường của lớp scrapy.

Sr.No Trường & Mô tả
1

name

Nó là tên của con nhện của bạn.

2

allowed_domains

Đây là danh sách các miền mà con nhện thu thập thông tin.

3

start_urls

Đó là danh sách các URL, sẽ là gốc rễ cho các lần thu thập dữ liệu sau này, nơi con nhện sẽ bắt đầu thu thập dữ liệu từ đó.

4

custom_settings

Đây là những cài đặt, khi chạy spider, sẽ được ghi đè khỏi cấu hình toàn dự án.

5

crawler

Nó là một thuộc tính liên kết đến đối tượng Crawler mà đối tượng spider được ràng buộc.

6

settings

Đây là những cài đặt để chạy một con nhện.

7

logger

Nó là một trình ghi nhật ký Python được sử dụng để gửi thông báo nhật ký.

số 8

from_crawler(crawler,*args,**kwargs)

Nó là một phương thức lớp, tạo ra con nhện của bạn. Các thông số là -

  • crawler - Một trình thu thập thông tin mà phiên bản nhện sẽ bị ràng buộc.

  • args(list)- Các đối số này được truyền cho phương thức _init_ () .

  • kwargs(dict)- Các đối số từ khóa này được truyền cho phương thức _init_ () .

9

start_requests()

Khi không có URL cụ thể nào được chỉ định và con nhện được mở để loại bỏ, Scrapy sẽ gọi phương thức start_requests () .

10

make_requests_from_url(url)

Nó là một phương pháp được sử dụng để chuyển đổi url thành yêu cầu.

11

parse(response)

Phương pháp này xử lý phản hồi và trả về dữ liệu đã loại bỏ theo các URL khác.

12

log(message[,level,component])

Nó là một phương pháp gửi thông báo nhật ký thông qua trình ghi nhật ký nhện.

13

closed(reason)

Phương thức này được gọi khi spider đóng lại.

Đối số Spider

Đối số Spider được sử dụng để chỉ định URL bắt đầu và được chuyển bằng lệnh thu thập thông tin với -a tùy chọn, được hiển thị như sau:

scrapy crawl first_scrapy -a group = accessories

Đoạn mã sau minh họa cách một con nhện nhận các đối số:

import scrapy 

class FirstSpider(scrapy.Spider): 
   name = "first" 
   
   def __init__(self, group = None, *args, **kwargs): 
      super(FirstSpider, self).__init__(*args, **kwargs) 
      self.start_urls = ["http://www.example.com/group/%s" % group]

Nhện chung

Bạn có thể sử dụng các trình thu thập thông tin chung để phân loại các trình thu thập dữ liệu của mình. Mục đích của họ là theo dõi tất cả các liên kết trên trang web dựa trên các quy tắc nhất định để trích xuất dữ liệu từ tất cả các trang.

Đối với các ví dụ được sử dụng trong các trình thu thập thông tin sau, hãy giả sử chúng ta có một dự án với các trường sau:

import scrapy 
from scrapy.item import Item, Field 
  
class First_scrapyItem(scrapy.Item): 
   product_title = Field() 
   product_link = Field() 
   product_description = Field()

CrawlSpider

CrawlSpider xác định một tập hợp các quy tắc để tuân theo các liên kết và loại bỏ nhiều hơn một trang. Nó có lớp sau:

class scrapy.spiders.CrawlSpider

Sau đây là các thuộc tính của lớp CrawlSpider:

quy tắc

Đây là danh sách các đối tượng quy tắc xác định cách trình thu thập thông tin theo liên kết.

Bảng sau đây cho thấy các quy tắc của lớp CrawlSpider:

Sr.No Quy tắc & Mô tả
1

LinkExtractor

Nó chỉ định cách spider theo các liên kết và trích xuất dữ liệu.

2

callback

Nó sẽ được gọi sau mỗi trang được cạo.

3

follow

Nó chỉ định có tiếp tục theo các liên kết hay không.

parse_start_url (phản hồi)

Nó trả về một trong hai mục hoặc đối tượng yêu cầu bằng cách cho phép phân tích cú pháp các phản hồi ban đầu.

Note - Đảm bảo rằng bạn đổi tên hàm phân tích cú pháp khác với phân tích cú pháp trong khi viết các quy tắc vì hàm phân tích cú pháp được CrawlSpider sử dụng để triển khai logic của nó.

Hãy xem ví dụ sau, nơi spider bắt đầu thu thập dữ liệu trang chủ của demoexample.com, thu thập tất cả các trang, liên kết và phân tích cú pháp bằng phương thức parse_items -

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class DemoSpider(CrawlSpider):
   name = "demo"
   allowed_domains = ["www.demoexample.com"]
   start_urls = ["http://www.demoexample.com"]
      
   rules = ( 
      Rule(LinkExtractor(allow =(), restrict_xpaths = ("//div[@class = 'next']",)),
         callback = "parse_item", follow = True),
   )
   
   def parse_item(self, response):
      item = DemoItem()
      item["product_title"] = response.xpath("a/text()").extract()
      item["product_link"] = response.xpath("a/@href").extract()
      item["product_description"] = response.xpath("div[@class = 'desc']/text()").extract()
      return items

XMLFeedSpider

Đây là lớp cơ sở cho các trình thu thập dữ liệu thu thập dữ liệu từ các nguồn cấp dữ liệu XML và lặp qua các nút. Nó có lớp sau:

class scrapy.spiders.XMLFeedSpider

Bảng sau đây cho thấy các thuộc tính lớp được sử dụng để đặt một trình lặp và tên thẻ:

Sr.No Thuộc tính & Mô tả
1

iterator

Nó xác định trình lặp sẽ được sử dụng. Nó có thể là iternodes, html hoặc xml . Mặc định là iternodes .

2

itertag

Nó là một chuỗi có tên nút để lặp.

3

namespaces

Nó được định nghĩa bằng danh sách các bộ giá trị (prefix, uri) tự động đăng ký không gian tên bằng phương thức register_namespace () .

4

adapt_response(response)

Nó nhận được phản hồi và sửa đổi phần thân phản hồi ngay khi nó đến từ phần mềm trung gian của spider, trước khi spider bắt đầu phân tích nó.

5

parse_node(response,selector)

Nó nhận phản hồi và một bộ chọn khi được gọi cho mỗi nút phù hợp với tên thẻ được cung cấp.

Note - Spider của bạn sẽ không hoạt động nếu bạn không ghi đè phương thức này.

6

process_results(response,results)

Nó trả về một danh sách các kết quả và phản hồi do con nhện trả về.

CSVFeedSpider

Nó lặp qua từng hàng của nó, nhận tệp CSV dưới dạng phản hồi và gọi phương thức parse_row () . Nó có lớp sau:

class scrapy.spiders.CSVFeedSpider

Bảng sau đây cho thấy các tùy chọn có thể được đặt liên quan đến tệp CSV:

Sr.No Tùy chọn & Mô tả
1

delimiter

Nó là một chuỗi chứa dấu phân cách bằng dấu phẩy (',') cho mỗi trường.

2

quotechar

Nó là một chuỗi chứa dấu ngoặc kép ('"') cho mỗi trường.

3

headers

Nó là một danh sách các câu lệnh mà từ đó các trường có thể được trích xuất.

4

parse_row(response,row)

Nó nhận được một phản hồi và mỗi hàng cùng với một khóa cho tiêu đề.

Ví dụ về CSVFeedSpider

from scrapy.spiders import CSVFeedSpider
from demoproject.items import DemoItem  

class DemoSpider(CSVFeedSpider): 
   name = "demo" 
   allowed_domains = ["www.demoexample.com"] 
   start_urls = ["http://www.demoexample.com/feed.csv"] 
   delimiter = ";" 
   quotechar = "'" 
   headers = ["product_title", "product_link", "product_description"]  
   
   def parse_row(self, response, row): 
      self.logger.info("This is row: %r", row)  
      item = DemoItem() 
      item["product_title"] = row["product_title"] 
      item["product_link"] = row["product_link"] 
      item["product_description"] = row["product_description"] 
      return item

SitemapSpider

SitemapSpider với sự trợ giúp của Sơ đồ trang web thu thập thông tin một trang web bằng cách định vị URL từ robots.txt. Nó có lớp sau:

class scrapy.spiders.SitemapSpider

Bảng sau đây cho thấy các trường của SitemapSpider:

Sr.No Trường & Mô tả
1

sitemap_urls

Danh sách các URL mà bạn muốn thu thập thông tin trỏ đến các sơ đồ trang web.

2

sitemap_rules

Nó là một danh sách các bộ giá trị (regex, callback), trong đó regex là một biểu thức chính quy và callback được sử dụng để xử lý các URL khớp với một biểu thức chính quy.

3

sitemap_follow

Đây là danh sách các regex của sơ đồ trang web cần theo dõi.

4

sitemap_alternate_links

Chỉ định các liên kết thay thế sẽ được theo dõi cho một url.

Ví dụ về SitemapSpider

SitemapSpider sau xử lý tất cả các URL -

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/sitemap.xml"]  
   
   def parse(self, response): 
      # You can scrap items here

SitemapSpider sau xử lý một số URL có lệnh gọi lại -

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/sitemap.xml"] 
   
   rules = [ 
      ("/item/", "parse_item"), 
      ("/group/", "parse_group"), 
   ]  
   
   def parse_item(self, response): 
      # you can scrap item here  
   
   def parse_group(self, response): 
      # you can scrap group here

Đoạn mã sau hiển thị các sơ đồ trang web trong tệp robots.txt có url /sitemap_company -

from scrapy.spiders import SitemapSpider

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/robots.txt"] 
   rules = [ 
      ("/company/", "parse_company"), 
   ] 
   sitemap_follow = ["/sitemap_company"]  
   
   def parse_company(self, response): 
      # you can scrap company here

Bạn thậm chí có thể kết hợp SitemapSpider với các URL khác như được hiển thị trong lệnh sau.

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/robots.txt"] 
   rules = [ 
      ("/company/", "parse_company"), 
   ]  
   
   other_urls = ["http://www.demoexample.com/contact-us"] 
   def start_requests(self): 
      requests = list(super(DemoSpider, self).start_requests()) 
      requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls] 
      return requests 

   def parse_company(self, response): 
      # you can scrap company here... 

   def parse_other(self, response): 
      # you can scrap other here...

Sự miêu tả

Khi bạn đang tìm kiếm các trang web, bạn cần trích xuất một phần nhất định của nguồn HTML bằng cách sử dụng cơ chế được gọi là selectors, đạt được bằng cách sử dụng biểu thức XPath hoặc CSS. Bộ chọn được xây dựng dựa trênlxml thư viện, xử lý XML và HTML bằng ngôn ngữ Python.

Sử dụng đoạn mã sau để xác định các khái niệm khác nhau về bộ chọn -

<html>
   <head>
      <title>My Website</title>
   </head>
   
   <body>
      <span>Hello world!!!</span>
      <div class = 'links'>
         <a href = 'one.html'>Link 1<img src = 'image1.jpg'/></a>
         <a href = 'two.html'>Link 2<img src = 'image2.jpg'/></a>
         <a href = 'three.html'>Link 3<img src = 'image3.jpg'/></a>
      </div>
   </body>
</html>

Xây dựng bộ chọn

Bạn có thể xây dựng các cá thể lớp bộ chọn bằng cách chuyển text hoặc là TextResponsevật. Dựa trên loại đầu vào được cung cấp, bộ chọn chọn các quy tắc sau:

from scrapy.selector import Selector 
from scrapy.http import HtmlResponse

Sử dụng đoạn mã trên, bạn có thể tạo từ văn bản dưới dạng:

Selector(text = body).xpath('//span/text()').extract()

Nó sẽ hiển thị kết quả là -

[u'Hello world!!!']

Bạn có thể xây dựng từ phản hồi dưới dạng:

response = HtmlResponse(url = 'http://mysite.com', body = body) 
Selector(response = response).xpath('//span/text()').extract()

Nó sẽ hiển thị kết quả là -

[u'Hello world!!!']

Sử dụng Bộ chọn

Sử dụng đoạn mã đơn giản ở trên, bạn có thể tạo XPath để chọn văn bản được xác định trong thẻ tiêu đề như được hiển thị bên dưới -

>>response.selector.xpath('//title/text()')

Bây giờ, bạn có thể trích xuất dữ liệu văn bản bằng cách sử dụng .extract() phương pháp hiển thị như sau:

>>response.xpath('//title/text()').extract()

Nó sẽ tạo ra kết quả là -

[u'My Website']

Bạn có thể hiển thị tên của tất cả các phần tử như sau:

>>response.xpath('//div[@class = "links"]/a/text()').extract()

Nó sẽ hiển thị các phần tử là -

Link 1
Link 2
Link 3

Nếu bạn muốn trích xuất phần tử đầu tiên, hãy sử dụng phương pháp .extract_first(), được hiển thị như sau -

>>response.xpath('//div[@class = "links"]/a/text()').extract_first()

Nó sẽ hiển thị phần tử là -

Link 1

Bộ chọn lồng

Sử dụng mã trên, bạn có thể lồng các bộ chọn để hiển thị liên kết trang và nguồn hình ảnh bằng cách sử dụng .xpath() phương pháp, được hiển thị như sau:

links = response.xpath('//a[contains(@href, "image")]') 

for index, link in enumerate(links): 
   args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract()) 
   print 'The link %d pointing to url %s and image %s' % args

Nó sẽ hiển thị kết quả là -

Link 1 pointing to url [u'one.html'] and image [u'image1.jpg']
Link 2 pointing to url [u'two.html'] and image [u'image2.jpg']
Link 3 pointing to url [u'three.html'] and image [u'image3.jpg']

Bộ chọn sử dụng cụm từ thông dụng

Scrapy cho phép trích xuất dữ liệu bằng biểu thức chính quy, sử dụng .re()phương pháp. Từ đoạn mã HTML trên, chúng tôi sẽ trích xuất các tên hình ảnh như sau:

>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

Dòng trên hiển thị tên hình ảnh là:

[u'Link 1', 
u'Link 2', 
u'Link 3']

Sử dụng XPath tương đối

Khi bạn đang làm việc với XPath, bắt đầu với /, bộ chọn lồng nhau và XPath có liên quan đến đường dẫn tuyệt đối của tài liệu chứ không phải đường dẫn tương đối của bộ chọn.

Nếu bạn muốn giải nén <p> các phần tử, sau đó trước tiên đạt được tất cả các phần tử div -

>>mydiv = response.xpath('//div')

Tiếp theo, bạn có thể giải nén tất cả 'p' các phần tử bên trong, bằng cách đặt trước XPath bằng một dấu chấm là .//p như hình dưới đây -

>>for p in mydiv.xpath('.//p').extract()

Sử dụng Tiện ích mở rộng EXSLT

EXSLT là cộng đồng phát hành các phần mở rộng cho XSLT (Phép biến đổi ngôn ngữ biểu định kiểu có thể mở rộng) để chuyển đổi tài liệu XML sang tài liệu XHTML. Bạn có thể sử dụng các phần mở rộng EXSLT với không gian tên đã đăng ký trong các biểu thức XPath như được hiển thị trong bảng sau:

Sr.No Tiền tố & Cách sử dụng Không gian tên
1

re

biểu thức chính quy

http://exslt.org/regexp/index.html

2

set

thiết lập thao tác

http://exslt.org/set/index.html

Bạn có thể kiểm tra định dạng mã đơn giản để trích xuất dữ liệu bằng biểu thức chính quy trong phần trước.

Có một số mẹo XPath hữu ích khi sử dụng XPath với bộ chọn Scrapy. Để biết thêm thông tin, hãy nhấp vào liên kết này .

Sự miêu tả

Quy trình trị liệu có thể được sử dụng để trích xuất dữ liệu từ các nguồn như các trang web bằng cách sử dụng trình thu thập dữ liệu. Sử dụng liệu phápItem lớp để tạo ra kết quả có các đối tượng được sử dụng để thu thập dữ liệu đã được cạo.

Khai báo các mặt hàng

Bạn có thể khai báo các mục bằng cú pháp định nghĩa lớp cùng với các đối tượng trường được hiển thị như sau:

import scrapy 
class MyProducts(scrapy.Item): 
   productName = Field() 
   productLink = Field() 
   imageURL = Field() 
   price = Field() 
   size = Field()

Trường mục

Các trường mục được sử dụng để hiển thị siêu dữ liệu cho từng trường. Vì không có giới hạn về giá trị trên các đối tượng trường, các khóa siêu dữ liệu có thể truy cập được không có bất kỳ danh sách tham chiếu nào của siêu dữ liệu. Các đối tượng trường được sử dụng để chỉ định tất cả siêu dữ liệu trường và bạn có thể chỉ định bất kỳ khóa trường nào khác theo yêu cầu của bạn trong dự án. Các đối tượng trường có thể được truy cập bằng thuộc tính Item.fields.

Làm việc với các mặt hàng

Có một số chức năng phổ biến có thể được xác định khi bạn đang làm việc với các mục. Để biết thêm thông tin, hãy nhấp vào liên kết này .

Mở rộng mục

Các mục có thể được mở rộng bằng cách nêu rõ lớp con của mục gốc. Ví dụ -

class MyProductDetails(Product): 
   original_rate = scrapy.Field(serializer = str) 
   discount_rate = scrapy.Field()

Bạn có thể sử dụng siêu dữ liệu trường hiện có để mở rộng siêu dữ liệu trường bằng cách thêm nhiều giá trị hơn hoặc thay đổi các giá trị hiện có như được hiển thị trong mã sau:

class MyProductPackage(Product): 
   name = scrapy.Field(Product.fields['name'], serializer = serializer_demo)

Đối tượng mục

Các đối tượng item có thể được chỉ định bằng cách sử dụng lớp sau cung cấp item được khởi tạo mới từ đối số đã cho:

class scrapy.item.Item([arg])

Mục cung cấp một bản sao của hàm tạo và cung cấp một thuộc tính bổ sung được cung cấp bởi các mục trong các trường.

Đối tượng trường

Các đối tượng trường có thể được chỉ định bằng cách sử dụng lớp sau, trong đó lớp Trường không đưa ra quy trình hoặc thuộc tính bổ sung -

class scrapy.item.Field([arg])

Sự miêu tả

Trình tải vật phẩm cung cấp một cách thuận tiện để lấp đầy các vật phẩm được lấy từ các trang web.

Khai báo Máy xúc vật phẩm

Việc khai báo Máy xúc vật phẩm giống như các Vật phẩm.

Ví dụ -

from scrapy.loader import ItemLoader 
from scrapy.loader.processors import TakeFirst, MapCompose, Join  

class DemoLoader(ItemLoader):  
   default_output_processor = TakeFirst()  
   title_in = MapCompose(unicode.title) 
   title_out = Join()  
   size_in = MapCompose(unicode.strip)  
   # you can continue scraping here

Trong đoạn mã trên, bạn có thể thấy rằng bộ xử lý đầu vào được khai báo bằng _in hậu tố và bộ xử lý đầu ra được khai báo bằng _out hậu tố.

Các ItemLoader.default_input_processorItemLoader.default_output_processor các thuộc tính được sử dụng để khai báo bộ xử lý đầu vào / đầu ra mặc định.

Sử dụng máy xúc vật phẩm để điền vật phẩm

Để sử dụng Trình tải mục, trước tiên hãy khởi tạo đối tượng giống như dict hoặc không có đối tượng mà mục sử dụng lớp Mục được chỉ định trong ItemLoader.default_item_class thuộc tính.

  • Bạn có thể sử dụng bộ chọn để thu thập các giá trị vào Trình tải vật phẩm.

  • Bạn có thể thêm nhiều giá trị hơn trong cùng một trường mục, nơi Trình tải mục sẽ sử dụng một trình xử lý thích hợp để thêm các giá trị này.

Đoạn mã sau minh họa cách các mục được điền bằng cách sử dụng Máy xúc vật phẩm -

from scrapy.loader import ItemLoader 
from demoproject.items import Demo  

def parse(self, response): 
   l = ItemLoader(item = Product(), response = response)
   l.add_xpath("title", "//div[@class = 'product_title']")
   l.add_xpath("title", "//div[@class = 'product_name']")
   l.add_xpath("desc", "//div[@class = 'desc']")
   l.add_css("size", "div#size]")
   l.add_value("last_updated", "yesterday")
   return l.load_item()

Như được hiển thị ở trên, có hai XPath khác nhau mà từ đó title trường được trích xuất bằng cách sử dụng add_xpath() phương pháp -

1. //div[@class = "product_title"] 
2. //div[@class = "product_name"]

Sau đó, một yêu cầu tương tự được sử dụng cho desccánh đồng. Dữ liệu kích thước được trích xuất bằng cách sử dụngadd_css() phương pháp và last_updated được điền bằng giá trị "hôm qua" bằng cách sử dụng add_value() phương pháp.

Sau khi tất cả dữ liệu được thu thập, hãy gọi ItemLoader.load_item() phương thức trả về các mục chứa đầy dữ liệu được trích xuất bằng cách sử dụng add_xpath(), add_css()add_value() các phương pháp.

Bộ xử lý đầu vào và đầu ra

Mỗi trường của Trình tải mục chứa một bộ xử lý đầu vào và một bộ xử lý đầu ra.

  • Khi dữ liệu được trích xuất, bộ xử lý đầu vào sẽ xử lý nó và kết quả của nó được lưu trữ trong ItemLoader.

  • Tiếp theo, sau khi thu thập dữ liệu, hãy gọi phương thức ItemLoader.load_item () để lấy đối tượng Item được phổ biến.

  • Cuối cùng, bạn có thể gán kết quả của bộ xử lý đầu ra cho mục.

Đoạn mã sau trình bày cách gọi bộ xử lý đầu vào và đầu ra cho một trường cụ thể:

l = ItemLoader(Product(), some_selector)
l.add_xpath("title", xpath1) # [1]
l.add_xpath("title", xpath2) # [2]
l.add_css("title", css)      # [3]
l.add_value("title", "demo") # [4]
return l.load_item()         # [5]

Line 1 - Dữ liệu của tiêu đề được trích xuất từ ​​xpath1 và được chuyển qua bộ xử lý đầu vào và kết quả của nó được thu thập và lưu trữ trong ItemLoader.

Line 2 - Tương tự, tiêu đề được trích xuất từ ​​xpath2 và được chuyển qua cùng một bộ xử lý đầu vào và kết quả của nó được thêm vào dữ liệu được thu thập cho [1].

Line 3 - Tiêu đề được trích xuất từ ​​bộ chọn css và được chuyển qua cùng một bộ xử lý đầu vào và kết quả được thêm vào dữ liệu được thu thập cho [1] và [2].

Line 4 - Tiếp theo, giá trị "demo" được gán và chuyển qua các bộ xử lý đầu vào.

Line 5 - Cuối cùng, dữ liệu được thu thập nội bộ từ tất cả các trường và chuyển đến bộ xử lý đầu ra và giá trị cuối cùng được gán cho Mục.

Khai báo bộ xử lý đầu vào và đầu ra

Các bộ xử lý đầu vào và đầu ra được khai báo trong định nghĩa ItemLoader. Ngoài ra, chúng cũng có thể được chỉ định trongItem Field metadata.

Ví dụ -

import scrapy 
from scrapy.loader.processors import Join, MapCompose, TakeFirst 
from w3lib.html import remove_tags  

def filter_size(value): 
   if value.isdigit(): 
      return value  

class Item(scrapy.Item): 
   name = scrapy.Field( 
      input_processor = MapCompose(remove_tags), 
      output_processor = Join(), 
   )
   size = scrapy.Field( 
      input_processor = MapCompose(remove_tags, filter_price), 
      output_processor = TakeFirst(), 
   ) 

>>> from scrapy.loader import ItemLoader 
>>> il = ItemLoader(item = Product()) 
>>> il.add_value('title', [u'Hello', u'<strong>world</strong>']) 
>>> il.add_value('size', [u'<span>100 kg</span>']) 
>>> il.load_item()

Nó hiển thị đầu ra là -

{'title': u'Hello world', 'size': u'100 kg'}

Bối cảnh trình tải vật phẩm

Ngữ cảnh trình tải mục là một mệnh lệnh của các giá trị khóa tùy ý được chia sẻ giữa các bộ xử lý đầu vào và đầu ra.

Ví dụ: giả sử bạn có một hàm parse_length -

def parse_length(text, loader_context): 
   unit = loader_context.get('unit', 'cm') 
   
   # You can write parsing code of length here  
   return parsed_length

Bằng cách nhận các đối số loader_context, nó cho Trình tải mục biết rằng nó có thể nhận ngữ cảnh của Trình tải mục. Có một số cách để thay đổi giá trị của ngữ cảnh Trình tải vật phẩm -

  • Sửa đổi ngữ cảnh Trình tải mục đang hoạt động hiện tại -

loader = ItemLoader (product)
loader.context ["unit"] = "mm"
  • Khi khởi tạo Trình tải mục -

loader = ItemLoader(product, unit = "mm")
  • Trên khai báo Trình tải vật phẩm cho các bộ xử lý đầu vào / đầu ra khởi tạo với ngữ cảnh Trình tải vật phẩm -

class ProductLoader(ItemLoader):
   length_out = MapCompose(parse_length, unit = "mm")

Đối tượng ItemLoader

Nó là một đối tượng trả về một trình tải mục mới để điền vào mục đã cho. Nó có lớp sau:

class scrapy.loader.ItemLoader([item, selector, response, ]**kwargs)

Bảng sau đây cho thấy các tham số của các đối tượng ItemLoader:

Sr.No Mô tả về Thông Số
1

item

Đây là mục cần điền bằng cách gọi add_xpath (), add_css () hoặc add_value ().

2

selector

Nó được sử dụng để trích xuất dữ liệu từ các trang web.

3

response

Nó được sử dụng để xây dựng bộ chọn bằng default_selector_class.

Bảng sau hiển thị các phương thức của các đối tượng ItemLoader:

Sr.No Phương pháp & Mô tả Thí dụ
1

get_value(value, *processors, **kwargs)

Bởi một bộ xử lý nhất định và các đối số từ khóa, giá trị được xử lý bằng phương thức get_value ().

>>> from scrapy.loader.processors import TakeFirst
>>> loader.get_value(u'title: demoweb', TakeFirst(), 
unicode.upper, re = 'title: (.+)')
'DEMOWEB`
2

add_value(field_name, value, *processors, **kwargs)

Nó xử lý giá trị và thêm vào trường nơi nó được chuyển đầu tiên qua get_value bằng cách đưa ra bộ xử lý và đối số từ khóa trước khi chuyển qua bộ xử lý đầu vào trường.

loader.add_value('title', u'DVD')
loader.add_value('colors', [u'black', u'white'])
loader.add_value('length', u'80')
loader.add_value('price', u'2500')
3

replace_value(field_name, value, *processors, **kwargs)

Nó thay thế dữ liệu đã thu thập bằng một giá trị mới.

loader.replace_value('title', u'DVD')
loader.replace_value('colors', [u'black', 
u'white'])
loader.replace_value('length', u'80')
loader.replace_value('price', u'2500')
4

get_xpath(xpath, *processors, **kwargs)

Nó được sử dụng để trích xuất các chuỗi unicode bằng cách đưa ra các bộ xử lý và các đối số từ khóa bằng cách nhận XPath .

# HTML code: <div class = "item-name">DVD</div>
loader.get_xpath("//div[@class = 
'item-name']")

# HTML code: <div id = "length">the length is 
45cm</div>
loader.get_xpath("//div[@id = 'length']", TakeFirst(), 
re = "the length is (.*)")
5

add_xpath(field_name, xpath, *processors, **kwargs)

Nó nhận XPath đến trường trích xuất các chuỗi unicode.

# HTML code: <div class = "item-name">DVD</div>
loader.add_xpath('name', '//div
[@class = "item-name"]')

# HTML code: <div id = "length">the length is 
45cm</div>
loader.add_xpath('length', '//div[@id = "length"]',
 re = 'the length is (.*)')
6

replace_xpath(field_name, xpath, *processors, **kwargs)

Nó thay thế dữ liệu được thu thập bằng XPath từ các trang web.

# HTML code: <div class = "item-name">DVD</div>
loader.replace_xpath('name', '
//div[@class = "item-name"]')

# HTML code: <div id = "length">the length is
 45cm</div>
loader.replace_xpath('length', '
//div[@id = "length"]', re = 'the length is (.*)')
7

get_css(css, *processors, **kwargs)

Nó nhận bộ chọn CSS được sử dụng để trích xuất các chuỗi unicode.

loader.get_css("div.item-name")
loader.get_css("div#length", TakeFirst(), 
re = "the length is (.*)")
số 8

add_css(field_name, css, *processors, **kwargs)

Nó tương tự như phương thức add_value () với một điểm khác biệt là nó thêm bộ chọn CSS vào trường.

loader.add_css('name', 'div.item-name')
loader.add_css('length', 'div#length', 
re = 'the length is (.*)')
9

replace_css(field_name, css, *processors, **kwargs)

Nó thay thế dữ liệu được trích xuất bằng cách sử dụng bộ chọn CSS.

loader.replace_css('name', 'div.item-name')
loader.replace_css('length', 'div#length',
 re = 'the length is (.*)')
10

load_item()

Khi dữ liệu được thu thập, phương pháp này sẽ điền vào mục với dữ liệu đã thu thập và trả về.

def parse(self, response):
l = ItemLoader(item = Product(), 
response = response)
l.add_xpath('title', '//
div[@class = "product_title"]')
loader.load_item()
11

nested_xpath(xpath)

Nó được sử dụng để tạo bộ tải lồng nhau với bộ chọn XPath.

loader = ItemLoader(item = Item())
loader.add_xpath('social', '
a[@class = "social"]/@href')
loader.add_xpath('email', '
a[@class = "email"]/@href')
12

nested_css(css)

Nó được sử dụng để tạo bộ tải lồng nhau với bộ chọn CSS.

loader = ItemLoader(item = Item())
loader.add_css('social', 'a[@class = "social"]/@href')
loader.add_css('email', 'a[@class = "email"]/@href')

Bảng sau hiển thị các thuộc tính của các đối tượng ItemLoader:

Sr.No Thuộc tính & Mô tả
1

item

Nó là một đối tượng mà Trình tải mục thực hiện phân tích cú pháp.

2

context

Đó là ngữ cảnh hiện tại của Trình tải mục đang hoạt động.

3

default_item_class

Nó được sử dụng để đại diện cho các mục, nếu không được đưa ra trong hàm tạo.

4

default_input_processor

Các trường không chỉ định bộ xử lý đầu vào là những trường duy nhất mà bộ xử lý default_input_processor được sử dụng.

5

default_output_processor

Các trường không chỉ định bộ xử lý đầu ra là những trường duy nhất mà bộ xử lý default_output_processor được sử dụng.

6

default_selector_class

Nó là một lớp được sử dụng để xây dựng bộ chọn, nếu nó không được cung cấp trong hàm tạo.

7

selector

Nó là một đối tượng có thể được sử dụng để trích xuất dữ liệu từ các trang web.

Máy xúc lật lồng nhau

Nó được sử dụng để tạo bộ tải lồng nhau trong khi phân tích cú pháp các giá trị từ phần phụ của tài liệu. Nếu bạn không tạo bộ tải lồng nhau, bạn cần chỉ định XPath hoặc CSS đầy đủ cho mỗi giá trị mà bạn muốn trích xuất.

Ví dụ: giả sử rằng dữ liệu đang được trích xuất từ ​​trang tiêu đề -

<header>
   <a class = "social" href = "http://facebook.com/whatever">facebook</a>
   <a class = "social" href = "http://twitter.com/whatever">twitter</a>
   <a class = "email" href = "mailto:[email protected]">send mail</a>
</header>

Tiếp theo, bạn có thể tạo bộ tải lồng nhau với bộ chọn tiêu đề bằng cách thêm các giá trị liên quan vào tiêu đề -

loader = ItemLoader(item = Item())
header_loader = loader.nested_xpath('//header')
header_loader.add_xpath('social', 'a[@class = "social"]/@href')
header_loader.add_xpath('email', 'a[@class = "email"]/@href')
loader.load_item()

Tái sử dụng và mở rộng Máy xúc vật phẩm

Máy xúc vật phẩm được thiết kế để giảm bớt việc bảo trì vốn trở thành một vấn đề cơ bản khi dự án của bạn có nhiều nhện hơn.

Ví dụ: giả sử rằng một trang web có tên sản phẩm của họ được đặt trong ba dấu gạch ngang (ví dụ --DVD ---). Bạn có thể loại bỏ những dấu gạch ngang đó bằng cách sử dụng lại Trình tải mục sản phẩm mặc định, nếu bạn không muốn nó trong tên sản phẩm cuối cùng như được hiển thị trong mã sau:

from scrapy.loader.processors import MapCompose 
from demoproject.ItemLoaders import DemoLoader  

def strip_dashes(x): 
   return x.strip('-')  

class SiteSpecificLoader(DemoLoader): 
   title_in = MapCompose(strip_dashes, DemoLoader.title_in)

Bộ xử lý tích hợp sẵn có

Sau đây là một số bộ xử lý tích hợp thường được sử dụng:

lớp scrapy.loader.processors.Identity

Nó trả về giá trị ban đầu mà không thay đổi nó. Ví dụ -

>>> from scrapy.loader.processors import Identity
>>> proc = Identity()
>>> proc(['a', 'b', 'c'])
['a', 'b', 'c']

lớp scrapy.loader.processors.TakeFirst

Nó trả về giá trị đầu tiên không null / không rỗng từ danh sách các giá trị đã nhận. Ví dụ -

>>> from scrapy.loader.processors import TakeFirst
>>> proc = TakeFirst()
>>> proc(['', 'a', 'b', 'c'])
'a'

lớp scrapy.loader.processors.Join (dấu tách = u '')

Nó trả về giá trị được gắn vào dấu phân cách. Dấu phân tách mặc định là u '' và nó tương đương với hàmu' '.join. Ví dụ -

>>> from scrapy.loader.processors import Join
>>> proc = Join()
>>> proc(['a', 'b', 'c'])
u'a b c'
>>> proc = Join('<br>')
>>> proc(['a', 'b', 'c'])
u'a<br>b<br>c'

class scrapy.loader.processors.Compose (* các hàm, ** default_loader_context)

Nó được xác định bởi một bộ xử lý trong đó mỗi giá trị đầu vào của nó được chuyển cho hàm đầu tiên và kết quả của hàm đó được chuyển cho hàm thứ hai, v.v., cho đến khi hàm ast trả về giá trị cuối cùng là đầu ra.

Ví dụ -

>>> from scrapy.loader.processors import Compose
>>> proc = Compose(lambda v: v[0], str.upper)
>>> proc(['python', 'scrapy'])
'PYTHON'

class scrapy.loader.processors.MapCompose (* các hàm, ** default_loader_context)

Nó là một bộ xử lý trong đó giá trị đầu vào được lặp lại và chức năng đầu tiên được áp dụng cho mỗi phần tử. Tiếp theo, kết quả của các lệnh gọi hàm này được nối với nhau để xây dựng có thể lặp lại mới sau đó được áp dụng cho hàm thứ hai, v.v., cho đến hàm cuối cùng.

Ví dụ -

>>> def filter_scrapy(x): 
   return None if x == 'scrapy' else x  

>>> from scrapy.loader.processors import MapCompose 
>>> proc = MapCompose(filter_scrapy, unicode.upper) 
>>> proc([u'hi', u'everyone', u'im', u'pythonscrapy']) 
[u'HI, u'IM', u'PYTHONSCRAPY']

class scrapy.loader.processors.SelectJmes (json_path)

Lớp này truy vấn giá trị bằng cách sử dụng đường dẫn json được cung cấp và trả về kết quả đầu ra.

Ví dụ -

>>> from scrapy.loader.processors import SelectJmes, Compose, MapCompose
>>> proc = SelectJmes("hello")
>>> proc({'hello': 'scrapy'})
'scrapy'
>>> proc({'hello': {'scrapy': 'world'}})
{'scrapy': 'world'}

Sau đây là đoạn mã, truy vấn giá trị bằng cách nhập json -

>>> import json
>>> proc_single_json_str = Compose(json.loads, SelectJmes("hello"))
>>> proc_single_json_str('{"hello": "scrapy"}')
u'scrapy'
>>> proc_json_list = Compose(json.loads, MapCompose(SelectJmes('hello')))
>>> proc_json_list('[{"hello":"scrapy"}, {"world":"env"}]')
[u'scrapy']

Sự miêu tả

Scrapy shell có thể được sử dụng để loại bỏ dữ liệu với mã không có lỗi mà không cần sử dụng spider. Mục đích chính của Scrapy shell là kiểm tra mã được trích xuất, biểu thức XPath hoặc CSS. Nó cũng giúp chỉ định các trang web mà bạn đang thu thập dữ liệu.

Cấu hình Shell

Shell có thể được định cấu hình bằng cách cài đặt bảng điều khiển IPython (được sử dụng cho máy tính tương tác), đây là một shell tương tác mạnh mẽ cho phép hoàn thành tự động, đầu ra được tô màu, v.v.

Nếu bạn đang làm việc trên nền tảng Unix, thì tốt hơn hết bạn nên cài đặt IPython. Bạn cũng có thể sử dụng bpython , nếu IPython không thể truy cập được.

Bạn có thể định cấu hình trình bao bằng cách đặt biến môi trường có tên SCRAPY_PYTHON_SHELL hoặc bằng cách xác định tệp scrapy.cfg như sau:

[settings]
shell = bpython

Khởi động Shell

Scrapy shell có thể được khởi chạy bằng lệnh sau:

scrapy shell <url>

Các url quy định cụ thể các URL mà cần dữ liệu được cạo.

Sử dụng Shell

Trình bao cung cấp một số phím tắt bổ sung và các đối tượng Scrapy như được mô tả trong bảng sau:

Các phím tắt có sẵn

Shell cung cấp các phím tắt có sẵn sau đây trong dự án:

Sr.No Phím tắt & Mô tả
1

shelp()

Nó cung cấp các đối tượng và phím tắt có sẵn với tùy chọn trợ giúp.

2

fetch(request_or_url)

Nó thu thập phản hồi từ yêu cầu hoặc URL và các đối tượng liên quan sẽ được cập nhật đúng cách.

3

view(response)

Bạn có thể xem phản hồi cho yêu cầu nhất định trong trình duyệt cục bộ để quan sát và để hiển thị chính xác liên kết bên ngoài, liên kết này sẽ gắn thẻ cơ sở vào nội dung phản hồi.

Vật liệu trị liệu có sẵn

Shell cung cấp các đối tượng Scrapy có sẵn sau đây trong dự án:

Sr.No Mô tả đối tượng
1

crawler

Nó chỉ định đối tượng trình thu thập thông tin hiện tại.

2

spider

Nếu không có trình thu thập dữ liệu nào cho URL hiện tại, thì nó sẽ xử lý URL hoặc đối tượng trình thu thập dữ liệu bằng cách xác định trình thu thập dữ liệu mới.

3

request

Nó chỉ định đối tượng yêu cầu cho trang được thu thập cuối cùng.

4

response

Nó chỉ định đối tượng phản hồi cho trang được thu thập cuối cùng.

5

settings

Nó cung cấp các cài đặt Scrapy hiện tại.

Ví dụ về phiên Shell

Hãy để chúng tôi thử tìm kiếm trang web scrapy.org và sau đó bắt đầu thu thập dữ liệu từ reddit.com như được mô tả.

Trước khi tiếp tục, đầu tiên chúng ta sẽ khởi chạy trình bao như được hiển thị trong lệnh sau:

scrapy shell 'http://scrapy.org' --nolog

Scrapy sẽ hiển thị các đối tượng có sẵn khi sử dụng URL ở trên -

[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x1e16b50>
[s]   item       {}
[s]   request    <GET http://scrapy.org >
[s]   response   <200 http://scrapy.org >
[s]   settings   <scrapy.settings.Settings object at 0x2bfd650>
[s]   spider     <Spider 'default' at 0x20c6f50>
[s] Useful shortcuts:
[s]   shelp()           Provides available objects and shortcuts with help option
[s]   fetch(req_or_url) Collects the response from the request or URL and associated 
objects will get update
[s]   view(response)    View the response for the given request

Tiếp theo, bắt đầu với hoạt động của các đối tượng, được hiển thị như sau:

>> response.xpath('//title/text()').extract_first() 
u'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework'  
>> fetch("http://reddit.com") 
[s] Available Scrapy objects: 
[s]   crawler     
[s]   item       {} 
[s]   request     
[s]   response   <200 https://www.reddit.com/> 
[s]   settings    
[s]   spider      
[s] Useful shortcuts: 
[s]   shelp()           Shell help (print this help) 
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects 
[s]   view(response)    View response in a browser  
>> response.xpath('//title/text()').extract() 
[u'reddit: the front page of the internet']  
>> request = request.replace(method="POST")  
>> fetch(request) 
[s] Available Scrapy objects: 
[s]   crawler     
...

Gọi Shell từ Nhện để Kiểm tra Phản hồi

Bạn có thể kiểm tra các phản hồi được xử lý từ spider, chỉ khi bạn đang mong đợi nhận được phản hồi đó.

Ví dụ -

import scrapy 

class SpiderDemo(scrapy.Spider): 
   name = "spiderdemo" 
   start_urls = [ 
      "http://mysite.com", 
      "http://mysite1.org", 
      "http://mysite2.net", 
   ]  
   
   def parse(self, response): 
      # You can inspect one specific response 
      if ".net" in response.url: 
         from scrapy.shell import inspect_response 
         inspect_response(response, self)

Như được hiển thị trong đoạn mã trên, bạn có thể gọi trình bao từ nhện để kiểm tra các phản hồi bằng cách sử dụng hàm sau:

scrapy.shell.inspect_response

Bây giờ chạy con nhện và bạn sẽ nhận được màn hình sau:

2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200)  (referer: None) 
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200)  (referer: None) 
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200)  (referer: None) 
[s] Available Scrapy objects: 
[s]   crawler     
...  
>> response.url 
'http://mysite2.org'

Bạn có thể kiểm tra xem mã được trích xuất có hoạt động hay không bằng cách sử dụng mã sau:

>> response.xpath('//div[@class = "val"]')

Nó hiển thị đầu ra là

[]

Dòng trên chỉ hiển thị một đầu ra trống. Bây giờ bạn có thể gọi shell để kiểm tra phản hồi như sau:

>> view(response)

Nó hiển thị phản hồi là

True

Sự miêu tả

Item Pipelinelà một phương pháp mà các mục đã loại bỏ được xử lý. Khi một mục được gửi đến Đường ống mục, nó sẽ được quét bởi một con nhện và xử lý bằng cách sử dụng một số thành phần, được thực thi tuần tự.

Bất cứ khi nào một vật phẩm được nhận, nó sẽ quyết định một trong các hành động sau:

  • Tiếp tục xử lý mặt hàng.
  • Thả nó khỏi đường ống.
  • Dừng xử lý mặt hàng.

Đường ống hạng mục thường được sử dụng cho các mục đích sau:

  • Lưu trữ các mục cóp nhặt trong cơ sở dữ liệu.
  • Nếu mục đã nhận được lặp lại, thì nó sẽ rơi ra mục đã lặp lại.
  • Nó sẽ kiểm tra xem mục đó có thuộc các trường được nhắm mục tiêu hay không.
  • Xóa dữ liệu HTML.

Cú pháp

Bạn có thể viết Đường ống mục bằng phương pháp sau:

process_item(self, item, spider)

Phương thức trên chứa các tham số sau:

  • Mục (đối tượng mục hoặc từ điển) - Nó chỉ định mục đã cạo.
  • spider (vật thể con nhện) - Con nhện cạo đồ vật.

Bạn có thể sử dụng các phương pháp bổ sung được cung cấp trong bảng sau:

Sr.No Phương pháp & Mô tả Thông số
1

open_spider(self, spider)

Nó được chọn khi mở spider.

spider (vật thể con nhện) - Nó đề cập đến con nhện đã được mở ra.

2

close_spider(self, spider)

Nó được chọn khi đóng spider.

spider (vật thể con nhện) - Nó đề cập đến con nhện đã được đóng lại.

3

from_crawler(cls, crawler)

Với sự trợ giúp của trình thu thập thông tin, đường ống có thể truy cập các thành phần cốt lõi như tín hiệu và cài đặt của Scrapy.

trình thu thập thông tin (Đối tượng trình thu thập thông tin) - Nó đề cập đến trình thu thập thông tin sử dụng đường ống này.

Thí dụ

Sau đây là các ví dụ về đường ống mục được sử dụng trong các khái niệm khác nhau.

Bỏ các mục không có thẻ

Trong đoạn mã sau, quy trình cân bằng thuộc tính (price) cho những mặt hàng không bao gồm VAT (thuộc tínhludes_vat) và bỏ qua những mặt hàng không có thẻ giá -

from Scrapy.exceptions import DropItem  
class PricePipeline(object): 
   vat = 2.25 

   def process_item(self, item, spider): 
      if item['price']: 
         if item['excludes_vat']: 
            item['price'] = item['price'] * self.vat 
            return item 
         else: 
            raise DropItem("Missing price in %s" % item)

Ghi các mục vào tệp JSON

Đoạn mã sau sẽ lưu trữ tất cả các mục cóp nhặt từ tất cả các nhện thành một items.jltệp, chứa một mục trên mỗi dòng ở dạng tuần tự ở định dạng JSON. CácJsonWriterPipeline lớp được sử dụng trong mã để hiển thị cách viết đường dẫn mục -

import json  

class JsonWriterPipeline(object): 
   def __init__(self): 
      self.file = open('items.jl', 'wb') 

   def process_item(self, item, spider): 
      line = json.dumps(dict(item)) + "\n" 
      self.file.write(line) 
      return item

Viết các mục lên MongoDB

Bạn có thể chỉ định địa chỉ MongoDB và tên cơ sở dữ liệu trong cài đặt Scrapy và bộ sưu tập MongoDB có thể được đặt tên theo lớp mục. Đoạn mã sau mô tả cách sử dụngfrom_crawler() phương pháp thu thập tài nguyên đúng cách -

import pymongo  

class MongoPipeline(object):  
   collection_name = 'Scrapy_list' 

   def __init__(self, mongo_uri, mongo_db): 
      self.mongo_uri = mongo_uri 
      self.mongo_db = mongo_db 

   @classmethod 
   def from_crawler(cls, crawler): 
      return cls( 
         mongo_uri = crawler.settings.get('MONGO_URI'), 
         mongo_db = crawler.settings.get('MONGO_DB', 'lists') 
      ) 
  
   def open_spider(self, spider): 
      self.client = pymongo.MongoClient(self.mongo_uri) 
      self.db = self.client[self.mongo_db] 

   def close_spider(self, spider): 
      self.client.close() 

   def process_item(self, item, spider): 
      self.db[self.collection_name].insert(dict(item)) 
      return item

Bộ lọc trùng lặp

Một bộ lọc sẽ kiểm tra các mục lặp lại và nó sẽ loại bỏ các mục đã được xử lý. Trong đoạn mã sau, chúng tôi đã sử dụng một id duy nhất cho các mặt hàng của mình, nhưng spider trả về nhiều mặt hàng có cùng một id -

from scrapy.exceptions import DropItem  

class DuplicatesPipeline(object):  
   def __init__(self): 
      self.ids_seen = set() 

   def process_item(self, item, spider): 
      if item['id'] in self.ids_seen: 
         raise DropItem("Repeated items found: %s" % item) 
      else: 
         self.ids_seen.add(item['id']) 
         return item

Kích hoạt một đường ống mặt hàng

Bạn có thể kích hoạt thành phần Đường ống mặt hàng bằng cách thêm lớp của nó vào cài đặt ITEM_PIPELINES như được hiển thị trong đoạn mã sau. Bạn có thể gán giá trị nguyên cho các lớp theo thứ tự chúng chạy (thứ tự có thể có giá trị thấp hơn cho các lớp có giá trị cao hơn) và các giá trị sẽ nằm trong phạm vi 0-1000.

ITEM_PIPELINES = {
   'myproject.pipelines.PricePipeline': 100,
   'myproject.pipelines.JsonWriterPipeline': 600,
}

Sự miêu tả

Xuất nguồn cấp dữ liệu là một phương pháp lưu trữ dữ liệu được thu thập từ các trang web, tạo ra "export file".

Định dạng tuần tự hóa

Sử dụng nhiều định dạng tuần tự hóa và phụ trợ lưu trữ, Xuất nguồn cấp dữ liệu sử dụng Trình xuất mặt hàng và tạo nguồn cấp dữ liệu với các mặt hàng đã được cạo.

Bảng sau đây cho thấy các định dạng được hỗ trợ

Sr.No Định dạng & Mô tả
1

JSON

FEED_FORMAT là json

Exporter được sử dụng là class scrapy.exporters.JsonItemExporter

2

JSON lines

FEED_FROMAT là jsonlines

Exporter được sử dụng là class scrapy.exporters.JsonLinesItemExporter

3

CSV

FEED_FORMAT là CSV

Exporter được sử dụng là class scrapy.exporters.CsvItemExporter

4

XML

FEED_FORMAT là xml

Exporter được sử dụng là class scrapy.exporters.XmlItemExporter

Sử dụng FEED_EXPORTERS cài đặt, các định dạng được hỗ trợ cũng có thể được mở rộng -

Sr.No Định dạng & Mô tả
1

Pickle

FEED_FORMAT là kén chọn

Exporter được sử dụng là class scrapy.exporters.PickleItemExporter

2

Marshal

FEED_FORMAT là thống đốc

Exporter được sử dụng là class scrapy.exporters.MarshalItemExporter

Phần phụ trợ lưu trữ

Phần phụ trợ lưu trữ xác định nơi lưu trữ nguồn cấp dữ liệu bằng URI.

Bảng sau hiển thị các phụ trợ lưu trữ được hỗ trợ:

Sr.No Phần hỗ trợ lưu trữ & Mô tả
1

Local filesystem

Lược đồ URI là tệp và nó được sử dụng để lưu trữ các nguồn cấp dữ liệu.

2

FTP

Lược đồ URI là ftp và nó được sử dụng để lưu trữ các nguồn cấp dữ liệu.

3

S3

Lược đồ URI là S3 và các nguồn cấp dữ liệu được lưu trữ trên Amazon S3. Thư viện bên ngoài botocore hoặc boto là bắt buộc.

4

Standard output

Lược đồ URI là stdout và các nguồn cấp dữ liệu được lưu trữ ở đầu ra tiêu chuẩn.

Tham số URI lưu trữ

Sau đây là các tham số của URL lưu trữ, được thay thế trong khi tạo nguồn cấp dữ liệu -

  • % (time) s: Tham số này được thay thế bằng dấu thời gian.
  • % (name) s: Tham số này được thay thế bằng tên con nhện.

Cài đặt

Bảng sau hiển thị các cài đặt sử dụng có thể định cấu hình xuất Nguồn cấp dữ liệu:

Sr.No Cài đặt & Mô tả
1

FEED_URI

Nó là URI của nguồn cấp dữ liệu xuất được sử dụng để cho phép xuất nguồn cấp dữ liệu.

2

FEED_FORMAT

Đây là một định dạng tuần tự hóa được sử dụng cho nguồn cấp dữ liệu.

3

FEED_EXPORT_FIELDS

Nó được sử dụng để xác định các trường cần được xuất.

4

FEED_STORE_EMPTY

Nó xác định có xuất các nguồn cấp dữ liệu mà không có mục nào hay không.

5

FEED_STORAGES

Nó là một từ điển với các phụ trợ lưu trữ nguồn cấp dữ liệu bổ sung.

6

FEED_STORAGES_BASE

Nó là một từ điển với phần phụ trợ lưu trữ nguồn cấp dữ liệu được tích hợp sẵn.

7

FEED_EXPORTERS

Nó là một từ điển với các nhà xuất khẩu nguồn cấp dữ liệu bổ sung.

số 8

FEED_EXPORTERS_BASE

Nó là một từ điển tích hợp sẵn các trình xuất nguồn cấp dữ liệu.

Sự miêu tả

Scrapy có thể thu thập dữ liệu các trang web bằng cách sử dụng RequestResponsecác đối tượng. Các đối tượng yêu cầu chuyển qua hệ thống, sử dụng các trình thu thập thông tin để thực hiện yêu cầu và quay lại yêu cầu khi nó trả về một đối tượng phản hồi.

Yêu cầu đối tượng

Đối tượng yêu cầu là một yêu cầu HTTP tạo ra một phản hồi. Nó có lớp sau:

class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta,
   encoding = 'utf-8', priority = 0, dont_filter = False, errback])

Bảng sau hiển thị các tham số của đối tượng Yêu cầu:

Sr.No Mô tả về Thông Số
1

url

Nó là một chuỗi chỉ định yêu cầu URL.

2

callback

Nó là một hàm có thể gọi sử dụng phản hồi của yêu cầu làm tham số đầu tiên.

3

method

Nó là một chuỗi chỉ định yêu cầu phương thức HTTP.

4

headers

Nó là một từ điển với các tiêu đề yêu cầu.

5

body

Nó là một chuỗi hoặc unicode có phần thân yêu cầu.

6

cookies

Nó là một danh sách chứa các cookie yêu cầu.

7

meta

Nó là một từ điển chứa các giá trị cho siêu dữ liệu của yêu cầu.

số 8

encoding

Nó là một chuỗi chứa mã hóa utf-8 được sử dụng để mã hóa URL.

9

priority

Nó là một số nguyên trong đó bộ lập lịch sử dụng ưu tiên để xác định thứ tự xử lý các yêu cầu.

10

dont_filter

Nó là một boolean chỉ định rằng bộ lập lịch không nên lọc yêu cầu.

11

errback

Nó là một hàm có thể gọi được gọi khi một ngoại lệ trong khi xử lý một yêu cầu được đưa ra.

Truyền dữ liệu bổ sung cho các chức năng gọi lại

Hàm gọi lại của một yêu cầu được gọi khi phản hồi được tải xuống dưới dạng tham số đầu tiên của nó.

Ví dụ -

def parse_page1(self, response): 
   return scrapy.Request("http://www.something.com/some_page.html", 
      callback = self.parse_page2)  

def parse_page2(self, response): 
   self.logger.info("%s page visited", response.url)

Bạn có thể dùng Request.meta thuộc tính, nếu bạn muốn truyền các đối số cho các hàm có thể gọi và nhận các đối số đó trong lệnh gọi lại thứ hai như được hiển thị trong ví dụ sau:

def parse_page1(self, response): 
   item = DemoItem() 
   item['foremost_link'] = response.url 
   request = scrapy.Request("http://www.something.com/some_page.html", 
      callback = self.parse_page2) 
   request.meta['item'] = item 
   return request  

def parse_page2(self, response): 
   item = response.meta['item'] 
   item['other_link'] = response.url 
   return item

Sử dụng lỗi để nắm bắt ngoại lệ trong xử lý yêu cầu

Errback là một hàm có thể gọi được gọi khi một ngoại lệ trong khi xử lý một yêu cầu được đưa ra.

Ví dụ sau đây chứng minh điều này -

import scrapy  

from scrapy.spidermiddlewares.httperror import HttpError 
from twisted.internet.error import DNSLookupError 
from twisted.internet.error import TimeoutError, TCPTimedOutError  

class DemoSpider(scrapy.Spider): 
   name = "demo" 
   start_urls = [ 
      "http://www.httpbin.org/",              # HTTP 200 expected 
      "http://www.httpbin.org/status/404",    # Webpage not found  
      "http://www.httpbin.org/status/500",    # Internal server error 
      "http://www.httpbin.org:12345/",        # timeout expected 
      "http://www.httphttpbinbin.org/",       # DNS error expected 
   ]  
   
   def start_requests(self): 
      for u in self.start_urls: 
         yield scrapy.Request(u, callback = self.parse_httpbin, 
         errback = self.errback_httpbin, 
         dont_filter=True)  
   
   def parse_httpbin(self, response): 
      self.logger.info('Recieved response from {}'.format(response.url)) 
      # ...  
   
   def errback_httpbin(self, failure): 
      # logs failures 
      self.logger.error(repr(failure))  
      
      if failure.check(HttpError): 
         response = failure.value.response 
         self.logger.error("HttpError occurred on %s", response.url)  
      
      elif failure.check(DNSLookupError): 
         request = failure.request 
         self.logger.error("DNSLookupError occurred on %s", request.url) 

      elif failure.check(TimeoutError, TCPTimedOutError): 
         request = failure.request 
         self.logger.error("TimeoutError occurred on %s", request.url)

Các phím đặc biệt Request.meta

Các khóa đặc biệt request.meta là danh sách các khóa meta đặc biệt được Scrapy xác định.

Bảng sau đây cho thấy một số khóa của Request.meta -

Sr.No Khóa & Mô tả
1

dont_redirect

Nó là một khóa khi được đặt thành true, không chuyển hướng yêu cầu dựa trên trạng thái của phản hồi.

2

dont_retry

Nó là một khóa khi được đặt thành true, không thử lại các yêu cầu không thành công và sẽ bị phần mềm trung gian bỏ qua.

3

handle_httpstatus_list

Nó là một khóa xác định mã phản hồi nào có thể được phép trên cơ sở yêu cầu.

4

handle_httpstatus_all

Nó là một khóa được sử dụng để cho phép bất kỳ mã phản hồi nào cho một yêu cầu bằng cách đặt nó thành true .

5

dont_merge_cookies

Nó là một khóa được sử dụng để tránh hợp nhất với các cookie hiện có bằng cách đặt nó thành true .

6

cookiejar

Nó là một khóa được sử dụng để giữ nhiều phiên cookie cho mỗi trình thu thập dữ liệu.

7

dont_cache

Nó là một khóa được sử dụng để tránh các yêu cầu HTTP vào bộ nhớ đệm và phản hồi trên mỗi chính sách.

số 8

redirect_urls

Nó là một khóa chứa các URL mà các yêu cầu đi qua.

9

bindaddress

Nó là IP của địa chỉ IP gửi đi có thể được sử dụng để thực hiện yêu cầu.

10

dont_obey_robotstxt

Nó là khóa khi được đặt thành true, không lọc các yêu cầu bị cấm theo tiêu chuẩn loại trừ robots.txt, ngay cả khi ROBOTSTXT_OBEY được bật.

11

download_timeout

Nó được sử dụng để đặt thời gian chờ (tính bằng giây) cho mỗi nhện mà người tải xuống sẽ đợi trước khi hết thời gian.

12

download_maxsize

Nó được sử dụng để đặt kích thước tối đa (tính bằng byte) cho mỗi con nhện mà trình tải xuống sẽ tải xuống.

13

proxy

Proxy có thể được đặt cho các đối tượng Yêu cầu để đặt proxy HTTP cho việc sử dụng các yêu cầu.

Yêu cầu lớp con

Bạn có thể triển khai chức năng tùy chỉnh của riêng mình bằng cách phân lớp lớp yêu cầu. Các lớp con yêu cầu tích hợp như sau:

Đối tượng FormRequest

Lớp FormRequest xử lý các biểu mẫu HTML bằng cách mở rộng yêu cầu cơ sở. Nó có lớp sau:

class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body, 
   cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])

Sau đây là tham số -

formdata - Đây là một từ điển có dữ liệu dạng HTML được gán cho phần thân của yêu cầu.

Note - Các tham số còn lại giống với lớp yêu cầu và được giải thích trong Request Objects phần.

Các phương thức lớp sau được hỗ trợ bởi FormRequest các đối tượng ngoài các phương thức yêu cầu -

classmethod from_response(response[, formname = None, formnumber = 0, formdata = None, 
   formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])

Bảng sau đây cho thấy các tham số của lớp trên:

Sr.No Mô tả về Thông Số
1

response

Nó là một đối tượng được sử dụng để điền trước các trường biểu mẫu bằng cách sử dụng biểu mẫu phản hồi HTML.

2

formname

Nó là một chuỗi mà biểu mẫu có thuộc tính name sẽ được sử dụng, nếu được chỉ định.

3

formnumber

Nó là một số nguyên của các biểu mẫu được sử dụng khi có nhiều biểu mẫu trong phản hồi.

4

formdata

Nó là một từ điển của các trường trong dữ liệu biểu mẫu được sử dụng để ghi đè.

5

formxpath

Nó là một chuỗi khi được chỉ định, biểu mẫu khớp với xpath được sử dụng.

6

formcss

Nó là một chuỗi khi được chỉ định, biểu mẫu khớp với bộ chọn css được sử dụng.

7

clickdata

Nó là một từ điển các thuộc tính được sử dụng để quan sát điều khiển được nhấp.

số 8

dont_click

Dữ liệu từ biểu mẫu sẽ được gửi mà không cần nhấp vào bất kỳ phần tử nào, khi được đặt thành true.

Ví dụ

Sau đây là một số ví dụ sử dụng yêu cầu:

Using FormRequest to send data via HTTP POST

Đoạn mã sau minh họa cách trả về FormRequest đối tượng khi bạn muốn sao chép biểu mẫu HTML POST trong trình thu thập dữ liệu của bạn -

return [FormRequest(url = "http://www.something.com/post/action", 
   formdata = {'firstname': 'John', 'lastname': 'dave'}, 
   callback = self.after_post)]

Using FormRequest.from_response() to simulate a user login

Thông thường, các trang web sử dụng các phần tử mà qua đó nó cung cấp các trường biểu mẫu được điền sẵn.

Các FormRequest.form_response() có thể được sử dụng khi bạn muốn các trường này được tự động điền trong khi cạo.

Ví dụ sau đây chứng minh điều này.

import scrapy  
class DemoSpider(scrapy.Spider): 
   name = 'demo' 
   start_urls = ['http://www.something.com/users/login.php']  
   def parse(self, response): 
      return scrapy.FormRequest.from_response( 
         response, 
         formdata = {'username': 'admin', 'password': 'confidential'}, 
         callback = self.after_login 
      )  
   
   def after_login(self, response): 
      if "authentication failed" in response.body: 
         self.logger.error("Login failed") 
         return  
      # You can continue scraping here

Đối tượng phản hồi

Nó là một đối tượng chỉ ra phản hồi HTTP được cấp cho các trình thu thập thông tin để xử lý. Nó có lớp sau:

class scrapy.http.Response(url[, status = 200, headers, body, flags])

Bảng sau đây cho thấy các tham số của các đối tượng Đáp ứng:

Sr.No Mô tả về Thông Số
1

url

Nó là một chuỗi chỉ định phản hồi URL.

2

status

Nó là một số nguyên chứa phản hồi trạng thái HTTP.

3

headers

Nó là một từ điển chứa các tiêu đề phản hồi.

4

body

Nó là một chuỗi với phần thân phản hồi.

5

flags

Nó là một danh sách chứa các cờ phản hồi.

Các lớp con phản hồi

Bạn có thể triển khai chức năng tùy chỉnh của riêng mình bằng cách phân lớp lớp phản hồi. Các lớp con phản hồi tích hợp như sau:

TextResponse objects

Đối tượng TextResponse được sử dụng cho dữ liệu nhị phân như hình ảnh, âm thanh, v.v. có khả năng mã hóa lớp Phản hồi cơ sở. Nó có lớp sau:

class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])

Sau đây là tham số -

encoding - Nó là một chuỗi có mã hóa được sử dụng để mã hóa một phản hồi.

Note - Các tham số còn lại giống với lớp phản hồi và được giải thích trong Response Objects phần.

Bảng sau đây cho thấy các thuộc tính được hỗ trợ bởi đối tượng TextResponse ngoài các phương thức phản hồi:

Sr.No Thuộc tính & Mô tả
1

text

Nó là một cơ quan phản hồi, nơi response.text có thể được truy cập nhiều lần.

2

encoding

Nó là một chuỗi chứa mã hóa cho phản hồi.

3

selector

Nó là một thuộc tính được khởi tạo trong lần truy cập đầu tiên và sử dụng phản hồi làm mục tiêu.

Bảng sau đây cho thấy các phương thức được hỗ trợ bởi các đối tượng TextResponse ngoài các phương thức phản hồi :

Sr.No Phương pháp & Mô tả
1

xpath (query)

Nó là một lối tắt đến TextResponse.selector.xpath (truy vấn).

2

css (query)

Nó là một phím tắt của TextResponse.selector.css (truy vấn).

3

body_as_unicode()

Nó là một cơ quan phản hồi có sẵn dưới dạng một phương thức, nơi response.text có thể được truy cập nhiều lần.

Đối tượng HtmlResponse

Nó là một đối tượng hỗ trợ mã hóa và tự động phát hiện bằng cách xem thuộc tính meta httpequiv của HTML. Các tham số của nó giống như lớp phản hồi và được giải thích trong phần Đối tượng phản hồi. Nó có lớp sau:

class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])

Đối tượng XmlResponse

Nó là một đối tượng hỗ trợ mã hóa và tự động phát hiện bằng cách nhìn vào dòng XML. Các tham số của nó giống như lớp phản hồi và được giải thích trong phần Đối tượng phản hồi. Nó có lớp sau:

class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])

Sự miêu tả

Như chính cái tên đã chỉ ra, Trình trích xuất liên kết là các đối tượng được sử dụng để trích xuất liên kết từ các trang web bằng cách sử dụng scrapy.http.Responsecác đối tượng. Trong Scrapy, có các công cụ trích xuất tích hợp nhưscrapy.linkextractors nhập khẩu LinkExtractor. Bạn có thể tùy chỉnh trình trích xuất liên kết của riêng mình theo nhu cầu của mình bằng cách triển khai một giao diện đơn giản.

Mỗi trình trích xuất liên kết có một phương thức công khai được gọi là extract_linkstrong đó bao gồm một đối tượng Response và trả về một danh sách các đối tượng scrapy.link.Link. Bạn có thể khởi tạo trình trích xuất liên kết chỉ một lần và gọi phương thức extract_links nhiều lần để trích xuất các liên kết với các phản hồi khác nhau. CrawlSpiderclass sử dụng trình trích xuất liên kết với một tập hợp các quy tắc có mục đích chính là trích xuất liên kết.

Tham chiếu trình trích xuất liên kết tích hợp

Thông thường, các trình trích xuất liên kết được nhóm với Scrapy và được cung cấp trong mô-đun scrapy.linkextractors. Theo mặc định, trình trích xuất liên kết sẽ là LinkExtractor có chức năng ngang bằng với LxmlLinkExtractor -

from scrapy.linkextractors import LinkExtractor

LxmlLinkExtractor

class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow = (), deny = (), 
   allow_domains = (), deny_domains = (), deny_extensions = None, restrict_xpaths = (), 
   restrict_css = (), tags = ('a', 'area'), attrs = ('href', ), 
   canonicalize = True, unique = True, process_value = None)

Các LxmlLinkExtractor là một liên kết vắt rất khuyến khích, bởi vì nó có tùy chọn lọc tiện dụng và nó được sử dụng với HTMLParser mạnh mẽ lxml của.

Sr.No Mô tả về Thông Số
1

allow (một biểu thức chính quy (hoặc danh sách))

Nó cho phép một biểu thức đơn lẻ hoặc một nhóm biểu thức phù hợp với url sẽ được trích xuất. Nếu nó không được đề cập, nó sẽ khớp với tất cả các liên kết.

2

deny (một biểu thức chính quy (hoặc danh sách))

Nó chặn hoặc loại trừ một biểu thức hoặc nhóm biểu thức duy nhất phải khớp với url không được trích xuất. Nếu nó không được đề cập hoặc để trống, thì nó sẽ không loại bỏ các liên kết không mong muốn.

3

allow_domains (str hoặc danh sách)

Nó cho phép một chuỗi đơn hoặc danh sách các chuỗi phải khớp với các miền mà từ đó các liên kết sẽ được trích xuất.

4

deny_domains (str hoặc danh sách)

Nó chặn hoặc loại trừ một chuỗi hoặc danh sách các chuỗi phải khớp với các miền mà từ đó các liên kết sẽ không được trích xuất.

5

deny_extensions (danh sách)

Nó chặn danh sách các chuỗi có phần mở rộng khi giải nén các liên kết. Nếu nó không được đặt, thì theo mặc định, nó sẽ được đặt thành IGNORED_EXTENSIONS chứa danh sách được xác định trước trong gói scrapy.linkextractors .

6

restrict_xpaths (str hoặc danh sách)

Nó là một vùng danh sách XPath từ đó các liên kết sẽ được trích xuất từ ​​phản hồi. Nếu được cung cấp, các liên kết sẽ chỉ được trích xuất từ ​​văn bản, được chọn bởi XPath.

7

restrict_css (str hoặc danh sách)

Nó hoạt động tương tự như tham số limit_xpaths sẽ trích xuất các liên kết từ các vùng được chọn CSS bên trong phản hồi.

số 8

tags (str hoặc danh sách)

Một thẻ đơn hoặc danh sách các thẻ cần được xem xét khi trích xuất các liên kết. Theo mặc định, nó sẽ là ('a', 'area').

9

attrs (danh sách)

Một thuộc tính hoặc danh sách các thuộc tính nên được xem xét trong khi trích xuất các liên kết. Theo mặc định, nó sẽ là ('href',).

10

canonicalize (boolean)

Url được trích xuất được đưa về dạng chuẩn bằng cách sử dụng scrapy.utils.url.canonicalize_url . Theo mặc định, nó sẽ là True.

11

unique (boolean)

Nó sẽ được sử dụng nếu các liên kết trích xuất được lặp lại.

12

process_value (có thể gọi được)

Nó là một hàm nhận một giá trị từ các thẻ và thuộc tính được quét. Giá trị nhận được có thể được thay đổi và trả lại hoặc nếu không sẽ không có gì được trả lại để từ chối liên kết. Nếu không được sử dụng, theo mặc định nó sẽ là lambda x: x.

Thí dụ

Đoạn mã sau được sử dụng để trích xuất các liên kết:

<a href = "javascript:goToPage('../other/page.html'); return false">Link text</a>

Hàm mã sau có thể được sử dụng trong process_value:

def process_value(val): 
   m = re.search("javascript:goToPage\('(.*?)'", val) 
   if m: 
      return m.group(1)

Sự miêu tả

Hành vi của các thành phần Scrapy có thể được sửa đổi bằng cách sử dụng cài đặt Scrapy. Cài đặt cũng có thể chọn dự án Trị liệu hiện đang hoạt động, trong trường hợp bạn có nhiều dự án Trị liệu.

Chỉ định cài đặt

Bạn phải thông báo cho Scrapy mà bạn đang sử dụng cài đặt nào khi quét một trang web. Đối với điều này, biến môi trườngSCRAPY_SETTINGS_MODULE nên được sử dụng và giá trị của nó phải theo cú pháp đường dẫn Python.

Điền vào Cài đặt

Bảng sau đây cho thấy một số cơ chế mà bạn có thể điền các cài đặt -

Sr.No Cơ chế & Mô tả
1

Command line options

Ở đây, các đối số được truyền được ưu tiên cao nhất bằng cách ghi đè các tùy chọn khác. -S được sử dụng để ghi đè một hoặc nhiều cài đặt.

scrapy crawl myspider -s LOG_FILE = scrapy.log
2

Settings per-spider

Spider có thể có các cài đặt riêng ghi đè các cài đặt của dự án bằng cách sử dụng thuộc tính custom_settings.

class DemoSpider(scrapy.Spider): 
   name = 'demo'  
   custom_settings = { 
      'SOME_SETTING': 'some value', 
   }
3

Project settings module

Tại đây, bạn có thể điền cài đặt tùy chỉnh của mình chẳng hạn như thêm hoặc sửa đổi cài đặt trong tệp settings.py.

4

Default settings per-command

Mỗi lệnh công cụ Scrapy xác định cài đặt riêng của nó trong thuộc tính default_settings, để ghi đè cài đặt mặc định chung.

5

Default global settings

Các cài đặt này được tìm thấy trong mô-đun scrapy.settings.default_settings.

Truy cập Cài đặt

Chúng có sẵn thông qua self.settings và được đặt trong spider cơ sở sau khi nó được khởi tạo.

Ví dụ sau đây chứng minh điều này.

class DemoSpider(scrapy.Spider): 
   name = 'demo' 
   start_urls = ['http://example.com']  
   def parse(self, response): 
      print("Existing settings: %s" % self.settings.attributes.keys())

Để sử dụng cài đặt trước khi khởi chạy trình thu thập dữ liệu, bạn phải ghi đè phương thức from_crawler trong phương thức _init_ () của trình thu thập dữ liệu của bạn. Bạn có thể truy cập cài đặt thông qua thuộc tính scrapy.crawler.Crawler.settings được chuyển tới phương thức from_crawler .

Ví dụ sau đây chứng minh điều này.

class MyExtension(object): 
   def __init__(self, log_is_enabled = False): 
      if log_is_enabled: 
         print("Enabled log") 
         @classmethod 
   def from_crawler(cls, crawler): 
      settings = crawler.settings 
      return cls(settings.getbool('LOG_ENABLED'))

Cơ sở lý luận để đặt tên

Tên cài đặt được thêm làm tiền tố cho thành phần mà chúng định cấu hình. Ví dụ: đối với tiện ích mở rộng robots.txt, tên cài đặt có thể là ROBOTSTXT_ENABLED, ROBOTSTXT_OBEY, ROBOTSTXT_CACHEDIR, v.v.

Tham chiếu cài đặt tích hợp

Bảng sau đây cho thấy các cài đặt tích hợp của Scrapy:

Sr.No Cài đặt & Mô tả
1

AWS_ACCESS_KEY_ID

Nó được sử dụng để truy cập Dịch vụ Web của Amazon.

Giá trị mặc định: Không có

2

AWS_SECRET_ACCESS_KEY

Nó được sử dụng để truy cập Dịch vụ Web của Amazon.

Giá trị mặc định: Không có

3

BOT_NAME

Nó là tên của bot có thể được sử dụng để xây dựng User-Agent.

Giá trị mặc định: 'scrapybot'

4

CONCURRENT_ITEMS

Số lượng mặt hàng hiện có tối đa trong Bộ xử lý mặt hàng được sử dụng để xử lý song song.

Giá trị mặc định: 100

5

CONCURRENT_REQUESTS

Số lượng yêu cầu hiện có tối đa mà trình tải xuống Scrapy thực hiện.

Giá trị mặc định: 16

6

CONCURRENT_REQUESTS_PER_DOMAIN

Số lượng yêu cầu hiện tại tối đa thực hiện đồng thời cho bất kỳ miền đơn lẻ nào.

Giá trị mặc định: 8

7

CONCURRENT_REQUESTS_PER_IP

Số lượng yêu cầu hiện có tối đa thực hiện đồng thời cho bất kỳ IP đơn lẻ nào.

Giá trị mặc định: 0

số 8

DEFAULT_ITEM_CLASS

Nó là một lớp được sử dụng để đại diện cho các mục.

Giá trị mặc định: 'scrapy.item.Item'

9

DEFAULT_REQUEST_HEADERS

Nó là một tiêu đề mặc định được sử dụng cho các yêu cầu HTTP của Scrapy.

Giá trị mặc định -

{  
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,
	*/*;q=0.8', 'Accept-Language': 'en',  
}
10

DEPTH_LIMIT

Độ sâu tối đa để một con nhện có thể thu thập dữ liệu bất kỳ trang web nào.

Giá trị mặc định: 0

11

DEPTH_PRIORITY

Nó là một số nguyên được sử dụng để thay đổi mức độ ưu tiên của yêu cầu theo độ sâu.

Giá trị mặc định: 0

12

DEPTH_STATS

Nó cho biết có thu thập số liệu thống kê về độ sâu hay không.

Giá trị mặc định: Đúng

13

DEPTH_STATS_VERBOSE

Cài đặt này khi được bật, số lượng yêu cầu được thu thập theo thống kê cho mỗi độ sâu chi tiết.

Giá trị mặc định: Sai

14

DNSCACHE_ENABLED

Nó được sử dụng để kích hoạt DNS trong bộ nhớ đệm.

Giá trị mặc định: Đúng

15

DNSCACHE_SIZE

Nó xác định kích thước của DNS trong bộ nhớ đệm.

Giá trị mặc định: 10000

16

DNS_TIMEOUT

Nó được sử dụng để đặt thời gian chờ cho DNS xử lý các truy vấn.

Giá trị mặc định: 60

17

DOWNLOADER

Nó là một trình tải xuống được sử dụng cho quá trình thu thập thông tin.

Giá trị mặc định: 'scrapy.core.downloader.Downloader'

18

DOWNLOADER_MIDDLEWARES

Nó là một từ điển chứa phần mềm trung gian của trình tải xuống và đơn đặt hàng của họ.

Giá trị mặc định: {}

19

DOWNLOADER_MIDDLEWARES_BASE

Nó là một từ điển chứa phần mềm trung gian của trình tải xuống được bật theo mặc định.

Giá trị mặc định -

{ 'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100, }
20

DOWNLOADER_STATS

Cài đặt này được sử dụng để kích hoạt số liệu thống kê của trình tải xuống.

Giá trị mặc định: Đúng

21

DOWNLOAD_DELAY

Nó xác định tổng thời gian cho trình tải xuống trước khi tải xuống các trang từ trang web.

Giá trị mặc định: 0

22

DOWNLOAD_HANDLERS

Nó là một từ điển với trình xử lý tải xuống.

Giá trị mặc định: {}

23

DOWNLOAD_HANDLERS_BASE

Nó là một từ điển có trình xử lý tải xuống được bật theo mặc định.

Giá trị mặc định -

{ 'file': 'scrapy.core.downloader.handlers.file.FileDownloadHandler', }
24

DOWNLOAD_TIMEOUT

Đó là tổng thời gian để người tải xuống đợi trước khi hết thời gian.

Giá trị mặc định: 180

25

DOWNLOAD_MAXSIZE

Đây là kích thước phản hồi tối đa để trình tải xuống tải xuống.

Giá trị mặc định: 1073741824 (1024MB)

26

DOWNLOAD_WARNSIZE

Nó xác định kích thước phản hồi để người tải xuống cảnh báo.

Giá trị mặc định: 33554432 (32MB)

27

DUPEFILTER_CLASS

Nó là một lớp được sử dụng để phát hiện và lọc các yêu cầu trùng lặp.

Giá trị mặc định: 'scrapy.dupefilters.RFPDupeFilter'

28

DUPEFILTER_DEBUG

Cài đặt này ghi lại tất cả các bộ lọc trùng lặp khi được đặt thành true.

Giá trị mặc định: Sai

29

EDITOR

Nó được sử dụng để chỉnh sửa các trình thu thập thông tin bằng lệnh chỉnh sửa.

Giá trị mặc định: Phụ thuộc vào môi trường

30

EXTENSIONS

Nó là một từ điển có phần mở rộng được kích hoạt trong dự án.

Giá trị mặc định: {}

31

EXTENSIONS_BASE

Nó là một từ điển có các phần mở rộng được tích hợp sẵn.

Giá trị mặc định: {'scrapy.extensions.corestats.CoreStats': 0,}

32

FEED_TEMPDIR

Đây là một thư mục được sử dụng để đặt thư mục tùy chỉnh nơi các tệp tạm thời của trình thu thập thông tin có thể được lưu trữ.

33

ITEM_PIPELINES

Nó là một từ điển có đường ống.

Giá trị mặc định: {}

34

LOG_ENABLED

Nó xác định xem việc ghi nhật ký có được bật hay không.

Giá trị mặc định: Đúng

35

LOG_ENCODING

Nó xác định loại mã hóa được sử dụng để ghi nhật ký.

Giá trị mặc định: 'utf-8'

36

LOG_FILE

Đây là tên của tệp được sử dụng cho kết quả ghi nhật ký.

Giá trị mặc định: Không có

37

LOG_FORMAT

Nó là một chuỗi sử dụng mà các thông điệp nhật ký có thể được định dạng.

Giá trị mặc định: '% (asctime) s [% (name) s]% (levelname) s:% (message) s'

38

LOG_DATEFORMAT

Nó là một chuỗi sử dụng ngày / giờ có thể được định dạng.

Giá trị mặc định: '% Y-% m-% d% H:% M:% S'

39

LOG_LEVEL

Nó xác định mức nhật ký tối thiểu.

Giá trị mặc định: 'DEBUG'

40

LOG_STDOUT

Cài đặt này nếu được đặt thành true, tất cả đầu ra quy trình của bạn sẽ xuất hiện trong nhật ký.

Giá trị mặc định: Sai

41

MEMDEBUG_ENABLED

Nó xác định xem có bật gỡ lỗi bộ nhớ hay không.

Giá trị mặc định: Sai

42

MEMDEBUG_NOTIFY

Nó xác định báo cáo bộ nhớ được gửi đến một địa chỉ cụ thể khi gỡ lỗi bộ nhớ được kích hoạt.

Giá trị mặc định: []

43

MEMUSAGE_ENABLED

Nó xác định xem việc sử dụng bộ nhớ có được bật hay không khi quá trình Scrapy vượt quá giới hạn bộ nhớ.

Giá trị mặc định: Sai

44

MEMUSAGE_LIMIT_MB

Nó xác định giới hạn tối đa cho phép của bộ nhớ (tính bằng megabyte).

Giá trị mặc định: 0

45

MEMUSAGE_CHECK_INTERVAL_SECONDS

Nó được sử dụng để kiểm tra việc sử dụng bộ nhớ hiện tại bằng cách đặt độ dài của các khoảng thời gian.

Giá trị mặc định: 60.0

46

MEMUSAGE_NOTIFY_MAIL

Nó được sử dụng để thông báo với một danh sách các email khi bộ nhớ đạt đến giới hạn.

Giá trị mặc định: Sai

47

MEMUSAGE_REPORT

Nó xác định nếu báo cáo sử dụng bộ nhớ sẽ được gửi khi đóng mỗi con nhện.

Giá trị mặc định: Sai

48

MEMUSAGE_WARNING_MB

Nó xác định tổng bộ nhớ được phép trước khi cảnh báo được gửi đi.

Giá trị mặc định: 0

49

NEWSPIDER_MODULE

Nó là một mô-đun nơi một con nhện mới được tạo bằng lệnh genspider.

Giá trị mặc định: ''

50

RANDOMIZE_DOWNLOAD_DELAY

Nó xác định một khoảng thời gian ngẫu nhiên để Scrapy chờ trong khi tải xuống các yêu cầu từ trang web.

Giá trị mặc định: Đúng

51

REACTOR_THREADPOOL_MAXSIZE

Nó xác định kích thước tối đa cho threadpool của lò phản ứng.

Giá trị mặc định: 10

52

REDIRECT_MAX_TIMES

Nó xác định số lần một yêu cầu có thể được chuyển hướng.

Giá trị mặc định: 20

53

REDIRECT_PRIORITY_ADJUST

Cài đặt này khi được đặt sẽ điều chỉnh mức độ ưu tiên chuyển hướng của một yêu cầu.

Giá trị mặc định: +2

54

RETRY_PRIORITY_ADJUST

Cài đặt này khi được đặt, sẽ điều chỉnh mức độ ưu tiên thử lại của một yêu cầu.

Giá trị mặc định: -1

55

ROBOTSTXT_OBEY

Scrapy tuân theo chính sách robots.txt khi được đặt thành true .

Giá trị mặc định: Sai

56

SCHEDULER

Nó xác định bộ lập lịch được sử dụng cho mục đích thu thập thông tin.

Giá trị mặc định: 'scrapy.core.scheduler.Scheduler'

57

SPIDER_CONTRACTS

Đó là một từ điển trong dự án có hợp đồng nhện để kiểm tra nhện.

Giá trị mặc định: {}

58

SPIDER_CONTRACTS_BASE

Nó là một từ điển chứa các hợp đồng Scrapy được kích hoạt trong Scrapy theo mặc định.

Giá trị mặc định -

{ 
   'scrapy.contracts.default.UrlContract' : 1, 
   'scrapy.contracts.default.ReturnsContract': 2, 
}
59

SPIDER_LOADER_CLASS

Nó định nghĩa một lớp triển khai API SpiderLoader để tải các trình thu thập thông tin.

Giá trị mặc định: 'scrapy.spiderloader.SpiderLoader'

60

SPIDER_MIDDLEWARES

Nó là một từ điển chứa phần mềm trung gian của nhện.

Giá trị mặc định: {}

61

SPIDER_MIDDLEWARES_BASE

Nó là một từ điển chứa phần mềm trung gian spider được bật trong Scrapy theo mặc định.

Giá trị mặc định -

{ 
   'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50, 
}
62

SPIDER_MODULES

Đây là danh sách các mô-đun chứa các trình thu thập dữ liệu mà Scrapy sẽ tìm kiếm.

Giá trị mặc định: []

63

STATS_CLASS

Nó là một lớp triển khai API Bộ thu thập số liệu thống kê để thu thập số liệu thống kê.

Giá trị mặc định: 'scrapy.statscollectors.MemoryStatsCollector'

64

STATS_DUMP

Cài đặt này khi được đặt thành true, kết xuất số liệu thống kê vào nhật ký.

Default value: True

65

STATSMAILER_RCPTS

Once the spiders finish scraping, Scrapy uses this setting to send the stats.

Default value: []

66

TELNETCONSOLE_ENABLED

It defines whether to enable the telnetconsole.

Default value: True

67

TELNETCONSOLE_PORT

It defines a port for telnet console.

Default value: [6023, 6073]

68

TEMPLATES_DIR

It is a directory containing templates that can be used while creating new projects.

Default value: templates directory inside scrapy module

69

URLLENGTH_LIMIT

It defines the maximum limit of the length for URL to be allowed for crawled URLs.

Default value: 2083

70

USER_AGENT

It defines the user agent to be used while crawling a site.

Default value: "Scrapy/VERSION (+http://scrapy.org)"

For other Scrapy settings, go to this link.

Description

The irregular events are referred to as exceptions. In Scrapy, exceptions are raised due to reasons such as missing configuration, dropping item from the item pipeline, etc. Following is the list of exceptions mentioned in Scrapy and their application.

DropItem

Item Pipeline utilizes this exception to stop processing of the item at any stage. It can be written as −

exception (scrapy.exceptions.DropItem)

CloseSpider

This exception is used to stop the spider using the callback request. It can be written as −

exception (scrapy.exceptions.CloseSpider)(reason = 'cancelled')

It contains parameter called reason (str) which specifies the reason for closing.

For instance, the following code shows this exception usage −

def parse_page(self, response): 
   if 'Bandwidth exceeded' in response.body: 
      raise CloseSpider('bandwidth_exceeded')

IgnoreRequest

This exception is used by scheduler or downloader middleware to ignore a request. It can be written as −

exception (scrapy.exceptions.IgnoreRequest)

NotConfigured

It indicates a missing configuration situation and should be raised in a component constructor.

exception (scrapy.exceptions.NotConfigured)

Ngoại lệ này có thể được nêu ra, nếu bất kỳ thành phần nào sau đây bị vô hiệu hóa.

  • Extensions
  • Đường ống mặt hàng
  • Phần mềm trung gian của trình tải xuống
  • Phần mềm trung gian Spider

Không được hỗ trợ

Ngoại lệ này được nêu ra khi bất kỳ tính năng hoặc phương pháp nào không được hỗ trợ. Nó có thể được viết là -

exception (scrapy.exceptions.NotSupported)

Sự miêu tả

Để loại bỏ dữ liệu từ các trang web, trước tiên bạn cần tạo dự án Scrapy nơi bạn sẽ lưu trữ mã. Để tạo một thư mục mới, hãy chạy lệnh sau:

scrapy startproject first_scrapy

Đoạn mã trên sẽ tạo một thư mục với tên first_scrapy và nó sẽ chứa cấu trúc sau:

first_scrapy/
scrapy.cfg            # deploy configuration file
first_scrapy/         # project's Python module, you'll import your code from here
__init__.py
items.py              # project items file
pipelines.py          # project pipelines file
settings.py           # project settings file
spiders/              # a directory where you'll later put your spiders
__init__.py

Sự miêu tả

Các mục là các thùng chứa được sử dụng để thu thập dữ liệu được loại bỏ từ các trang web. Bạn phải bắt đầu con nhện của mình bằng cách xác định Mục của bạn. Để xác định các mục, hãy chỉnh sửaitems.py tập tin được tìm thấy trong thư mục first_scrapy(thư mục tùy chỉnh). Các items.py trông giống như sau:

import scrapy  

class First_scrapyItem(scrapy.Item): 
   # define the fields for your item here like: 
      # name = scrapy.Field()

Lớp MyItem kế thừa từ Item chứa một số đối tượng được xác định trước mà Scrapy đã xây dựng cho chúng ta. Ví dụ: nếu bạn muốn trích xuất tên, URL và mô tả từ các trang web, bạn cần xác định các trường cho từng thuộc tính trong số ba thuộc tính này.

Do đó, hãy thêm những vật phẩm mà chúng ta muốn thu thập -

from scrapy.item import Item, Field  

class First_scrapyItem(scrapy.Item): 
   name = scrapy.Field() 
   url = scrapy.Field() 
   desc = scrapy.Field()

Sự miêu tả

Spider là một lớp xác định URL ban đầu để trích xuất dữ liệu, cách đi theo các liên kết phân trang và cách trích xuất và phân tích cú pháp các trường được xác định trong items.py. Scrapy cung cấp các loại nhện khác nhau, mỗi loại sẽ cho một mục đích cụ thể.

Tạo một tệp có tên "first_spider.py"trong thư mục first_scrapy / spiders, nơi chúng tôi có thể cho Scrapy biết cách tìm dữ liệu chính xác mà chúng tôi đang tìm kiếm. Đối với điều này, bạn phải xác định một số thuộc tính -

  • name - Nó xác định tên duy nhất cho con nhện.

  • allowed_domains - Nó chứa các URL cơ sở để con nhện thu thập thông tin.

  • start-urls - Danh sách các URL từ nơi con nhện bắt đầu thu thập thông tin.

  • parse() - Nó là một phương pháp trích xuất và phân tích cú pháp dữ liệu đã được cạo.

Đoạn mã sau minh họa cách mã spider trông như thế nào:

import scrapy  

class firstSpider(scrapy.Spider): 
   name = "first" 
   allowed_domains = ["dmoz.org"] 
   
   start_urls = [ 
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" 
   ]  
   def parse(self, response): 
      filename = response.url.split("/")[-2] + '.html' 
      with open(filename, 'wb') as f: 
         f.write(response.body)

Sự miêu tả

Để thực thi trình thu thập thông tin của bạn, hãy chạy lệnh sau trong thư mục first_scrapy của bạn -

scrapy crawl first

Ở đâu, first là tên của con nhện được chỉ định trong khi tạo con nhện.

Sau khi con nhện thu thập thông tin, bạn có thể thấy kết quả sau:

2016-08-09 18:13:07-0400 [scrapy] INFO: Scrapy started (bot: tutorial)
2016-08-09 18:13:07-0400 [scrapy] INFO: Optional features available: ...
2016-08-09 18:13:07-0400 [scrapy] INFO: Overridden settings: {}
2016-08-09 18:13:07-0400 [scrapy] INFO: Enabled extensions: ...
2016-08-09 18:13:07-0400 [scrapy] INFO: Enabled downloader middlewares: ...
2016-08-09 18:13:07-0400 [scrapy] INFO: Enabled spider middlewares: ...
2016-08-09 18:13:07-0400 [scrapy] INFO: Enabled item pipelines: ...
2016-08-09 18:13:07-0400 [scrapy] INFO: Spider opened
2016-08-09 18:13:08-0400 [scrapy] DEBUG: Crawled (200) 
<GET http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/> (referer: None)
2016-08-09 18:13:09-0400 [scrapy] DEBUG: Crawled (200) 
<GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: None)
2016-08-09 18:13:09-0400 [scrapy] INFO: Closing spider (finished)

Như bạn có thể thấy trong đầu ra, đối với mỗi URL có một dòng nhật ký (tham chiếu: Không có) cho biết rằng các URL là URL bắt đầu và chúng không có liên kết giới thiệu. Tiếp theo, bạn sẽ thấy hai tệp mới có tên Books.htmlResources.html được tạo trong thư mục first_scrapy của bạn .

Sự miêu tả

Để trích xuất dữ liệu từ các trang web, Scrapy sử dụng một kỹ thuật được gọi là bộ chọn dựa trên các biểu thức XPath và CSS . Sau đây là một số ví dụ về biểu thức XPath:

  • /html/head/title - Thao tác này sẽ chọn phần tử <title>, bên trong phần tử <head> của tài liệu HTML.

  • /html/head/title/text() - Thao tác này sẽ chọn văn bản trong cùng một phần tử <title>.

  • //td - Thao tác này sẽ chọn tất cả các phần tử từ <td>.

  • //div[@class = "slice"]- Thao tác này sẽ chọn tất cả các phần tử từ div có chứa thuộc tính class = "slice"

Bộ chọn có bốn phương pháp cơ bản như được hiển thị trong bảng sau:

Sr.No Phương pháp & Mô tả
1

extract()

Nó trả về một chuỗi unicode cùng với dữ liệu đã chọn.

2

re()

Nó trả về một danh sách các chuỗi unicode, được trích xuất khi biểu thức chính quy được cung cấp dưới dạng đối số.

3

xpath()

Nó trả về một danh sách các bộ chọn, đại diện cho các nút được chọn bởi biểu thức xpath được đưa ra làm đối số.

4

css()

Nó trả về một danh sách các bộ chọn, đại diện cho các nút được chọn bởi biểu thức CSS được cung cấp làm đối số.

Sử dụng Bộ chọn trong Vỏ

Để trình diễn các bộ chọn với vỏ Scrapy tích hợp, bạn cần phải cài đặt IPython trong hệ thống của mình. Điều quan trọng ở đây là, các URL phải được bao gồm trong dấu ngoặc kép khi chạy Scrapy; nếu không, các URL có ký tự '&' sẽ không hoạt động. Bạn có thể bắt đầu một trình bao bằng cách sử dụng lệnh sau trong thư mục cấp cao nhất của dự án -

scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"

Một shell sẽ giống như sau:

[ ... Scrapy log here ... ]

2014-01-23 17:11:42-0400 [scrapy] DEBUG: Crawled (200) 
<GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>(referer: None)
[s] Available Scrapy objects:
[s]   crawler    <scrapy.crawler.Crawler object at 0x3636b50>
[s]   item       {}
[s]   request    <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   response   <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   settings   <scrapy.settings.Settings object at 0x3fadc50>
[s]   spider     <Spider 'default' at 0x3cebf50>
[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects
[s]   view(response)    View response in a browser

In [1]:

Khi trình bao tải, bạn có thể truy cập phần nội dung hoặc tiêu đề bằng cách sử dụng response.bodyresponse.header tương ứng. Tương tự, bạn có thể chạy các truy vấn về phản hồi bằng cách sử dụng response.selector.xpath () hoặc response.selector.css () .

Ví dụ -

In [1]: response.xpath('//title')
Out[1]: [<Selector xpath = '//title' data = u'<title>My Book - Scrapy'>]

In [2]: response.xpath('//title').extract()
Out[2]: [u'<title>My Book - Scrapy: Index: Chapters</title>']

In [3]: response.xpath('//title/text()')
Out[3]: [<Selector xpath = '//title/text()' data = u'My Book - Scrapy: Index:'>]

In [4]: response.xpath('//title/text()').extract()
Out[4]: [u'My Book - Scrapy: Index: Chapters']

In [5]: response.xpath('//title/text()').re('(\w+):')
Out[5]: [u'Scrapy', u'Index', u'Chapters']

Trích xuất dữ liệu

Để trích xuất dữ liệu từ một trang HTML thông thường, chúng tôi phải kiểm tra mã nguồn của trang đó để lấy XPath. Sau khi kiểm tra, bạn có thể thấy rằng dữ liệu sẽ nằm trongulnhãn. Chọn các phần tử bên trongli nhãn.

Các dòng mã sau đây cho thấy việc trích xuất các loại dữ liệu khác nhau:

Để chọn dữ liệu trong thẻ li -

response.xpath('//ul/li')

Để chọn mô tả -

response.xpath('//ul/li/text()').extract()

Để chọn tiêu đề trang web -

response.xpath('//ul/li/a/text()').extract()

Để chọn liên kết trang web -

response.xpath('//ul/li/a/@href').extract()

Đoạn mã sau minh họa việc sử dụng các trình giải nén trên:

import scrapy

class MyprojectSpider(scrapy.Spider):
   name = "project"
   allowed_domains = ["dmoz.org"]
   
   start_urls = [
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
   ]
   def parse(self, response):
      for sel in response.xpath('//ul/li'):
         title = sel.xpath('a/text()').extract()
         link = sel.xpath('a/@href').extract()
         desc = sel.xpath('text()').extract()
         print title, link, desc

Sự miêu tả

Itemcác đối tượng là các dòng thông thường của Python. Chúng ta có thể sử dụng cú pháp sau để truy cập các thuộc tính của lớp:

>>> item = DmozItem()
>>> item['title'] = 'sample title'
>>> item['title']
'sample title'

Thêm đoạn mã trên vào ví dụ sau:

import scrapy

from tutorial.items import DmozItem

class MyprojectSpider(scrapy.Spider):
   name = "project"
   allowed_domains = ["dmoz.org"]
   
   start_urls = [
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
      "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
   ]
   def parse(self, response):
      for sel in response.xpath('//ul/li'):
         item = DmozItem()
         item['title'] = sel.xpath('a/text()').extract()
         item['link'] = sel.xpath('a/@href').extract()
         item['desc'] = sel.xpath('text()').extract()
         yield item

Đầu ra của con nhện trên sẽ là -

[scrapy] DEBUG: Scraped from <200 
http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
   {'desc': [u' - By David Mertz; Addison Wesley. Book in progress, full text, 
      ASCII format. Asks for feedback. [author website, Gnosis Software, Inc.\n],
   'link': [u'http://gnosis.cx/TPiP/'],
   'title': [u'Text Processing in Python']}
[scrapy] DEBUG: Scraped from <200 
http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
   {'desc': [u' - By Sean McGrath; Prentice Hall PTR, 2000, ISBN 0130211192, 
      has CD-ROM. Methods to build XML applications fast, Python tutorial, DOM and 
      SAX, new Pyxie open source XML processing library. [Prentice Hall PTR]\n'],
   'link': [u'http://www.informit.com/store/product.aspx?isbn=0130211192'],
   'title': [u'XML Processing with Python']}

Sự miêu tả

Trong chương này, chúng ta sẽ nghiên cứu cách trích xuất liên kết của các trang mà chúng ta quan tâm, theo dõi chúng và trích xuất dữ liệu từ trang đó. Đối với điều này, chúng tôi cần thực hiện các thay đổi sau trong mã trước đó của chúng tôi được hiển thị như sau:

import scrapy
from tutorial.items import DmozItem

class MyprojectSpider(scrapy.Spider):
   name = "project"
   allowed_domains = ["dmoz.org"]
   
   start_urls = [
      "http://www.dmoz.org/Computers/Programming/Languages/Python/",
   ]
   def parse(self, response):
      for href in response.css("ul.directory.dir-col > li > a::attr('href')"):
         url = response.urljoin(href.extract())
            yield scrapy.Request(url, callback = self.parse_dir_contents)

   def parse_dir_contents(self, response):
      for sel in response.xpath('//ul/li'):
         item = DmozItem()
         item['title'] = sel.xpath('a/text()').extract()
         item['link'] = sel.xpath('a/@href').extract()
         item['desc'] = sel.xpath('text()').extract()
         yield item

Đoạn mã trên chứa các phương thức sau:

  • parse() - Nó sẽ trích xuất các liên kết mà chúng ta quan tâm.

  • response.urljoin - Phương thức parse () sẽ sử dụng phương thức này để xây dựng một url mới và cung cấp một yêu cầu mới, yêu cầu này sẽ được gửi sau đó để gọi lại.

  • parse_dir_contents() - Đây là một lệnh gọi lại sẽ thực sự thu thập dữ liệu quan tâm.

Ở đây, Scrapy sử dụng cơ chế gọi lại để đi theo các liên kết. Bằng cách sử dụng cơ chế này, trình thu thập thông tin lớn hơn có thể được thiết kế và có thể theo các liên kết quan tâm để thu thập dữ liệu mong muốn từ các trang khác nhau. Phương thức thông thường sẽ là phương thức gọi lại, phương thức này sẽ trích xuất các mục, tìm kiếm các liên kết để theo dõi trang tiếp theo và sau đó cung cấp một yêu cầu cho cùng một cuộc gọi lại.

Ví dụ sau đây tạo ra một vòng lặp, vòng lặp này sẽ theo các liên kết đến trang tiếp theo.

def parse_articles_follow_next_page(self, response):
   for article in response.xpath("//article"):
      item = ArticleItem()
    
      ... extract article data here

      yield item

   next_page = response.css("ul.navigation > li.next-page > a::attr('href')")
   if next_page:
      url = response.urljoin(next_page[0].extract())
      yield scrapy.Request(url, self.parse_articles_follow_next_page)

Sự miêu tả

Cách tốt nhất để lưu trữ dữ liệu cóp nhặt là sử dụng xuất Nguồn cấp dữ liệu, điều này đảm bảo rằng dữ liệu đang được lưu trữ đúng cách bằng nhiều định dạng tuần tự hóa. Các dòng JSON, JSON, CSV, XML là các định dạng được hỗ trợ sẵn sàng trong các định dạng tuần tự hóa. Dữ liệu có thể được lưu trữ bằng lệnh sau:

scrapy crawl dmoz -o data.json

Lệnh này sẽ tạo ra một data.jsontệp chứa dữ liệu cóp nhặt trong JSON. Kỹ thuật này phù hợp với lượng dữ liệu nhỏ. Nếu phải xử lý một lượng lớn dữ liệu, thì chúng ta có thể sử dụng Đường ống mục. Cũng giống như tệp data.json, tệp dành riêng được thiết lập khi dự án được tạo trongtutorial/pipelines.py.

Sự miêu tả

Loggingcó nghĩa là theo dõi các sự kiện, sử dụng hệ thống ghi nhật ký cài sẵn và xác định các chức năng và lớp để triển khai các ứng dụng và thư viện. Ghi nhật ký là một tài liệu sẵn sàng sử dụng, có thể hoạt động với cài đặt Trị liệu được liệt kê trong cài đặt Ghi nhật ký.

Scrapy sẽ đặt một số cài đặt mặc định và xử lý các cài đặt đó với sự trợ giúp của scrapy.utils.log.configure_logging () khi chạy lệnh.

Mức độ nhật ký

Trong Python, có năm mức độ nghiêm trọng khác nhau trên một thông báo nhật ký. Danh sách sau đây hiển thị các thông báo nhật ký tiêu chuẩn theo thứ tự tăng dần -

  • logging.DEBUG - để gỡ lỗi thông báo (mức độ nghiêm trọng thấp nhất)

  • logging.INFO - cho các tin nhắn thông tin

  • logging.WARNING - cho các thông báo cảnh báo

  • logging.ERROR - đối với các lỗi thường xuyên

  • logging.CRITICAL - đối với các lỗi nghiêm trọng (mức độ nghiêm trọng cao nhất)

Cách ghi nhật ký tin nhắn

Đoạn mã sau cho thấy ghi nhật ký một tin nhắn bằng logging.info cấp độ.

import logging 
logging.info("This is an information")

Thông báo ghi nhật ký ở trên có thể được chuyển như một đối số bằng cách sử dụng logging.log được hiển thị như sau -

import logging 
logging.log(logging.INFO, "This is an information")

Bây giờ, bạn cũng có thể sử dụng trình ghi nhật ký để đính kèm thông báo bằng cách ghi nhật ký trình trợ giúp ghi nhật ký để thông báo ghi nhật ký được hiển thị rõ ràng như sau:

import logging
logger = logging.getLogger()
logger.info("This is an information")

Có thể có nhiều trình ghi nhật ký và chúng có thể được truy cập bằng cách lấy tên của chúng bằng cách sử dụng logging.getLogger chức năng hiển thị như sau.

import logging
logger = logging.getLogger('mycustomlogger')
logger.info("This is an information")

Một trình ghi nhật ký tùy chỉnh có thể được sử dụng cho bất kỳ mô-đun nào bằng cách sử dụng biến __name__ chứa đường dẫn mô-đun được hiển thị như sau:

import logging
logger = logging.getLogger(__name__)
logger.info("This is an information")

Ghi nhật ký từ Spiders

Mỗi phiên bản nhện đều có logger bên trong nó và có thể được sử dụng như sau:

import scrapy 

class LogSpider(scrapy.Spider):  
   name = 'logspider' 
   start_urls = ['http://dmoz.com']  
   def parse(self, response): 
      self.logger.info('Parse function called on %s', response.url)

Trong đoạn mã trên, trình ghi nhật ký được tạo bằng tên của Spider, nhưng bạn có thể sử dụng bất kỳ trình ghi nhật ký tùy chỉnh nào do Python cung cấp như được hiển thị trong đoạn mã sau:

import logging
import scrapy

logger = logging.getLogger('customizedlogger')
class LogSpider(scrapy.Spider):
   name = 'logspider'
   start_urls = ['http://dmoz.com']

   def parse(self, response):
      logger.info('Parse function called on %s', response.url)

Cấu hình ghi nhật ký

Người ghi nhật ký không thể tự hiển thị các tin nhắn do họ gửi. Vì vậy, họ yêu cầu "trình xử lý" để hiển thị các thông báo đó và trình xử lý sẽ chuyển hướng các thư này đến các đích tương ứng như tệp, email và đầu ra chuẩn.

Tùy thuộc vào các cài đặt sau, Scrapy sẽ định cấu hình trình xử lý cho trình ghi nhật ký.

Cài đặt ghi nhật ký

Các cài đặt sau được sử dụng để định cấu hình ghi nhật ký -

  • Các LOG_FILELOG_ENABLED quyết định điểm đến cho các thông điệp nhật ký.

  • Khi bạn đặt LOG_ENCODING thành false, nó sẽ không hiển thị thông báo đầu ra nhật ký.

  • Các LOG_LEVELsẽ xác định mức độ nghiêm trọng của thông báo; những thông báo ít nghiêm trọng hơn sẽ được lọc ra.

  • Các LOG_FORMATLOG_DATEFORMAT được sử dụng để chỉ định bố cục cho tất cả các thư.

  • Khi bạn đặt LOG_STDOUT thành true, tất cả đầu ra tiêu chuẩn và thông báo lỗi của quy trình của bạn sẽ được chuyển hướng sang nhật ký.

Tùy chọn dòng lệnh

Cài đặt trị liệu có thể được ghi đè bằng cách chuyển các đối số dòng lệnh như được hiển thị trong bảng sau:

Sr.No Lệnh & Mô tả
1

--logfile FILE

Ghi đè LOG_FILE

2

--loglevel/-L LEVEL

Ghi đè LOG_LEVEL

3

--nolog

Đặt LOG_ENABLED thành Sai

mô-đun scrapy.utils.log

Chức năng này có thể được sử dụng để khởi tạo mặc định ghi nhật ký cho Scrapy.

scrapy.utils.log.configure_logging(settings = None, install_root_handler = True)

Sr.No Mô tả về Thông Số
1

settings (dict, None)

Nó tạo và cấu hình trình xử lý cho root logger. Theo mặc định, nó là Không có .

2

install_root_handler (bool)

Nó chỉ định cài đặt trình xử lý ghi nhật ký gốc. Theo mặc định, nó là True .

Chức năng trên -

  • Cảnh báo định tuyến và ghi nhật ký xoắn thông qua ghi nhật ký tiêu chuẩn Python.
  • Gán DEBUG cho cấp Scrapy và ERROR cho các trình ghi xoắn.
  • Định tuyến stdout để ghi nhật ký, nếu cài đặt LOG_STDOUT là đúng.

Các tùy chọn mặc định có thể được ghi đè bằng cách sử dụng settingstranh luận. Khi cài đặt không được chỉ định, thì mặc định sẽ được sử dụng. Trình xử lý có thể được tạo cho trình ghi gốc, khi install_root_handler được đặt thành true. Nếu nó được đặt thành false, thì sẽ không có bất kỳ đầu ra nhật ký nào được đặt. Khi sử dụng các lệnh Scrapy, config_logging sẽ được gọi tự động và nó có thể chạy rõ ràng, trong khi chạy các tập lệnh tùy chỉnh.

Để định cấu hình đầu ra của ghi nhật ký theo cách thủ công, bạn có thể sử dụng logging.basicConfig() được hiển thị như sau -

import logging 
from scrapy.utils.log import configure_logging  

configure_logging(install_root_handler = False) 
logging.basicConfig ( 
   filename = 'logging.txt', 
   format = '%(levelname)s: %(your_message)s', 
   level = logging.INFO 
)

Sự miêu tả

Stats Collector là một cơ sở được cung cấp bởi Scrapy để thu thập số liệu thống kê dưới dạng khóa / giá trị và nó được truy cập bằng cách sử dụng Crawler API (Crawler cung cấp quyền truy cập vào tất cả các thành phần cốt lõi của Scrapy). Bộ thu thập số liệu thống kê cung cấp một bảng thống kê cho mỗi con nhện trong đó bộ thu thập số liệu thống kê sẽ tự động mở khi con nhện đang mở và đóng bộ thu thập số liệu thống kê khi con nhện bị đóng.

Sử dụng Trình thu thập số liệu thống kê phổ biến

Đoạn mã sau truy cập bộ thu thập số liệu thống kê bằng cách sử dụng stats thuộc tính.

class ExtensionThatAccessStats(object): 
   def __init__(self, stats): 
      self.stats = stats  
   
   @classmethod 
   def from_crawler(cls, crawler): 
      return cls(crawler.stats)

Bảng sau đây cho thấy các tùy chọn khác nhau có thể được sử dụng với bộ thu thập số liệu thống kê -

Sr.No Thông số Sự miêu tả
1
stats.set_value('hostname', socket.gethostname())
Nó được sử dụng để đặt giá trị thống kê.
2
stats.inc_value('customized_count')
Nó làm tăng giá trị thống kê.
3
stats.max_value('max_items_scraped', value)
Bạn có thể đặt giá trị thống kê, chỉ khi lớn hơn giá trị trước đó.
4
stats.min_value('min_free_memory_percent', value)
Bạn có thể đặt giá trị thống kê, chỉ khi thấp hơn giá trị trước đó.
5
stats.get_value('customized_count')
Nó tìm nạp giá trị thống kê.
6
stats.get_stats() {'custom_count': 1, 'start_time': 
datetime.datetime(2009, 7, 14, 21, 47, 28, 977139)}
Nó tìm nạp tất cả các số liệu thống kê

Bộ sưu tập số liệu thống kê có sẵn

Scrapy cung cấp các loại bộ thu thập số liệu thống kê khác nhau có thể được truy cập bằng cách sử dụng STATS_CLASS cài đặt.

MemoryStatsCollector

Nó là bộ thu thập số liệu thống kê mặc định duy trì số liệu thống kê của mọi con nhện được sử dụng để cạo và dữ liệu sẽ được lưu trữ trong bộ nhớ.

class scrapy.statscollectors.MemoryStatsCollector

DummyStatsCollector

Bộ thu thập số liệu thống kê này rất hiệu quả mà không làm gì cả. Điều này có thể được đặt bằng cách sử dụng cài đặt STATS_CLASS và có thể được sử dụng để tắt thu thập số liệu thống kê nhằm cải thiện hiệu suất.

class scrapy.statscollectors.DummyStatsCollector

Sự miêu tả

Scrapy có thể gửi e-mail bằng cách sử dụng cơ sở của riêng nó được gọi là IO không chặn xoắn , giúp tránh xa IO không chặn của trình thu thập thông tin. Bạn có thể định cấu hình một số cài đặt gửi email và cung cấp API đơn giản để gửi tệp đính kèm.

Có hai cách để khởi tạo MailSender như được hiển thị trong bảng sau:

Sr.No Thông số phương pháp
1 from scrapy.mail import MailSender mailer = MailSender () Bằng cách sử dụng một hàm tạo chuẩn.
2 mailer = MailSender.from_settings (cài đặt) Bằng cách sử dụng đối tượng cài đặt Scrapy.

Dòng sau gửi e-mail không có tệp đính kèm:

mailer.send(to = ["[email protected]"], subject = "subject data", body = "body data", 
   cc = ["[email protected]"])

Tham chiếu lớp MailSender

Lớp MailSender sử dụng IO không chặn Twisted để gửi e-mail từ Scrapy.

class scrapy.mail.MailSender(smtphost = None, mailfrom = None, smtpuser = None, 
   smtppass = None, smtpport = None)

Bảng sau đây cho thấy các tham số được sử dụng trong lớp MailSender :

Sr.No Mô tả về Thông Số
1

smtphost (str)

Máy chủ lưu trữ SMTP được sử dụng để gửi email. Nếu không, thì cài đặt MAIL_HOST sẽ được sử dụng.

2

mailfrom (str)

Địa chỉ của người nhận được sử dụng để gửi email. Nếu không, thì cài đặt MAIL_FROM sẽ được sử dụng.

3

smtpuser

Nó chỉ định người dùng SMTP. Nếu nó không được sử dụng, thì cài đặt MAIL_USER sẽ được sử dụng và sẽ không có xác thực SMTP nếu không được đề cập.

4

smtppass (str)

Nó chỉ định pass SMTP để xác thực.

5

smtpport (int)

Nó chỉ định cổng SMTP để kết nối.

6

smtptls (boolean)

Nó triển khai bằng cách sử dụng SMTP STARTTLS.

7

smtpssl (boolean)

Nó quản lý bằng kết nối SSL an toàn.

Hai phương thức sau có trong tham chiếu lớp MailSender như được chỉ định. Phương pháp đầu tiên,

classmethod from_settings(settings)

Nó kết hợp bằng cách sử dụng đối tượng cài đặt Scrapy. Nó chứa tham số sau:

settings (scrapy.settings.Settings object) - Nó được coi như máy thu e-mail.

Một phương pháp khác,

send(to, subject, body, cc = None, attachs = (), mimetype = 'text/plain', charset = None)

Bảng sau chứa các tham số của phương thức trên:

Sr.No Mô tả về Thông Số
1

to (list)

Nó đề cập đến người nhận email.

2

subject (str)

Nó chỉ định chủ đề của email.

3

cc (list)

Nó đề cập đến danh sách người nhận.

4

body (str)

Nó đề cập đến dữ liệu nội dung email.

5

attachs (iterable)

Nó đề cập đến tệp đính kèm của email, kiểu mimetype của tệp đính kèm và tên của tệp đính kèm.

6

mimetype (str)

Nó đại diện cho kiểu MIME của e-mail.

7

charset (str)

Nó chỉ định mã hóa ký tự được sử dụng cho nội dung email.

Cài đặt Thư

Các cài đặt sau đảm bảo rằng không cần viết bất kỳ mã nào, chúng ta có thể cấu hình e-mail bằng lớp MailSender trong dự án.

Sr.No Cài đặt & Mô tả Giá trị mặc định
1

MAIL_FROM

Nó đề cập đến email của người gửi để gửi email.

'scrapy @ localhost'
2

MAIL_HOST

Nó đề cập đến máy chủ lưu trữ SMTP được sử dụng để gửi email.

'localhost'
3

MAIL_PORT

Nó chỉ định cổng SMTP được sử dụng để gửi email.

25
4

MAIL_USER

Nó đề cập đến xác thực SMTP. Sẽ không có xác thực, nếu cài đặt này được đặt thành tắt.

không ai
5

MAIL_PASS

Nó cung cấp mật khẩu được sử dụng để xác thực SMTP.

không ai
6

MAIL_TLS

Nó cung cấp phương pháp nâng cấp kết nối không an toàn thành kết nối an toàn bằng SSL / TLS.

Sai
7

MAIL_SSL

Nó thực hiện kết nối bằng kết nối được mã hóa SSL.

Sai

Sự miêu tả

Bàn điều khiển Telnet là một trình bao Python chạy bên trong quy trình Scrapy và được sử dụng để kiểm tra và kiểm soát một quy trình chạy Scrapy.

Truy cập Bảng điều khiển Telnet

Bàn điều khiển telnet có thể được truy cập bằng lệnh sau:

telnet localhost 6023

Về cơ bản, bảng điều khiển telnet được liệt kê trong cổng TCP, được mô tả trong TELNETCONSOLE_PORT cài đặt.

Biến

Một số biến mặc định được cung cấp trong bảng sau được sử dụng làm phím tắt:

Sr.No Phím tắt & Mô tả
1

crawler

Điều này đề cập đến đối tượng Scrapy Crawler (scrapy.crawler.Crawler).

2

engine

Điều này đề cập đến thuộc tính Crawler.engine.

3

spider

Điều này đề cập đến con nhện đang hoạt động.

4

slot

Điều này đề cập đến khe động cơ.

5

extensions

Điều này đề cập đến thuộc tính Trình quản lý tiện ích mở rộng (Crawler.extensions).

6

stats

Điều này đề cập đến thuộc tính Bộ thu thập số liệu thống kê (Crawler.stats).

7

setting

Điều này đề cập đến thuộc tính cài đặt Scrapy đối tượng (Crawler.settings).

số 8

est

Điều này đề cập đến việc in một báo cáo về tình trạng động cơ.

9

prefs

Điều này đề cập đến bộ nhớ để gỡ lỗi.

10

p

Điều này đề cập đến một lối tắt đến hàm pprint.pprint .

11

hpy

Điều này đề cập đến gỡ lỗi bộ nhớ.

Ví dụ

Sau đây là một số ví dụ minh họa bằng cách sử dụng Telnet Console.

Tạm dừng, tiếp tục và dừng công cụ trị liệu

Để tạm dừng công cụ Scrapy, hãy sử dụng lệnh sau:

telnet localhost 6023
>>> engine.pause()
>>>

Để tiếp tục công cụ Scrapy, hãy sử dụng lệnh sau:

telnet localhost 6023
>>> engine.unpause()
>>>

Để dừng công cụ Scrapy, hãy sử dụng lệnh sau:

telnet localhost 6023
>>> engine.stop()
Connection closed by foreign host.

Xem trạng thái động cơ

Bàn điều khiển Telnet sử dụng est() phương pháp kiểm tra trạng thái của công cụ Scrapy như được hiển thị trong đoạn mã sau:

telnet localhost 6023
>>> est()
Execution engine status

time()-engine.start_time                        : 8.62972998619
engine.has_capacity()                           : False
len(engine.downloader.active)                   : 16
engine.scraper.is_idle()                        : False
engine.spider.name                              : followall
engine.spider_is_idle(engine.spider)            : False
engine.slot.closing                             : False
len(engine.slot.inprogress)                     : 16
len(engine.slot.scheduler.dqs or [])            : 0
len(engine.slot.scheduler.mqs)                  : 92
len(engine.scraper.slot.queue)                  : 0
len(engine.scraper.slot.active)                 : 0
engine.scraper.slot.active_size                 : 0
engine.scraper.slot.itemproc_size               : 0
engine.scraper.slot.needs_backout()             : False

Tín hiệu điều khiển Telnet

Bạn có thể sử dụng tín hiệu bảng điều khiển telnet để thêm, cập nhật hoặc xóa các biến trong không gian tên cục bộ telnet. Để thực hiện hành động này, bạn cần thêm telnet_vars dict trong trình xử lý của bạn.

scrapy.extensions.telnet.update_telnet_vars(telnet_vars)

Các thông số -

telnet_vars (dict)

Trong đó, dict là một từ điển chứa các biến telnet.

Cài đặt Telnet

Bảng sau đây cho thấy các cài đặt kiểm soát hành vi của Telnet Console:

Sr.No Cài đặt & Mô tả Giá trị mặc định
1

TELNETCONSOLE_PORT

Điều này đề cập đến phạm vi cổng cho bảng điều khiển telnet. Nếu nó được đặt thành không, thì cổng sẽ được gán động.

[6023, 6073]
2

TELNETCONSOLE_HOST

Điều này đề cập đến giao diện mà bảng điều khiển telnet sẽ lắng nghe.

'127.0.0.1'

Sự miêu tả

Trình thu thập thông tin web Scrapy đang chạy có thể được điều khiển thông qua JSON-RPC. Nó được kích hoạt bởi cài đặt JSONRPC_ENABLED. Dịch vụ này cung cấp quyền truy cập vào đối tượng trình thu thập thông tin chính thông qua giao thức JSON-RPC 2.0 . Điểm cuối để truy cập đối tượng trình thu thập thông tin là:

http://localhost:6080/crawler

Bảng sau đây chứa một số cài đặt hiển thị hoạt động của dịch vụ web:

Sr.No Cài đặt & Mô tả Giá trị mặc định
1

JSONRPC_ENABLED

Điều này đề cập đến boolean, quyết định dịch vụ web cùng với phần mở rộng của nó có được bật hay không.

Thật
2

JSONRPC_LOGFILE

Điều này đề cập đến tệp được sử dụng để ghi nhật ký các yêu cầu HTTP được thực hiện cho dịch vụ web. Nếu nó không được thiết lập, nhật ký Scrapy chuẩn sẽ được sử dụng.

không ai
3

JSONRPC_PORT

Điều này đề cập đến phạm vi cổng cho dịch vụ web. Nếu nó được đặt thành không, thì cổng sẽ được gán động.

[6080, 7030]
4

JSONRPC_HOST

Điều này đề cập đến giao diện mà dịch vụ web nên nghe.

'127.0.0.1'