Scrapy-spiders
スクレイピー-スパイダー
説明
Spiderは、Webサイトを介してリンクをたどり、ページから情報を抽出する方法を定義するクラスです。
スクレイピーのデフォルトのスパイダーは次のとおりです-
スクレイピースパイダー
それは他のすべてのクモが継承しなければならないクモです。 次のクラスがあります-
class scrapy.spiders.Spider
次の表は、scrapy.Spiderクラスのフィールドを示しています-
Sr.No | Field & Description |
---|---|
1 |
name それはあなたのクモの名前です。 |
2 |
allowed_domains これは、クモがクロールするドメインのリストです。 |
3 |
start_urls これは、スパイダーがクロールを開始する後のクロールのルートとなるURLのリストです。 |
4 |
custom_settings これらは、スパイダーを実行するときに、プロジェクト全体の設定から上書きされる設定です。 |
5 |
crawler これは、クモのインスタンスがバインドされているクローラーオブジェクトにリンクする属性です。 |
6 |
settings これらは、スパイダーを実行するための設定です。 |
7 |
logger これは、ログメッセージの送信に使用されるPythonロガーです。 |
8 |
from_crawler(crawler,*args,*kwargs)* これはクラスメソッドであり、スパイダーを作成します。 パラメータは次のとおりです-
|
9 |
start_requests() 特定のURLが指定されておらず、スパイダーがスクラップ用に開かれている場合、Scrapyは_start_requests()_メソッドを呼び出します。 |
10 |
make_requests_from_url(url) URLをリクエストに変換するために使用されるメソッドです。 |
11 |
parse(response) このメソッドは、応答を処理し、さらにURLに続くスクラップデータを返します。 |
12 |
log(message[,level,component]) これは、スパイダーロガーを介してログメッセージを送信するメソッドです。 |
13 |
closed(reason) このメソッドは、クモが閉じるときに呼び出されます。 |
スパイダー引数
スパイダー引数は、開始URLを指定するために使用され、次のようにcrawlコマンドと -a オプションを使用して渡されます-
scrapy crawl first_scrapy -a group = accessories
次のコードは、スパイダーが引数を受け取る方法を示しています-
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]
ジェネリックスパイダー
汎用スパイダーを使用して、スパイダーのサブクラスを作成できます。 彼らの目的は、特定のルールに基づいてウェブサイト上のすべてのリンクをたどり、すべてのページからデータを抽出することです。
次のスパイダーで使用される例では、次のフィールドを持つプロジェクトがあると仮定しましょう-
import scrapy
from scrapy.item import Item, Field
class First_scrapyItem(scrapy.Item):
product_title = Field()
product_link = Field()
product_description = Field()
クロールスパイダー
CrawlSpiderは、リンクをたどって複数のページを破棄する一連のルールを定義します。 次のクラスがあります-
class scrapy.spiders.CrawlSpider
以下はCrawlSpiderクラスの属性です-
規則
クローラーがリンクをたどる方法を定義するルールオブジェクトのリストです。
次の表は、CrawlSpiderクラスのルールを示しています-
Sr.No | Rule & Description |
---|---|
1 |
LinkExtractor クモがどのようにリンクをたどり、データを抽出するかを指定します。 |
2 |
callback 各ページがスクレイプされた後に呼び出されます。 |
3 |
follow リンクをたどり続けるかどうかを指定します。 |
parse_start_url(応答)
初期応答を解析できるようにすることで、アイテムまたはリクエストオブジェクトを返します。
注-解析関数はCrawlSpiderによってそのロジックを実装するために使用されるため、ルールの作成中に解析以外の解析関数の名前を変更してください。
スパイダーがdemoexample.comのホームページをクロールし、すべてのページ、リンク、および解析を_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
XMLフィードからスクレイピングし、ノードを反復処理するスパイダーの基本クラスです。 次のクラスがあります-
class scrapy.spiders.XMLFeedSpider
次の表は、イテレータとタグ名を設定するために使用されるクラス属性を示しています-
Sr.No | Attribute & Description |
---|---|
1 |
iterator 使用するイテレータを定義します。 iternodes、html、または_xml_のいずれかです。 デフォルトは_iternodes_です。 |
2 |
itertag 反復するノード名を含む文字列です。 |
3 |
namespaces _register_namespace()_メソッドを使用して名前空間を自動的に登録する(プレフィックス、uri)タプルのリストによって定義されます。 |
4 |
adapt_response(response) スパイダーミドルウェアから到着するとすぐに、スパイダーが解析を開始する前に、応答を受信して応答本文を変更します。 |
5 |
parse_node(response,selector) 指定されたタグ名に一致する各ノードに対して呼び出されると、応答とセレクターを受け取ります。 注-このメソッドをオーバーライドしないと、スパイダーは動作しません。 |
6 |
process_results(response,results) スパイダーから返された結果と応答のリストを返します。 |
CSVFeedSpider
各行を反復処理し、応答としてCSVファイルを受信し、_parse_row()_メソッドを呼び出します。 次のクラスがあります-
class scrapy.spiders.CSVFeedSpider
次の表は、CSVファイルに関して設定できるオプションを示しています-
Sr.No | Option & Description |
---|---|
1 |
delimiter 各フィールドのコンマ( '、')区切り文字を含む文字列です。 |
2 |
quotechar 各フィールドの引用符( '"')を含む文字列です。 |
3 |
headers これは、フィールドを抽出できるステートメントのリストです。 |
4 |
parse_row(response,row) 応答と各行とヘッダーのキーを受け取ります。 |
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
サイトマップSpider
Sitemapsの助けを借りてSitemapSpiderは、robots.txtからURLを見つけてWebサイトをクロールします。 次のクラスがあります-
class scrapy.spiders.SitemapSpider
次の表は、SitemapSpiderのフィールドを示しています-
Sr.No | Field & Description |
---|---|
1 |
sitemap_urls サイトマップを指すクロールするURLのリスト。 |
2 |
sitemap_rules タプル(正規表現、コールバック)のリストです。正規表現は正規表現であり、コールバックは正規表現に一致するURLを処理するために使用されます。 |
3 |
sitemap_follow これは、従うべきサイトマップの正規表現のリストです。 |
4 |
sitemap_alternate_links 単一のURLでたどる代替リンクを指定します。 |
SitemapSpiderの例
次のSitemapSpiderはすべての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は、コールバックでいくつかのURLを処理します-
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
次のコードは、URLに /sitemap_company があるrobots.txtのサイトマップを示しています-
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
次のコマンドに示すように、SitemapSpiderを他のURLと組み合わせることもできます。
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...