ここで使用Scrapy爬虫類のフレームワークのための準備ができているhttp://books.toscrape.com/クロールに関する書籍についての情報(クロールされた専用のウェブサイト)。
相关信息包括:书名、价格、评价等级、库存量、产品编码、评价数量。
最初にページを分析します。
ここに追加すると、通常、現在のブラウザはhtmlテキストを正規化するため、Chromeや他のブラウザに付属のXPathパスを使用すると、読み取りエラーが発生する可能性があります。
多くの場合、viewコマンドによってロードされるページは、ブラウザーを開いたときと同じですが、前者はScrapyクローラーによってダウンロードされたページ、後者はブラウザーによってダウンロードされたページですが、異なる場合があります。
ページ分析を実行するときは、viewコマンドを使用する方が信頼性が高くなります。
在命令提示符窗口输入
scrapy shell url
view(response)
然后就打开了Scrapy爬虫下载的页面,此时在F12开发者工具中看的路径就是原始路径。
ここでは、最初の本を分析の例として取り上げます。
最初に入力scrapy shell http://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html
このコマンドを実行した後、スクレイピーシェルはurlパラメーターを使用してRequestオブジェクトを作成し、それをScrapyエンジンに送信します。ページのダウンロードが完了すると、プログラムがScrapyターミナルに入り、この環境でいくつかの変数(オブジェクトと関数)が作成されます。ここでクロールコードをデバッグできます。
ステータスコードは200で、リクエストが成功したことを示します。
次に、view(response)
次に、ページが自動的に開きます。
次に、XPath HelperとF12を使用してページを分析します。
(XPath Helperのインストールチュートリアルは私の記事の補助ツール列にあります)
最初はタイトルです:
Scrapyターミナルでテストします。
extract()とextract_first()の違い:
extract()によって返されるすべてのデータはリストに格納されます。
extract_first()は、extract()の結果の最初の値である文字列を返します。
次は価格です:
次に、評価レベルが来ます。
正規表現を使用して文字列を削除しますstar-rating
。
次はインベントリです。
引き続きインベントリを抽出するために正規表現を使用します。
直接分析したXPathに従って、コンテンツを抽出できないことがわかります。tbodyタグを削除する必要があります。なぜですか?
ブラウザ自体がtbodyタグのコンテンツをテーブルに自動的に追加しますが、xpathでは不要であり(対応する情報を表すtbodyタグを削除してみてください)、xpathクエリを実行するときに削除する必要があります。
次に、製品コードがあります。
同様に、次のように抽出できます。
最後に、評価の数:
同様に、次のようにそれらを抽出できます。
ここまでは、本のページを分析してきましたが、次に、あるページにあるすべての本へのリンクと次のページへのリンクを取得する方法を考えてみましょう。
まず、ブックリストページをダウンロードするにはフェッチコマンドを使用して、コマンドを解析するためのビューでページを開く:
分析の後、すべての書籍へのリンクのページを次のように:
次に、次のページのリンクを分析します。
次に、LinkExtractorを使用してこれらのリンクを抽出します。
href内のリンクはサイトに関連しているため、直接取得されるのは絶対URLではなく、ステッチして計算する必要があります。
たとえば、catalog / page-2.htmlはタグのコンテンツであり、正しいアドレスはhttp://books.toscrape.com/catalogue/page-2.htmlです。
ページ内のすべての本の絶対リンクを抽出する方法を分析してみましょう。
次に、Scrapyターミナルを使用してテストします。
二重引用符を使用する場合、二重引用符を外側に、単一引用符を内側に、またはその逆を使用する場合の注意事項を次に示します。そうでない場合、エラーが報告されます:SyntaxError:invalid syntax
次に、Scrapyターミナルを使用して、次のページのリンクをテストします。
ここでは、これらのオブジェクトを詳細に分析します。
-
leはLinkExtractorオブジェクトで、セレクターとして機能し、選択ルールを定義します
-
linksは、leのextract_linksメソッドの呼び出しであり、現在のページ応答を渡し、leルールに従って現在のページ内のリンクを検索し、Linkオブジェクトのリストを返します。
-
links [0]はLinkオブジェクトです
-
リンク[0] .urlはオブジェクトの属性です。つまり、必要な絶対URLアドレスです(接続して計算する必要はありません)。
次に、Scrapyクローラープロジェクトの作成を開始します。
これはPycharmを使用して実装されます。まず、Pycharmで新しいプロジェクトMyScrapyを作成します。
次に、Pycharmのターミナルを開き、次のように入力しscrapy startproject books
てScrapyクローラープロジェクトを作成します。
次に、booksディレクトリーに入りscrapy genspider books_spider books.toscrape.com
、SpiderファイルとSpiderクラスを作成するために入力します。
Spiderを実装する前に、まず本の情報をカプセル化するItemクラスを定義し、以下のコードをitems.pyに追加します。
# 书籍项目
class BooksItem(scrapy.Item):
name = scrapy.Field() # 书名
price = scrapy.Field() # 价格
review_rating = scrapy.Field() # 评价等级
review_num = scrapy.Field() # 评价数量
upc = scrapy.Field() # 产品编码
stock = scrapy.Field() # 库存量
次に、クローラークラスに2つのページ解析関数を実装する必要があります。1つは各ページのページ解析関数で、もう1つは各ブックのページ解析関数です。books.pyを開きます。以前の分析によると、コードを次のように編集します。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from ..items import BooksItem # ..表示上级目录
class BooksSpider(scrapy.Spider):
name = 'books'
allowed_domains = ['books.toscrape.com']
start_urls = ['http://books.toscrape.com/']
# 每一页的页面解析函数
def parse(self, response):
# 提取当前页面所有书的url
le = LinkExtractor(restrict_xpaths='//article[@class="product_pod"]')
for link in le.extract_links(response):
yield scrapy.Request(url=link.url, callback=self.parse_book)
# 提取下一页的url
le = LinkExtractor(restrict_xpaths='//ul[@class="pager"]/li[@class="next"]/a')
links = le.extract_links(response)
if links:
next_url = links[0].url
yield scrapy.Request(url=next_url, callback=self.parse)
# 每一本书的页面解析函数
def parse_book(self, response):
book = BooksItem() # 将信息存入BooksItem对象
book['name'] = response.xpath('//div[@class="col-sm-6 product_main"]/h1/text()').extract_first()
book['price'] = response.xpath('//p[@class="price_color"]/text()').extract_first()
book['review_rating'] = response.xpath('//div[@class="col-sm-6 product_main"]/p[3]/@class') \
.re_first('star-rating ([A-Za-z]+)') # \是续行符
book['stock'] = response.xpath('//table[@class="table table-striped"]//tr[6]/td/text()').re_first('\((\d+) available\)')
book['upc'] = response.xpath('//table[@class="table table-striped"]//tr[1]/td/text()').extract_first()
book['review_num'] = response.xpath('//table[@class="table table-striped"]//tr[7]/td/text()').extract_first()
yield book
最適化の手順は次のとおりです。
次に、構成ファイルsettings.pyで、FEED_EXPORT_FIELDSを使用して列の順序を指定します。
FEED_EXPORT_FIELDS=['upc','name','price','stock','review_rating','review_num']
また、評価レベルフィールドの値は、One、Two、Threeなどの英語の単語です...アラビア数字に変更できます。以下は、アイテムパイプラインを実装して、単語を数値にマップします。BookPipelineをpipelines.pyに実装します。コードは次のとおりです。
class BooksPipeline(object):
review_rating_map = {
'One': 1,
'Two': 2,
'Three': 3,
'Four': 4,
'Five': 5,
}
def process_item(self,item,spider):
rating = item.get('review_rating')
if rating:
item['review_rating'] = self.review_rating_map[rating]
return item
次に、設定ファイルsettings.pyでBooksPipelineを有効にします。
ITEM_PIPELINES = {
'books.pipelines.BooksPipeline': 300,
} # books是 Scrapy爬虫项目的名字
最後に、クローラープロジェクト全体を実行します。
Pycharmターミナルに入るscrapy crawl books_spider -o books.csv --nolog
:
実行ログを表示しないようにするには、ここに-nologを追加します
この時点で、爬虫類プロジェクト全体が完了しています。
完全なソースコード:https : //github.com/Giyn/Spider